Wireguard ルーティングの問題 IPv4+IPv6

Wireguard ルーティングの問題 IPv4+IPv6

私はWireguardを使って2つのLinuxシステム間に「簡単な」VPNを設定しようとしています。残念ながら、既存のチュートリアルでは通常A)IPv4のみを設定し、B)通常はIPマスカレーディングを使用しているため、役に立つ既存のチュートリアルを見つけることができませんでした。

機械Aの構成:

[Interface]
Address = 192.168.10.2/24
ListenPort = 51820
 
[Peer]
AllowedIPs = 192.168.10.0/24, 172.16.0.0/24, fdbb:bbbb:bbbb::/48, 2001:db8:bbbb:0000::/64
Endpoint = [2001:db8:bbbb:0000:1234:56ff:fe78:90ab]:51820
PersistentKeepalive = 20

機械Bの構成:

[Interface]
Address = 192.168.10.1/24
ListenPort = 51820

[Peer]
AllowedIPs = 192.168.10.2/32, 10.0.0.0/16, fdaa:aaaa:aaaa::/48, 2001:db8:aaaa:0000::/64
Endpoint = [2001:db8:aaaa:0000:ba09:87ff:fe65:4321]:51820
PersistentKeepalive = 20

(トンネル自体がトラフィックを転送するので、キーを省略するとこれが正しいことがわかります)。したがって、理論的には構成が簡単です。マシンAにはローカルファイアウォールはありません(ファイアウォールが組み込まれてUDP / 51820をオンにする一般的なコンシューマルータ)。マシンBにはip(6)テーブルがありますが、すべてのDockerルールに固有のものであり、デフォルトポリシーは許可されるように設定されています。 。

両方のマシンnet.ipv4.ip_forward=1とがありますnet.ipv6.conf.all.forwarding=2

Wireguardは明らかにルーティングを試みるため、この設定は機能しません。セルフワイヤガードトラフィックこれは、トンネル自体を介してエンドポイントIPv6がAllowedIPsネットワークに含まれているためです。基本的に除外されないのはなぜですか?

私はwg0の代わりに通常のインターフェイスを介してこのエンドポイントへのトラフィックを送信する固定パスを追加することでこの問題を解決しようとしました。

PostUp = /usr/sbin/ip -6 route add 2001:db8:aaaa:0000:ba09:87ff:fe65:4321/128 via fe80::1 dev enp1s0
PreDown = /usr/sbin/ip -6 route del 2001:db8:aaaa:0000:ba09:87ff:fe65:4321/128 via fe80::1 dev enp1s0

この設定(両方)を使用すると、ピアはA)WGピアアドレス(192.168.10.X)を介して互いにpingし、B)ローカルIPv4(10.0.XXまたは172.16.XX)を介してC)それぞれをpingできます。 。もう1つはローカルIPv4(10.0.XXまたは172.16.XX)を介して行われます。 ULA アドレス。

しかし、トンネルにはまだ2つの問題があります。

A)エンドポイントにIPv6ルートを追加する必要があるため、これは他のピアのパブリックIPv6アドレスに向かうトラフィックがWGトンネルを通過せずにインターネットを介して直接移動することを意味します。ピアはパブリックGUA IPv6アドレスを使用して互いにpingできません。 PostUpパラメータを使用して追加されたIPパスなどが必要ですが、これはトンネルを通過するトラフィックではなくトンネル自体に対してのみ機能します。 IPv6ルーティングと同様に、「このルートを介してUDP / 51820を(インターネットに直接)ルーティングしますが、他のトラフィックはこのルート(wg0)を介して同じIPに送信します」と言うことができます。

B)IPv4を介してネットワーク上の他のコンピュータからすべての機能を取得することはできません。ネットワークAの他のシステムでは、別のネットワークのIPv4に静的ルートを追加しました172.16.0.0/24 via 10.0.1.25 dev enp7s0 metric 100

今パスを追跡するとき、最初のホップはwireguardシステム(10.0.1.25)で、2番目のホップはリモートシステムのWGピアアドレス(192.168.10.1)です(したがってトンネルを通過します!)。それ。実際の宛先への3番目のホップはありません(他の側のデフォルトゲートウェイには、その側のWireguardシステムにルーティングされる固定パス10.0.0.0/8があるにもかかわらず)。 IP迷彩をやりたくありません。私が見つけたものよりも多く)

IPv6では、ULAを使用すると、すべてが正常です。ゲートウェイにIPv6ルーティングを追加し、相手のULAをWireguardシステムにルーティングしてから完了します。 GUAの解決策を見つけてください。おそらく、wireguardシステムでradvdを使用してそのネットワークへのパスを知らせているようです。

重要な要約:2つのピア間のWireguard接続はうまく機能しますが、A)Wireguard以外のトラフィックをWireguardエンドポイントIPにトンネリングする方法、B)IPv6 ULAルーティングは機能しますが、IPv4ルーティングは機能しない理由設定は同じです。

ベストアンサー1

IPルールを使用し、wireguard設定で次のコマンドを使用して機能するように管理しました。

PostUp = ip -6 rule add to 2001:db8:aaaa::ba09:87ff:fe65:4321/128 ipproto udp dport 51820 table 200
PostUp = ip -6 route add default via fe80::1 dev eth0 table 200

PreDown = ip -6 rule del lookup 200
PreDown = ip -6 route del default via fe80::1 dev eth0 table 200

これにより、すべてのトラフィックをローカルルーターに送信する1つの(デフォルト)ルートのみを含む完全に別々のルートテーブルが追加され、その200新しいルートテーブルに基づいてポート51820でエンドポイントIPv6へのすべてのUDPトラフィックを処理するIPルールが追加されます。

これにより、WGトンネル自体へのUDPトラフィックがルーターに送信されますが、宛先IPが同じである他のパケットはWGトンネルを通過します。

その後、トンネルの両側に radvd を追加し、ネットワーク上のデバイスが Wireguard システムにトラフィックを送信できるように、他方の GUA プレフィックスへのルートを発表しました。

おすすめ記事