ゴール
私は、(a) すべてのトラフィックをルーティングし、(b) インターネットからアクセス可能なサーバーを備えた IPv6 のみの WireGuard VPN を設定しようとしています。(a) が機能しなかったため、(b) が機能するようにします。これは単なるコンテキストです。
私は、 にグローバルにルーティング可能な IPv6 を備えた VPS を持っています2a03:4000:xx:xx:18d7:b1ef:fe48:7d35/64
(これがip a
私の見解です) eth0
。これをホスト名 で参照しますvps
。テスト目的で、サーバーにはファイアウォールがなく、net.ipv6.conf.all.forwarding=1
および です
net.ipv6.conf.all.accept_ra=2
。
次に、IPv6 アドレスを持つデバイスもオン2001:1715:yy:yy:db2d:ab24:ed3f:39d4/64
にしますwlan0
(別の WLAN に接続するとこのアドレスが変わるため、これは関連情報ではありません)。このデバイスにはホスト名が含まれますlaptop
。
最終的には次のようになります。
Internet <-> vps <-> laptop
IPv4 では NAT を使用しますが、IPv6 の世界では NAT は推奨されていません。代わりに何をすべきかを見つけるのは難しいですが、正しく読んだとすれば、2a03:4000:xx:xx::/64
VPS が取得したブロックから別の IP アドレスをラップトップに与える必要があります。
設定
そこで、次の 2 つの Wireguard 構成を記述します。
VPS:
[Interface]
Address = fc01::1/128 # Shouldn't really matter?
ListenPort = 1935 # This port is open to UDP on most networks
PrivateKey = uLxxxxxxxxxxxxxxxxxxxxxxxxEQ=
[Peer]
# laptop
PublicKey = swxxxxxxxxxxxxxxxxxxxxxxxxxmQ=
AllowedIPs = 2a03:4000:xx:xx:ffff::3/128 # Is inside the vps' /64 block
ラップトップ:
[Interface]
Address = 2a03:4000:xx:xx:ffff::3/128 # The globally routable IP addr of my laptop via the vps
ListenPort = 1935
PrivateKey = yMxxxxxxxxxxxxxxxxxxxxxxxxxxxxm8=
[Peer]
PublicKey = pCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzs=
AllowedIPs = ::/0 # Route all traffic through this peer
Endpoint = [2a03:4000:xx:xx:18d7:b1ef:fe48:7d35]:1935
私はそれらについて次のように述べます。
[root@vps ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add fc01::1/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -6 route add 2a03:4000:xx:xx:ffff::3/128 dev wg0
[root@laptop ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add 2a03:4000:xx:xx:ffff::3/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
...そしてそれは機能しません。
WireGuard が正常に接続されていないようです。ラップトップでは接続が表示され、送信トラフィックがカウントされますが (受信は 0B)、VPS では接続が表示されません。
IPv6 のみの WireGuard VPN を正しく設定するにはどうすればよいでしょうか。また、これが正しい場合、トンネルの一方の端で送信されたトラフィックがもう一方の端に到達しないのはなぜでしょうか。
さらに詳しい情報(pcaps、ip
出力など)が役立つ場合は、喜んで質問を修正します。
答え1
これは、サーバーのゲートウェイが/64 全体が「オンリンク」であるつまり、すべてのアドレスは同じイーサネット セグメント上で直接到達可能です。そのため、ゲートウェイはラップトップの MAC アドレスに対して近隣探索クエリを実行しますが、ラップトップが同じリンク上にないため、応答は受信されません。
(通常、サーバーは他の場所にルーティングされるアドレスに代わって応答しません。サーバーは、自身の eth0 インターフェイスに直接割り当てられたアドレスに対してのみ応答します。)
これをオンリンクアドレスで動作させるには、「プロキシNDP」を使用する必要があります。つまり、実際にサーバーを作成する必要があります。ラップトップに代わってNDP応答を提供する(およびトンネル経由でルーティングしようとしているその他のアドレス)。
IPv6 でこれを行う最も信頼性の高い方法は、ndpresponder
eth0 でデーモンを実行することです。デーモンは近隣要請パケットをリッスンし、正しい近隣通知を送信します。
(同様に、ndppd
カーネルの組み込みproxy_ndp
機能を使用することもできますが、それらはわずかに実際の NDP 応答とは異なり、一部の VPS ホスティング オペレーターが行うスプーフィング防止チェックに合格しない場合があります。
しかし理想的には、ホスティング会社はあなたに提供するべきルーティング接頭辞– データセンター ゲートウェイが、すべてをサーバーのプライマリ アドレス経由でルーティングするように明示的に構成されている場合。単一の静的ルートは、多数の動的ネイバー キャッシュ エントリよりも効率的であるため、これもまた、少しはメリットになります。
(残念ながら、多くのサーバー ホスティング会社は、ルーティングされたプレフィックスを提供できない特定の VPS 管理プラットフォームを社内で使用しています。これは、「フラット オンリンク /48」モデルを主張する SolusVM のせいだと聞いています。)
注: これは IPv6 に固有のものではありません。IPv4 でも「オンリンク」と「ルーティング」の同じ区別がありますが、唯一の違いは IPv4 では NDP ではなく ARP が使用されることです。(たとえば、サーバーが eth0 の 192.168.1.0/24 にあり、192.168.1.7 を VPN クライアントにルーティングしたい場合、まったく同じ問題が発生し、それを回避するにはプロキシ ARP が必要になります。)