while True:
Skip to content
Go back

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

Updated:  at  01:15 PM

きっかけ

うちの回線は 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 linkip -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 のアップデートでインターフェース名やファイアウォールのふるまいが変わる可能性もあるので、その点はご承知おきください。



Next Post
Windows 11 で無理やりローカルアカウントを作った