WireGuardのAllowed IPsの設定についての補足

前回、DD-WRT上でWireGuardトンネルを有効にする記事を書きました。

OpenVPNからWireguardに乗り換え

このなかで「Allowed IPs」の設定がいまいち理解できていなかったのですが、CodeBlue 2016で開発者の Jason A. Donenfeld さんが発表していたスライドに説明がありました。

ここでのスライド8から10にかけて触れられているのですが、

  • トンネル経由での送信時、ルーティングテーブルより送出先インターフェースとしてWireGuardトンネルインターフェースに送信されたパケットは、Allowed IPsに記載されたピアを宛先として選択する。
  • トンネル経由での受信時、受信したパケットを復号して出てきたIPパケットをチェックして、そのパケットの送信元IPアドレスがAllowed IPsに記載されており、かつ復号前のパケットの送信元が該当のピアであることが確認できた場合に受信する。

という動きだということです。「送信時と受信時でAllowed IPsの意味が変わる?」というのがいまいち納得できずにいたのですが、たまたま Jason さんに直接尋ねるチャンスがあったので聞いてみたところ以下のような回答をもらえました。

AllowedIPs always applies to the inner-packet, before encryption/after decryption. When receiving, AllowedIPs is an ACL for the decrypted packet. When sending, AllowedIPs is a routing table for the not-yet encrypted packet.

前述の通り、「Allowed IPsは”暗号化されていないパケット“に対して適用される。受信時は復号後のパケットのACL(受信可否判断)として、送信時は暗号化前のパケットの宛先ピア決定用としてルーティングテーブルのように動く。」ということで間違いないです。

つまりこういうことです。

送信時

クライアント観点

クライアントのように「宛先(ピア)が1つしかない」場合、“Allowed IPs”を”0.0.0.0/0″とすると「すべてのトラフィックをWireGuardトンネルを経由する」ように指定することになります。例えばインターネット向けのトラフィックも、LAN上のサーバへのアクセスも、全てWireGuardトンネル(VPN)を通るということです。逆に言うと「WireGuardトンネルのピアの帯域を無駄に使う」ことにもなるわけです。

となると、クライアント側のAllowed IPsは

  • インターネットアクセスも含めすべてのトラフィックをWireGuardトンネル経由にしたい場合→ 0.0.0.0/0
  • LAN(例:192.168.1.0/24と10.1.0.0/16)だけはWireGuardトンネル経由、その他は現在接続しているネットワークを利用する場合→ 192.168.1.0/24, 10.1.0.0/16

のように「トンネルを経由して通信したい宛先ネットワーク」を指定する必要があります。

サーバ(VPNトンネルの集約拠点)観点

サーバ側では複数のVPNトンネルを終端するので「どのトラフィックをどのピアに渡すのか」の判断はとても重要です。しかしここで各クライアント(ピア)向けのAllowed IPsの設定で0.0.0.0/0を使うとどうなるか、「送信時はルーティングとして動作する」ということからすると不適切であることがわかります。なぜなら「どのピア宛のトラフィックも、このピアへ送る」というルーティングをすることと同じことになるからです。

ではどうすればよいか。

WireGuardトンネルは「インターフェースアドレス」というものを持っています。これはトンネルに割り当てたアドレスであり、トンネルの両端ではこのアドレス同士が通信することが可能ですので、Allowed IPsに「インターフェースアドレス/32」を指定することで「このインターフェースアドレスを割り当てたピア(クライアント)へのトラフィックはこのピアへ送る」という正しいルーティングをさせることができるようになります。(これが前回の記事でハマってたポイント)

受信時

クライアント観点

これは逆向きの通信をシンプルに考えれば大丈夫です。

クライアントが通信したい(通信を許可された)IPアドレスから送られたパケットであれば、当然受信できます。そして、Allowed IPsに記載されていないアドレスレンジ(上記の例であれば、172.16.0.0/16とか)からのパケットは、復号後のパケットの送信元IPアドレスがAllowed IPsに記載されていないのでWireGuardが落としてくれる(受信しない)のです。

いちいち個別にファイアウォールルールを書いたりする必要はない、ということになります。

サーバ(VPNトンネルの集約拠点)観点

この場合もわかりやすいです。

上記の例のように、Allowed IPsに「ピアのインターフェースアドレス/32」が書いてあれば、それ以外の送信元からのパケットは受け付けませんし、何より「1つのピアは1つの送信元である」ことを保証できます。スマホ、タブレット、PCそれぞれに異なるピア定義をしていてもどの端末からの接続か特定できますし、その他のアドレスからではそもそも通信できなくなっているわけです。

まとめ

こうやって考えてみるとAllowed IPsは「WireGuardトンネルによって構築されたオーバーレイネットワークでの通信をスマートに制御するためのパラメータ」であることが理解できます。そして、トンネルの両側で、何も考えず「とりあえず0.0.0.0/0」と設定するものではない、ということもわかります。

WireGuardによるセキュアなVPNを構築する際は、ぜひAllowed IPsの設定についても考慮してみてください。安易に「0.0.0.0/0」を設定しないように気をつけてくださいね。

コメント

タイトルとURLをコピーしました