注意書き
タイトルに”実現したかった”とあるように、この記事はWireGuardでのVPN構成の失敗例を紹介するものです。
この記事を読んでもタイトルの構成を実現できるわけではありません。
また、記事の作成者はネットワーク素人であり、手順の誤解や原因の考察に不正確な情報が含まれている可能性があります。
誤りがあった場合にはご指摘をいただけるととても嬉しいです。
実現したかったこと
WireGuardの使用例には、個人用途だと以下の二つがよく見られると思います。
- 固定IPを持たない環境で、VPS等にホストしたWireGuardを介してLANをインターネットに公開する
- WireGuardを介して自宅のインターネットを使用し、外出先からでも安全にインターネット接続できるようにする
この二つを組み合わせ、
固定IPを持たない自宅ルーターをVPSにホストしたWireguardを介して公開し、外出先での安全なインターネット接続を可能にする
これが実現したかった構成になります。
構成例
まず、構成の概要図を以下に示します。
次に、各端末で行った設定等を以下に記述します。なお、WireGuardで使用する秘密鍵、公開鍵の生成やファイアウォールの設定については省略します。
① VPS(Wireguard Server)
[Interface]
Address = 10.200.200.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = [SERVER PRIVATE KEY]
MTU = 1420
[Peer]
# 外出先のデバイス
PublicKey = [PUBLIC KEY]
AllowedIPs = 10.200.200.2/32
[Peer]
# Raspberry Pi 5
PublicKey = [PUBLIC KEY]
AllowedIPs = 10.200.200.3/32, 0.0.0.0/0
② 外出先で使用するデバイス
[Interface]
Address = 10.200.200.2/24
PrivateKey = [PRIVATE KEY]
MTU = 1420
[Peer]
PublicKey = [SERVER PUBLICKEY]
AllowedIPs = 0.0.0.0/0
Endpoint = my.vps.com:51820
③ Raspberry Pi 5
[Interface]
Address = 10.200.200.3/24
PrivateKey = [PRIVATE KEY]
MTU = 1420
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = [SERVER PUBLICKEY]
AllowedIPs = 0.0.0.0/0
Endpoint = my.vps.com:51820
以下の二点に注目してください。
- ① VPSのwg0.confのPeerの設定で、Raspberry pi 5に対するAllowedIPsに0.0.0.0/0が指定されている
- ③ Raspberry Pi 5のwg0.confで、iptablesによるIPマスカレードの設定を行っている
以上の構成でwg0を起動し、②外出先で使用するデバイス(10.200.200.2)からping 8.8.8.8を行ったところ、VPSが停止してしまいました。
原因
原因は①VPSのwg0.confのAllowedIPsの設定にあると考えられます。
該当ファイルでは、ピアであるRaspberry Pi 5に対してAllowed IPsに0.0.0.0/0を指定しています。Allowed IPsについて解説されているサイトを参考にさせていただくと、この設定は10.200.200.0/24ネットワーク内のいかなるデバイスからのトラフィックもRaspberry Pi 5に対して送信する、ものとして機能することになります。
つまり、②外出先で使用するデバイスのグローバルネットワークに対するトラフィックは全て③Raspberry Pi 5に送信され、IPマスカレードによってより上位のルーターを通ってインターネットに接続されることを期待したわけです。
しかし、 "全てのトラフィック"がRaspberry Pi 5に送信されるということは、もちろんRaspberry Pi 5から送信されたトラフィックも再びRaspberry Pi 5に送信される、ということでもあります。
こうして、ループの負荷に耐えられなくなったVPSサーバーが動作を停止し、上述した状況が引き起こされたと考えられます。
代替案
代替案としては以下に示す構成が考えられます。
- 自宅にWireGuardサーバーを設置し、上位ルーターへのIPマスカレードを行う
- VPNではなくトンネル型リバースプロキシ(Cloudflare Tunnel, ngrok等)を使用して自宅のWireGuardサーバーをインターネットに公開する
大変申し訳ないのですが、現時点ではこの代替案を実践できていないため、実現可能であるかは保証しかねます。実践しだい結果と具体的な方法を追記するつもりです。以下、参考になりそうな情報を記載しておきます。
-
Cloudflare Tunnelを介したWireGuardに関するredditの議論
- Cloudflare Tunnelの無料プランでは、WireGuardが使用するプロトコルであるUDPに対応していないため、実現できないと記載されています
-
Cloudflare WARPにて独自クライアントを構築する
- Cloudflareが展開するVPNサービス(厳密には完全なVPNではない)であるWARPを使用する方法です
- WARPは内部的にWireGuardを使用していますが、デフォルトでClientとして使用できるのは専用のWARP Clientのみとなっており、IPマスカレード等の設定を行うことができません
- このリンク先の記事では、WARP Clientを自前で用意したWireGuard Clientに置き換える方法が記載されています