IPv6 環境で WireGuard を使ってリモートアクセス VPN を実現できたのでまとめる。
やりたいこと
外出先から自宅内のサーバ (NAS) にリモートアクセスしたい。
我が家のネット回線は フレッツ + OCN を契約しており、IPv6 は普通に IPoE でインターネットに出ていきつつ IPv4 は OCN バーチャルコネクト (MAP-E) での IPIP6 トンネル経由という、最近よくありがちな構成となっている。
従来の PPPoE 接続であればグローバル IPv4 アドレスが1個は付くため LAN 内で VPN サーバを動かしてそこにポートフォワーディングをしてやれば簡単にリモートアクセスは実現できたものだったが、今回のように MAP-E を使っている場合はグローバル IP は他の利用者と共有なので利用できるポートが限られている 1 し、類似の IPIP6 技術である DS-Lite に至っては ISP 側で NAT するのでポートフォワーディングはできない。
なんとかしてこの IPoE 環境でリモートアクセスを実現できないものかと頭を悩ませていたが、無理に IPv4 で頑張らずに 普通に IPv6 でやればよいのでは...? と気づいた。2
作った構成
WireGuard が IPv6 に対応してそうな気配があったので、自宅に転がっていた Raspberry Pi に入れて動かしてみることにした。
ホームゲートウェイの設定
Raspberry Pi の IPv6 アドレスの 51820 ポート宛のパケットが通過できるように穴を開けておく。
サーバ (Raspberry Pi) 設定
WireGuard のインストールやキーペア生成などの説明は割愛。
まず sysctl で IPv6 パケットのフォワードを許可しておく。(sudo sysctl -p
で設定を反映させる)
net.ipv6.conf.all.forwarding = 1
設定ファイルはこんな感じ。
[Interface]
PrivateKey = ********
Address = fd00::1/64
ListenPort = 51820
PostUp = ip6tables -A FORWARD -i %i -s fd00::/64 -j ACCEPT; ip6tables -t nat -A POSTROUTING -s fd00::/64 -o e+ -j MASQUERADE
PostDown = ip6tables -D FORWARD -i %i -s fd00::/64 -j ACCEPT; ip6tables -t nat -D POSTROUTING -s fd00::/64 -o e+ -j MASQUERADE
[Peer]
PublicKey = ********
AllowedIPs = fd00::2/64
クライアント設定
iPhone に WireGuard アプリを入れて設定した。
[Interface]
PrivateKey = ********
Address = fd00::2/64
[Peer]
Endpoint = [X:X:X:X:Y:Y:Y:Y]:51820
PublicKey = ********
AllowedIPs = fd00::/64, X:X:X:X::/64
PersistentKeepalive = 25
動作確認
クライアント (iPhone) で WireGuard VPN を有効にした状態で Web ブラウザから http://[X:X:X:X:Z:Z:Z:Z]/ (NAS の IPv6 アドレス) にアクセスしたところ、NAS の管理画面が表示できた。めでたしめでたし。
まとめ
- クライアントから接続する際のエンドポイントを IPv6 アドレスにして、WireGuard のパケットがホームゲートウェイを通過できるように設定した
- トンネル内アドレスは IPv6 のユニークローカルアドレス
fd00::/64
3 にして、ピア毎に::1
::2
... と適当に連番で割り当てているだけ - クライアントから LAN 内の別のホストにアクセスするためには NAT する必要があったが、コマンドが
ip6tables
に変わっているだけで、やっていることは IPv4 のときと同様 4
あれ...? 意外と簡単にできてしまったな???
IPv4 over IPv6 で試行錯誤してたときは全然うまくいかなくて泣きそうだったのに、IPv6 でやったらこんなにすぐできてしまうとは...。
参考
- WireGuard で VPS と IPv6 over IPv4 | 暇言
- バイク野郎のひとりごと: V6プラスの IPv6 側を使って Wireguard VPN を接続する
- WireGuardのAllowed IPsの設定についての補足 | ネットワークとともに
- iptablesの仕組みを図解 - Carpe Diem
-
MAP-E で降ってくるグローバル IPv4 アドレスと利用可能ポートは実際はほぼ固定らしいので、IPv4 ポートフォワーディングはできないことはないっぽい ↩
-
フレッツの IPoE でも IPv6 アドレスは半固定なので変わる可能性はあるらしいということを作ったあとで知った。MAP-E で良かったのでは? ↩
-
IPv6 のユニークローカルアドレス (ULA) は IPv6 のプライベートアドレス的なやつ (という認識) ↩
-
IPv6 だし NAT しなくても動くかな? と思って試してみたが動かなかった。NAT 無しでフォワードしてもパケットは到達できるが、帰りがデフォルトゲートウェイに行ってしまって Raspberry Pi まで届かないっぽい? ↩