ipv6のNAT転送で、NTTフレッツ倶楽部にログインできたらいいな。
LAN内部にグローバルのv6 アドレスを割り当てたくない。
IPv6グローバルを割り当てるとフォールバックでイラッとする。
WindowsにULAを割当て、ルーターからNATしてv6通信をすることにした。
フォールバックさせたくない、でもフレッツ網内と通信はしたい(フレッツClubログイン回線認証はしたい)というレアケースに対応した。
準備した環境
最初はこのような構成。
これにv6をユニークローカルアドレスを追加していく
windows --- ルーター間
windows とルーターの間は fd03:ac7f:3852:67bb::/64 でネットワークしている。
windows は、 fd03:ac7f:3852:67bb::3
ルーターは、 fd03:ac7f:3852:67bb::1
IPv6をそれぞれに、割り当てて、接続することにする。
window にIPアドレスを割り当てる。
netsh interface ipv6 add address eth01 fd03:ac7f:3852:67bb::3/64
ちなみに、削除する場合は
netsh interface ipv6 del address eth01 fd03:ac7f:3852:67bb::3
追加時は、プレフィックスがついていても問題ないが、削除時はプレフィックスがあると動かない。
設定からやる場合。
確認方法
netsh interface ipv6 show addresses
Windows側から、ルーターをデフォルトGWにする。
netsh interface ipv6 add route ::/0 eth01 fd03:ac7f:3852:67bb::1
ルーター内部動作
ルーターでは、WAN(eth1) / LAN ( eth0 )を定義している
ルータにIPを追加
ルーターに v6 アドレスを割り当てる
今回使ってるルータはLinuxなので、ipコマンドを使って追加する。
nic=eth0 ip addr add fd03:ac7f:3852:67bb::1/64 dev $nic
Linuxではnic は br-lan とか eth0 とかenp3s0とか、アレコレと名前が変わるはず。
疎通を確認する。
Windows→ルータ
PS C:\WINDOWS\system32> ping fd03:ac7f:3852:67bb::1
WSL → ルータ
takuya@WSL:~$ ping6 fd03:ac7f:3852:67bb::1
ルータ → Windows
root@OpenWrt:~# ping fd03:ac7f:3852:67bb::3
疎通を確認ができたら、サブネットとv6アドレスは大丈夫。v6アドレスは長いので一瞥してわからないのでたまに間違えていたりする。v6では別の視点から疎通確認が大事。
ルーター側で、LAN→WANのv6 をNATする。
サンプルは、default allow のネットワークなので-A
にしている。Default Deny のネットワークであれば、-I
にしてルール先頭に加えること。
LAN_IF=eth0 WAN_IF=eth1 ip6tables -A FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT ip6tables -A FORWARD -i $WAN_IF -o $LAN_IF -j ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED ip6tables -t nat -A POSTROUTING -o $WAN_IF -d ::/0 -j MASQUERADE
IPv6のNATは最近の ip6tables でサポートされている。 「IPv6にはNATがない」なんて昔話なんですね。
ルーター側で、フレッツへの経路を追加する。
たとえば、フレッツ倶楽部の経路を作成し、Windowsからフレッツログインができるようにする。
ルーターの経路を作る。
ゲートウェイのアドレスは fe80 のやつでいい。
WAN_IF=eth1 GW=$([[ $(ip neigh show dev $WAN_IF ) =~ (fe80[0-9a-f:]+) ]] ; echo ${BASH_REMATCH}) ip route add default via $GW dev eth1 metric 1024 pref medium
v6ではゲートウェイをneigh で示されたfe08アドレス宛に投げつけておけばいいので便利だ。
WindowsがNATでv6グローバルと通信できる
NAT通信できるので、Windowsがグローバルv6 アドレスをもたなくても、NATでv6グローバルと通信ができる。
メリット
- 冒頭にも書いたが、NATすることで、V6のGUAを割当しなくていい。
- グローバルなv6アドレスがなくULAだけだと、フレッツ閉域網フォールバックが発生しなくなる。
- v6の外部との通信を、ルーターの経路表でも制御できるようになる。
- v6のあれこれ、特に近隣探索を覚えなくていい。
v6アドレスでNATができると、「フレッツ固有」のグローバルIPに縛られずに済む。 VPN経由で通信しても接続先の拠点のグローバルなv6アドレスで通信ができるようになる。 たとえば、フレッツ回線認証のようなv6アドレス認証は、接続先のv6アドレスで認証される。
そのため、IPアドレス範囲でのファイアウォールが記述しやすくなる。
NTT のフォールバック問題
https://www.geekpage.jp/blog/?id=2012/3/28/1
NGNのv6フレッツは、グローバルなアドレスをRA・DHCPv6してくるので、WindowsやiOSはv6通信を試みる。 v6 接続が失敗してはじめて4v接続が開始される。つまり、初回接続が極めて遅い問題がある。
ちょっと面倒な問題なので、v6をストップして運用するかIPoEを申し込むのが手っ取り早い解決策である。
v6網内通信をしたい
v6をオフにして運用していたとしても、v6網内折返しは使いたい。
あれこれ考えてみて、NATゲートウェイにすることにした。
v6でNATなどと思うんだけど、壊れたv6へ出ていくことを考えればGUAを割り振って無ければいいんじゃないかと。
フレッツclub 西日本と通信するには
西日本の場合、つぎのアドレスと通信できれば回線認証が通る。
2001:a7ff:ff63:1::a 2001:a7ff:ff47:101::1
次の経路を、以下のようにNATルーターの経路表へ追記しておくと、どこからでもNTT西日本フレッツ・クラブへログインができる。
WAN_IF=eth1 GW=$([[ $(ip neigh show dev $WAN_IF ) =~ (fe80[0-9a-f:]+) ]] ; echo ${BASH_REMATCH}) ## ip -6 route add from ::/0 to 2001:a7ff:ff63:1::a via $GW dev eth1 ip -6 route add from ::/0 to 2001:a7ff:ff47:101::1 via $GW dev eth1
ULAでNATする例として、網内折返しのサンプルを使いづらいのでフレッツの回線認証を例とした。NATができるといういいサンプルですね。
DNSホストの解決を上書きする。などAAAAの解決を図る必要がある。
www.flets-west.jp 2001:a7ff:ff47:101::1 aaaa
Adguard でv6フォールバックを防いでるときなど、このあたりを注意しておく
2021-08-17
修正
2023-04-21 追加
openwrt が iptables から nft に変わったので、そのままでは動かなくなってる。
以下のように一旦 translate してから追加する。
ip6tables-translate -A FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT ip6tables-translate -A FORWARD -i $WAN_IF -o $LAN_IF -j ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED ip6tables-translate -t nat -A POSTROUTING -o $WAN_IF -d ::/0 -j MASQUERADE
または、ii6tables で追加してから再起動する
ip6tables -I FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT ip6tables -I FORWARD -i $WAN_IF -o $LAN_IF -j ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED ip6tables -t nat -A POSTROUTING -o $WAN_IF -d ::/0 -j MASQUERADE /etc/init.d/firewall restart
なぜか、理由はまだ調べてないので分からないが、再起動すると初期化されず、iptablesで追加したものがnftablesに変換されるようだ。
2023-07-15 追記
NATして接続するようにした。
(fe80 が届かないので調べたら、 use default gatway が動いていて fe80 が何処か別のネットワークに流れていたぜ)