きっかけ
うちの回線は 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 でゲートウェイに送ります。
/data は UniFi OS の永続ストレージ領域なので、ここに置いておけば再起動後も消えません。
ただしトンネル設定自体はリセットされるので、後述の systemd で対処します。
環境変数を編集する
最低限埋めておく変数はこのあたりです。
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 する
確認する
再起動後も設定を維持する (systemd)
UniFi OS は再起動するとトンネルや iptables のルールをリセットしてしまいます。
systemd のサービスとして登録しておくことで、起動時に自動で apply されるようになります。
ここで一点ハマりがあって、UDR / UDM では systemd の unit ファイルは /data へのシンボリックリンクでは動きません。/etc/systemd/system/ に実体ファイルとして置く必要があります。
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 のアップデートでインターフェース名やファイアウォールのふるまいが変わる可能性もあるので、その点はご承知おきください。