Skip to content
log(): never
Go back

Ubiquiti UniFi Gateway で v6プラス固定IP を使う (UniFi + IPIP6トンネル)

Updated:
目次
  1. きっかけ
  2. どういう構成か
  3. UniFi UI の設定
  4. セットアップ
  5. ファイルをゲートウェイに転送する
  6. 環境変数を編集する
  7. apply する
  8. 確認する
  9. 再起動後も設定を維持する (systemd)
  10. Watchdog について
  11. UniFi UI に表示される WAN IP について
  12. おわりに

きっかけ

うちの回線は v6プラス の固定 IPv4 (/32) なんですが、Ubiquiti の UniFi Dream Machine / Dream Router (UDM/UDR) でそのまま使おうとするとけっこう詰まります。

UniFi の UI で WAN の接続方式を MAP-E / v6plus に設定すると、UniFi が自前で ip6tnl1 というトンネルと table 201 のポリシールーティングルールを作成してしまって、カスタムのトンネルと競合してしまうんです。

ということで、スクリプトで IPIP6 トンネルを自前で張って、固定 IPv4 で出ていく構成を作りました。

コードは GitHub で公開しています。

NadjaSenpai/unifi-v6plus-static-ip

どういう構成か

やっていることの概要はこんな感じです。

  • ISP の BR (Border Relay) に向けて ipip6 トンネル (IPv4-in-IPv6) を張る
  • 固定 IPv4 /32 をトンネルインターフェースに割り当てる
  • LAN からのフォワードトラフィックを専用のルーティングテーブルに流す
  • ネイティブ IPv6 はそのまま維持する

ネイティブ IPv6 を壊さないために、トンネルローカルの IPv6 アドレスは WAN に /128 で追加しています。
/64 で追加すると IPv6 のソースアドレス選択が狂って、ネイティブ IPv6 が動かなくなることがあります。

UniFi UI の設定

WAN 側は MAP-E ではなく DHCPv4 + DHCPv6 にします。
これが地味に重要です。

UniFi Network → Settings → Internet で WAN を編集して、IPv4 Connection を DHCPv4、IPv6 Connection を DHCPv6 に設定します。

あわせて Settings → Networks で LAN ネットワークを開いて、IPv6 の Interface Type を Prefix Delegation に設定しておきます。

UniFi に MAP-E を設定させてしまうと競合トンネルが作られるので、トンネルの管理はスクリプトに任せる、というかたちです。

セットアップ

ファイルをゲートウェイに転送する

PC から SCP でゲートウェイに送ります。

scp scripts/v6plus-static-ip-iif.sh root@192.168.1.1:/data/v6plus-static-ip-iif.sh
scp scripts/v6plus-watch.sh root@192.168.1.1:/data/v6plus-watch.sh
scp scripts/v6plus-diag.sh root@192.168.1.1:/data/v6plus-diag.sh
scp config/v6plus.env.example root@192.168.1.1:/data/v6plus.env

/data は UniFi OS の永続ストレージ領域なので、ここに置いておけば再起動後も消えません。
ただしトンネル設定自体はリセットされるので、後述の systemd で対処します。

環境変数を編集する

ssh root@192.168.1.1
vi /data/v6plus.env

最低限埋めておく変数はこのあたりです。

  • WAN_IF
    • WAN インターフェース名
  • LAN_IF
    • たいてい br0
  • LAN_CIDR
    • 例: 192.168.1.0/24
  • STATIC_V4
    • ISP から割り当てられた固定 IPv4
  • PROVIDER_ASSIGNED_LOCAL_V6
    • トンネルローカル IPv6 (WAN に /128 で追加される)
  • BR_V6
    • BRの IPv6 アドレス
  • TUN_IF
    • 例: v6plus0
  • TUN_MTU, MSS
    • MTU / MSS 値
  • ROUTE_TABLE, RULE_PREF
    • ルーティングテーブル番号

インターフェース名は ip link や ip -6 addr で確認できます。

apply する

chmod +x /data/v6plus-static-ip-iif.sh /data/v6plus-watch.sh /data/v6plus-diag.sh
ENV_FILE=/data/v6plus.env /data/v6plus-static-ip-iif.sh apply

確認する

# ゲートウェイから: 固定 IPv4 で出ているか確認
curl -4 -s --interface v6plus0 https://api.ipify.org ; echo 
# LAN クライアントから
curl -4 -s https://api.ipify.org ; echo 
# IPv6 が壊れていないか確認 
url -6 -s https://api6.ipify.org ; echo

再起動後も設定を維持する (systemd)

UniFi OS は再起動するとトンネルや iptables のルールをリセットしてしまいます。
systemd のサービスとして登録しておくことで、起動時に自動で apply されるようになります。

ここで一点ハマりがあって、UDR / UDM では systemd の unit ファイルは /data へのシンボリックリンクでは動きません。
/etc/systemd/system/ に実体ファイルとして置く必要があります。

scp systemd/v6plus-static-ip.service root@192.168.1.1:/etc/systemd/system/
scp systemd/v6plus-watch.service root@192.168.1.1:/etc/systemd/system/

ssh root@192.168.1.1
systemctl daemon-reload
systemctl enable v6plus-static-ip.service v6plus-watch.service
systemctl start v6plus-static-ip.service v6plus-watch.service

Watchdog について

v6plus-watch.sh は systemd サービスとして常駐していて、主に 3 つのことをやっています。

SNAT ルールの監視。 UniFi は WiFi 設定の変更などをトリガーに SNAT ルールを消してしまうことがあります。これを検知して自動で re-apply します。

競合ルートの削除。 UniFi が作る table 201 / ip6tnl1 のポリシールーティングルールを定期的に除去します。

dpinger のハイジャック。 UniFi の WAN ヘルスチェックプロセス (dpinger) を v6plus0 に向け直して、Site Manager からゲートウェイがオンラインとして見えるようにします。

ただ、これをやっても UI 上の "Internet Down" 表示は消えません。
dpinger のハイジャックで多少マシになる場合もありますが、完全には解決できていないです。
根本的な対処はまだできていないので、UI の表示は気にしないことにしています。

UniFi UI に表示される WAN IP について

UniFi UI の WAN IP には 192.0.0.2 (DS-Lite の CGNAT アドレス) が表示されます。
これは仕様で、正常な動作です。
実際の出口 IP はちゃんと固定 IPv4 になっているので、curl -4 -s --interface v6plus0 https://api.ipify.org で確認してみてください。

おわりに

このスクリプトは自分の UDR7 で動作確認したものですが、現在は固定 IP プランを解約してしまったので、アクティブにメンテする状況ではないです。
同じ構成で困っている方の参考になれば、という感じで公開しています。


UniFi OS や Network のアップデートでインターフェース名やファイアウォールのふるまいが変わる可能性もあるので、その点はご承知おきください。


Share this post:

Previous Post
入院してました
Next Post
転職します