清水理史の「イニシャルB」

IPv6でVPN接続できるWireGuard環境をRaspberry Piで構築! transixでも大丈夫!
2020年12月28日 06:00
本連載では、いくつかVPNソリューションの紹介を続けているが、今回はIPv6接続のWireGuard環境を取り上げる。
DS-LiteやMAP-EではIPv4が鬼門となるので、ならばIPv6で接続してしまおうという発想だ。
トンネル内部では使い慣れたIPv4を利用できるのと、WireGuardによる高速接続、場合によってはフレッツ網内での折り返し通信も視野に入れられる構想となる。テレワークで会社と社員宅をVPN接続する際などに応用できそうだ。
「VPNソリューション」記事一覧
DS-Liteでは、IPv4によるVPN接続は困難
テレワークで、社員宅から会社のNASへVPN接続する状況を想定してみよう。
この構想では、会社の回線がIPoE IPv6方式、中でもtransixサービスの場合、実現は途端に難しくなる。
具体的には、NASのVPN接続サービスがうまく動作しないケースが多い。一般的なNASの場合、搭載されているVPN接続サービスがIPv4での接続にしか対応していないことが多いのだ。利用できるポートが限定され、しかもISP側でNATが実施されるDS-Lite環境では、VPN接続ができない。
同じIPoE IPv6環境でもIPv4がMAP-Eであれば、NASが利用するVPNサービスのポートを自宅のHGWに割り当てられたポートの中から選択することでVPN接続が可能なケースもあるが、DS-Liteではこれもできない。
とはいえ、NASサービスの中でも、ウェブアクセスでNASの共有フォルダーを参照するリモートアクセスサービスであれば、NASベンダーが用意した中継サーバーを利用することでDS-LiteやMAP-Eでも接続が可能な場合もある。しかしこうした中継サーバーでは、今度はVPN接続サービスがサポートされていない可能性がある。
このため、DS-Liteの環境では、「IPv4でVPN」を実現するのが非常に困難な状況にあるというわけだ。
そこで今回は、実際にtransix環境を使って、IPv4ではなく、IPv6を使ってNASにVPN接続できるようにしてみた。
もちろん、IPv6でVPN接続するためには、クライアント側でもIPv6を使える必要がある。そのため、ホテルや公衆無線LANなど、IPv6がサポートされない環境からのVPN接続は困難だ。しかし、今回のように、テレワークで自宅から会社へVPN接続する場合なら、自宅側でIPv6が使えるケースも増えているため、現実的な構想と言える。
要するに、任意の場所からのリモートアクセスVPNというよりは、会社―自宅という決まった地点での接続という、準拠点間VPN接続というイメージに近い。接続環境は限られるが、どうしてもVPN接続が必要というケースの一例として参考になれば幸いだ。
Raspberry PiでWireGuardを使い、IPv6でのVPN接続を実現
それでは、今回の構成を紹介しよう。
利用するのは前述した通り、transixサービスを利用した「フレッツ 光ネクスト」の回線で、これを会社側と想定する。回線には、ホームゲートウェイ(以下、HGW)である「PR-500KI」と、Wi-Fiルーターの「Aterm WG2600HP3」が接続され、その配下にQNAPの2ベイNAS「TS-231+」を接続している構成だ。
一方、社員宅側として想定する環境の回線は「auひかり ホーム10ギガ」で、こちらはシンプルにHGWの「BL1000HW」へPCが接続している。
これを最終的には、次のようにする。
会社側に、Raspberry Pi 4で構築したVPNサーバーを設置し、WireGuradを利用して社員宅から社内のNASに対して接続可能にする。
この際、社員宅のPCからRaspberry PiまではIPv6でWireGuradによるVPN接続を確立し、VPN内部での通信には社内のNASに割り当てられているIPv4のアドレスを使ってアクセスできるようにする。
社員宅側の回線が会社側と同じフレッツ 光ネクストであれば、フレッツ網内の折り返し通信による低遅延かつ高速なVPN接続も可能になるはずだが、今回は設備の関係で、この構成でのテストはできなかった。
また、WireGuardサーバーにはRaspberry Pi 4を利用したが、社内に設置するNASが仮想マシンの稼働に対応するモデルであれば、そちらで仮想マシンを用いても構わない。今回はNASのメンテなども想定して機器を分けたことになる。
今回は、16GBのmicroSDへGUIなしのRaspberry Pi OS Liteをインストールした。VPNにしか利用しないのでGUIは不要だ。なお、WireGuardのインストール方法については割愛するが、こちらのウェブページを参考にコマンドを実行すれば、簡単にインストールできるはずだ。このほか、SSHの接続制限やファイアウォールも念のため設定しておいた。
WireGuardは、高速なVPNサービスとして知られているが、サーバー側もクライアント側も設定方法がほぼ同じで、比較的簡単なのも特徴だ。コマンドラインでの操作となるため、とっつきにくい印象があるかもしれないが、慣れてしまえばシンプルで扱いやすい。
前述した通り、今回はWireGuardの接続にIPv6を利用する。といっても特別な設定は必要ない。Raspberry Piを前述した社内側のネットワークへ接続すれば、自動的にeth0にIPv6アドレスが割り当てられる。
WireGuradは、このアドレスでVPN接続を受け付けるが、今回はトンネル内部のネットワークではIPv4を利用するため(NASにはIPv4アドレスでアクセスしたい)、WireGuard側の設定で、特にIPv6を意識する必要はない。
ちなみに、接続には公開鍵と秘密鍵を利用する。サーバー側はサーバー自身の秘密鍵とクライアントの公開鍵、クライアント側はサーバーの公開鍵と自分の秘密鍵をそれぞれ持ち合うことで、相手を認証して接続する。
このため、サーバー側で設定が終わったら、クライアント接続用の情報として、サーバーの公開鍵、クライアントの秘密鍵、設定ファイル(/etc/wireguard/wg0.conf)に設定したクライアント割り当て用のIPアドレスの3つを控えておく必要がある。
HGWとルーターのIPv6フィルターを通過するよう設定
Raspberry PiがWireGuardサーバーとして稼働したら、続いて外部からIPv6接続を受け付ける設定をする。
今回の構成では、HGWとAtermの両方でIPv6フィルターが設定されているため、このそれぞれでWireGuardの通信を許可するよう設定が必要だ。
なお、今回の構成では、社員宅から会社へのアクセスを想定しているため、送信元をピンポイントで指定してその通信のみを通過させる。IPv6は、不用意にフィルターを外すとインターネットから丸見えの状態になるので、特定の条件を満たす通信だけをピンポイントで通すように設定する必要がある。
いろいろな構成が考えられるが、今回の構成ではHGWとAtermの両方でフィルターがあるので、管理をシンプルにするために次のように設定した。HGWはWireGuardで利用するUDP 55222を通過。Atermは送信元までチェックして通過するようにした。
前述したように、今回の構成では試せなかったが、場合によってはフレッツ網内での折り返し通信も可能なため、それを想定して今回はHGW側では少し緩めの設定にしてある。このあたりは、環境や用途に合わせて変更して欲しい。
- IPv6ファイアウォール機能:有効
- IPv6セキュリティのレベル:標準
フィルター種別 | 許可 |
プロトコル | UDP |
宛先ポート | 55222 |
プロトコル | UDP |
送信元IPアドレス | クライアントのIPv6アドレス/128 |
送信元ポート番号 | 22555 |
宛先IPアドレス | Raspberry Piのeth0のIPv6アドレス/128 |
宛先ポート番号 | 55222 |
なお、クライアントにWindows 10を利用する場合、IPv6アドレスの送信元が一時IPv6アドレスとなる。このアドレスは再起動の度に変更されるので、以下のコマンドで一時IPv6アドレスをオフにすることで、半固定で指定できる。
netsh interface ipv6 set privacy state=disable
ただし、一時IPv6アドレスは、インターネット接続の際、半固定のIPv6アドレスを外部から隠すプライバシー保護の役割も持っている。このため、上記の設定を行うかどうかは慎重に検討すべきだ。
i.open.ad.jpでIPv6 DDNSを利用する
続いて、WireGuardサーバーに接続する際に、Endpointとして指定するホスト名を取得する。
これはさまざまな方法があるが、今回はソフトイーサが無償で提供している「i.open.ad.jp」を利用した。将来的に網内折り返しで利用したいという意向があることが大きいが、いろいろなプラットフォームからの利用方法が紹介されていたり、NASのNTPを利用してアドレスを更新できるなど、非常に細かな配慮がなされたサービスだ。
もともとはフレッツ網内での利用を想定したものだが、DDNS登録されたホスト名は、外部のDNSサービスからも参照可能となっている。このため今回のケースのように、auひかりなどの外部サービスからもホスト名を問題なく参照できる。
使い方は簡単で、i.open.ad.jpに、ホスト名とIPv6アドレス(Raspberry Piのeth0のIPv6アドレス)とメールアドレスを入力し、登録するだけでいい。
i.open.ad.jpにある機器ごとの設定例には、Raspberry Pi環境(Debian環境)でのDDNSのアドレス更新方法も紹介されているので、cronで更新するように設定しておこう。
Windowsから接続する
これで準備が整ったので、自宅を想定したauひかり回線を経由して接続してみる。
利用したクライアントはWindows 10だ。WireGuardのウェブサイトからクライアントをインストールし、「トンネルの追加」から「空のトンネルを追加」を選択して、手動で接続先の情報を設定する。
今回は以下の内容で設定したが、基本的にはサーバー側のコンフィグファイルと同じ書式で設定すればいい。WireGuardサーバー構成時にメモしたクライアントの秘密鍵とサーバーの公開鍵を間違えないように設定しよう。
[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxx(クライアント秘密鍵)
ListenPort = 22555
Address = 192.168.99.5/24
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxx(サーバー公開鍵)
AllowedIPs = 192.168.101.0/24
Endpoint = shimiz2.i.open.ad.jp:55222
ちなみに、今回はAtermのIPv6フィルターで送信元ポートを制限しているので、設定ファイルでも同じポートを「ListenPort」として設定しておかないと、フィルターではじかれて通信できないことになる。
また、「Peer」の「AllowedIPs」で通信可能な会社側のネットワークを指定する。今回は、NASが設置されているローカルネットワークのみにアクセスを許可する。このため、クライアントでは、通常のインターネット接続には自宅側の回線を利用し、NASなど会社のネットワークの接続にのみ、VPNを利用する。
いわゆるスプリットトンネルの構成で、クラウドサービスへのアクセスなどに会社の回線を利用しないことで、複数ユーザー接続時に会社側の回線の混雑を回避することができる。
設定が完了したら、後はつなぐだけだ。即座にトンネルが作成され、通信が可能になるので、「http://192.168.101.2:8080」などとしてNASのウェブページが表示できるかを確認したり、エクスプローラーから「\\192.168.101.2」などと指定して共有フォルダーにアクセスできるかを確認すればいい。
ちなみに、筆者宅の環境では、iPerf3による計測で224Mbpsと、インターネット経由ながら高速な速度で通信できていた。PCからNASへのファイルコピーでも13.9MB/sの速度が実現できており、ストレスなく利用できる印象だ。
クライアント側にIPv6が必要だがモバイル回線でも接続OK
以上、WireGuardを利用したIPv6によるVPN接続を試してみたが、この構成は比較的簡単に構築可能ながら、かなり高速で実用的な印象だ。
欠点はクライアント側にもIPv6が必要なことだが、筆者宅でのテストでは、auの4G環境でIPv6アドレスが利用可能となっており、iPhoneからも問題なく接続することができた。環境次第だが、モバイル利用にも対応できそうだ。
理想は海外メーカーのルーターやNASがIPv6に完全対応し、WireGuardなども組み込まれることだが、おそらくもう少し時間がかかるだろう。現状は、使える環境をフル活用して、ユーザーの側で工夫していくしかなさそうだ。