Softether VPN Client と IPv6 覚書です.
いつもの通り結論から書くと,
Softether VPN Client では, IPv6 のトンネリングは無効が無難
だとと思います.
なぜか?
Windows だと無効にしなくても問題は生じないんですが,Linux だと問題が生じます.原因は恐らくなんですが,挙動から見る限り以下の通りだと思います.
VPN Client と VPN Server の IPv6 アドレスを
- VPN Client: 2400::1
- VPN Server: 2401::1
とします.VPN 接続前は VPN Client から VPN Server への通信はデフォルトゲートに渡されることに注意してください.
VPN Client から VPN Server にVPN接続すると対応するインターフェースにIアドレスが割り当てられますが,この割り当てられるアドレスは,一般的な自宅ネットワークだと 2401::100 のようなアドレスです.つまり,VPN Server と同じアドレス空間のものが割り当てられます.ここが IPv4 の場合と大きく違う.
VPN Client から見ると,アドレス 2401::100 を持つインターフェースが新たに出来る訳ですが,VPN Server 2401::1 はそのすぐ側にあります.結果 VPN Client は VPN Server 宛の通信を 2401::100 のインターフェースに渡すことになります.つまりこの時点でVPN接続が切断されてしまっています.だから問題が生じる.
実際そうなのかを確かめるには,VPN 接続後も VPN Clinet から VPN Server への通信が デフォルトゲートに渡されるようルーティングを行って,問題なく通信できるか確かめてみれば良いし,実際に以下のように確かめることができます.
まず,VPN接続後の VPN Clinet の IPv6 の経路を以下のように確かめます.ここで,
- vpn_se0: VPN用のインターフェース名
- 2400:4000:4000:1100::/64: VPN Client の所属するネットワーク
- 2400:4000:2000:22::/64: VPN Server の所属するネットワーク
- 2400:4000:2000:22::1: VPN Server のアドレス
です.
$ ip -6 route show ::1 dev lo proto kernel metric 256 pref medium 2400:4000:4000:1100::/64 dev wlp2s0 proto ra metric 600 pref medium 2400:4000:2000:2200::/64 dev vpn_se0 proto ra metric 450 pref medium fe80::/64 dev vpn_se0 proto kernel metric 1024 pref medium fe80::/64 dev wlp2s0 proto kernel metric 1024 pref medium default via fe80::1111:1111:1111:1111 dev wlp2s0 proto ra metric 600 pref medium
上を見ると 2400:4000:2000:2200::/64 のメトリック値が450です.だから,より高いメトリック値で VPN Server への経路をデフォルトゲートを通るよう設定すれば良い訳ですが,これは以下のようにすればできます.
$ sudo ip -6 route add 2400:4000:2000:2200::1/128 via fe80::1111:1111:1111:1111 dev wlp2s0 proto ra metric 300
そして実際上の通りやると,問題なく VPN 接続が継続されることを確かめることができます.
IPv6 のトンネリング無効を推奨するのはなぜ?
経路情報を適当に追加すればきちんと VPN 接続が維持されることがわかりましたが,冒頭で示した対策はこれとは違います.より強い
IPv6 のトンネリング自体を無効化せよ
としました.なぜかと言うと,
IPv6 のトンネリングを行うメリットが(少なくともいまのところは)ない
ことがほとんどだと思うからです.
よほどの理由がない限り,IPv6 のアドレスしか割り当てられていないサーバーがあるなんて状況は考えられません.もしあったとしても,割り当てられているアドレスはグローバルアドレスが普通だと思うので,この場合は素直にファイヤウォールの設定を当該アドレスへの通信を許可するものに変更する方が良いと思います.IPv6 アドレスのトンネリングがどうしても必要なのは IP アドレスの偽装(と言うか,通信元の地域を誤魔化す)くらいじゃないでしょうか.
また,手間の問題もあります.
前節の最後に示した対策を実装するのはそれなりに手間がかかりますし,必ずクライアントごとに設定する必要があります(多分).しかし,IPv6 のトンネリングを無効化するだけならサーバー側で一括でできますし,クライアント側で行う場合もほぼワンライナーで行えます.
IPv6 のトンネリング無効化方法
サーバー側で行う
IPv6 のトンネリング無効化をサーバー側で行うには,仮想ハブの設定画面から,
- 「仮想 HUB のプロパティ」を選択
- 「仮想 HUB 拡張オプションの編集」を選択
- 「FilterIPv6」の設定値を「1」に設定
するだけです.
Windows クライアントで行う
Windows クライアントで無効化する場合は,
- 「設定」を選択
- 「ネットワークとインターネット」を選択
- 「ネットワークの詳細設定」を選択
- 「関連設定」の「ネットワーク アダプター オプションの詳細」を選択してVPN Client に対応するアダプターを右クリック
- 「プロパティ」を選択
- 「インターネット プロトコル バージョン6」のチェックを外す
となります.VPN Client の設定画面からではないことに注意してください.
Linux クライアントで行う
以下の通りワンライナーです.ただし,vpn_se0 は Softether VPN により作られる仮想インターフェース名です.
$ sudo nmcli connection modify vpn_se0 ipv6.method "disable"
なお,元に戻したい場合は,
$ sudo nmcli connection modify vpn_se0 ipv6.method "auto"
です.
以上!