2023.11.12追記
現在の最新WSLではブリッジモードやミラーモードというネットワークモードが追加されているのでIPv6を使いたい場合にはそちらをご利用ください。
はじめに
「WSL2をIPv6ネットワークに接続する」ではDHCPv6-PDでプレフィクス委譲をうけて、「WSL2をIPv6ネットワークにND Proxyで接続する/Hyper-Vで???」ではND Proxyを使ってIPv6ネットワークに接続しました。
ND Proxyを試した際は比較的簡単に実現できたのですが、WSL側のアドレスを渡して経路を設定するかndppdをコンパイルしてつかうかの二択がハードルを上げてしまって勧めづらい結果となってしましました。そもそも、コンパクトなOSにいくつか仕込みを入れてオレオレディストリを作るのであれば最初からルータ特化型のディストリを使おうと思いなおして今回はVyOSを使って環境を構築します。
VyOSとは
VyOSというのはDebianをベースにオープンソースを組み合わせて専用機のルータっぽい操作性を実現した特化型のディストリです。基本的にはLTSリリースとして有償サポート付きで販売されているのですが、ローリングリリース版は無償でダウンロードできます。オフィシャルサイトの取引先に有名どころの企業が並んでいるように著名なクラウドサービスでも提供されています。筆者もクラウドネットワークをVPNでつなぎ合わせるのに使っていますが、数年間ノートラブルで稼働しています。
今回は執筆時点で最新のvyos-1.4-rolling-202110020217-amd64.isoを使います。
適宜、サイトより入手してください。
VyOSのインストール
前回同様にHyper-Vマネージャからインストールを行います。
Hyper-Vマネージャーで仮想スイッチを一つ作成します。
仮想スイッチマネージャーから「外部」を選択して仮想スイッチを作成します。名前は「External」とでもしておいてください。既に存在するものがあればそれを使ってください。
仮想マシンを作成します
普通に作成するのですが、以下のような感じで作成してください
- 第2世代
- 起動メモリ 1GB (動的メモリを使用)
- ネットワーク接続 External
- 仮想ハードディスク 2GB
- ブートCD/DVD 先ほどダウンロードしたVyOSファイル
作成後、仮想マシンの設定から
- ネットワーク接続を
Default Switch
->External
に変更する - ハードウェアの追加 ネットワークアダプター WSL
- セキュリティ セキュアブートを「無効」にする
通常はDefault Switch
になっていると思いますが、これを先ほどのExternal
に変更します。
次に「ハードウェアの追加」から、ネットワークアダプターを追加します。追加するスイッチはWSL
です。
セキュアブートが有効になっているとISOから起動できないので無効にします
これで、eth0 が External, eth0 が WSL に接続されます。
仮想ハードディスクはVyOSの要求が最低 2000MBなのでこれ以下に出来ませんが、仮想ハードディスク自体の物理サイズも800MBに収まっています。
VyOSをインストール
作成した仮想マシンを起動するとライブイメージで起動してくるのでログインしてインストールします。
起動すると、ログインして、コマンドラインでインストールするのですが、ここはすこし端折らせていただきます。
他の方のドキュメントですが、こちらのvyos操作メモ(1)を参考にしていただくのが非常にわかりやすいと思います。とりあえず、インストールだけ行ってください。必要であればキーボード配列も変更した方が良いとおもいますが、どうやら先に上げたバージョンではキーボードの変更がうまく機能しないようです。
VyOSに設定していく
VyOSでND proxyを設定しようとしたのですが、見つけられませんでした。ndppdはインストールされているのでVyOSのコマンド体系ではなく、設定ファイルを直接編集して起動させればよいのかもしれませんが、今回はそっとしておきます。ND ProxyはないもののNAT66
がサポートされているようなので、こちらを使ってみます。
インストールが終わると、仮想HDDから起動します。インストール時に設定したパスワードを入力してログインしてください。
先の記事にあるように、まず編集モードへ入ります。
configure
インタフェースを確認したところ、IPv6アドレスがついていなかったので、まずそこから。
interfaces ethernet eth0 ipv6 address autoconf
interfaces ethernet eth1 ipv6 address 2001:db8::/64
nat66 source rule 1000 outbound-interface eth0
nat66 source rule 1000 translation address masquerade
service router-advert interface eth1 prefix 2001:db8::/64
commit
save
1行目がIPv6アドレスの自動設定です。autoconfにするとRAを受け取って自動構成します。
2行目はeth1に設定するアドレスを直書きします。2001:db8::/64
はドキュメント用のアドレスなので適宜書き換えます。ただ、fd00::/64などローカルアドレスをつけてしまうと、通信自体はできるのですが、IPv4よりも優先度が下がるようなので、使わなさそうなGUAを設定するのが良いかもしれません。ルーティング情報が流れだすわけではないので最悪でもそのプレフィクスを使っているサービス(があれば)にアクセスできなくなるだけです。
3,4行目がNAT66
の設定です。eth0から出ていく際にNATがかかります。masqueradeにしているので、家庭用ルータのいわゆるNATのような挙動です。必要ならポートマップすれば外部からWSLへのアクセスもできそうですね。
最後に、ここも2行目と同じプレフィクスに変更して設定するのですが、NATの内側として決めたプレフィクスをeth1に広告します。
commit で入力内容を確定して、saveで設定ファイルに書き出します。
設定は以上です。
実際試すにはexit
で編集モードを抜けて、reset all
でサービスを再起動します。
exit
reset all
VyOS自体を再起動しても起動すると、先ほどの設定で動き始めます。WSL仮想スイッチに接続したデバイスにRAが降ってきて、NAT66経由で物理ネットワークや外部のノードと通信できるようになったはずです。
普段使いにするには
以上でVyOSのNAT66 BOXが完成したので、普段使うときにはこれを起動すれば WSL2からIPv6ネットワークへと通信が可能になります。注意点は、WSL2を一度起動させてWSL仮想スイッチが作られてから起動することだけです。3つの方法でIPv6ネットワークに接続してみましたがこれが一番簡単でしたね。
出先での通信であればNATの内側に隠れている方が都合が良いこともあるでしょう。また、ピースはそろっているのでVyOSを使ってもND Proxyは可能なはずです。いずれにせよ、WSL2をIPv6ネットワークにND Proxyで接続すると同じことをしようとすると/etc/radvd.conf を編集してからradvdを起動する必要があるので、VyOS起動後にシェルスクリプトを走らせる必要があります。このあたりもベースがDebianなのでどうにでもなるでしょう。
最後に
選択肢を探していたらあまり考えていなかったNAT66でのIPv6接続が実現できてしまいました。NATよりも相互に接続したい気はしますが、クライアントPCであることを考えるとアクセスの方向は圧倒的に偏っているはずなのでNATでも困ることは少ないでしょう。かえって都合の良いことも多いのでこういう選択肢があっても良いのではないでしょうか?