Wireguard/iptables: ICMP 応答が wg0 に転送されない

Wireguard/iptables: ICMP 応答が wg0 に転送されない

ネットワーク図:Laptop (10.8.0.2) -> (wireguard) -> server A (10.8.0.1, 10.10.0.10) -> server B (10.10.0.20)

シーケンス図

ラップトップ (10.8.0.2) を Wireguard 経由でサーバー A (10.8.0.1) に接続しました。サーバー A (10.10.0.10) には ping/curl できますが、別のサーバー B (10.10.0.20) にはできません。

ping 10.10.0.20ラップトップからサーバー B にアクセスすると、サーバー A で次のことが分かります。

  • tcpdump -nn -i wg0リクエストは表示されますが、応答はありません:
  • tcpdump -nn -i enp7s0リクエストとレスポンスを表示します

それで問題は、応答が enp7s0 から wg0 に転送されないことにあるようです。

しかし、なぜそうしないのでしょうか?

これは私の iptables 設定です:

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o enp7s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o enp7s0 -j MASQUERADE

ラップトップワイヤーガード:

[Interface]
PrivateKey = ...
Address = 10.8.0.2/24

[Peer]
PublicKey = ...
AllowedIPs = 10.8.0.0/24,10.10.0.0/24
Endpoint = ...

サーバーAのワイヤーガード:

[Interface]
PrivateKey = 
Address = 10.8.0.1/24
ListenPort = 51820
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o cilium_host -j MASQUERADE
PostUp = iptables -t nat -A POSTROUTING -o enp7s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o cilium_host -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o enp7s0 -j MASQUERADE

[Peer]
PublicKey = 
AllowedIPs = 10.8.0.2/32

サーバー B とサーバー A は仮想プライベート ネットワークを介して接続されています。

更新: Wireguard サービスのリロード

サービスを再起動することも役立つようです。

systemctl reload [email protected]
systemctl restart [email protected]

以下のルールを追加することもできますが、私はそれらを削除してもまだ機能しました:

PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT

更新: その他の関連する問題 (参考):

ルーティングテーブルを分析したところ(ip route):

default via 172.31.1.1 dev eth0 
10.0.0.0/24 via 10.0.1.50 dev cilium_host proto kernel src 10.0.1.50 mtu 1400 
10.0.0.0/8 via 10.0.0.1 dev enp7s0 
10.0.0.1 dev enp7s0 scope link 
10.0.1.0/24 via 10.0.1.50 dev cilium_host proto kernel src 10.0.1.50 
10.0.1.50 dev cilium_host proto kernel scope link 
10.0.2.0/24 via 10.0.1.50 dev cilium_host proto kernel src 10.0.1.50 mtu 1400 
10.0.3.0/24 via 10.0.1.50 dev cilium_host proto kernel src 10.0.1.50 mtu 1400 
10.8.0.0/24 dev wg0 proto kernel scope link src 10.8.0.1 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
172.31.1.1 dev eth0 scope link 

10.10.0.0/24 サブネットがより大きな 10.0.0.0/8 の範囲に属しているため、他のルートと競合していることに気付きました10.0.0.0/8 via 10.0.0.1 dev enp7s0。そこで、Kubernetes/Cilium ネットワークを移動し (コーヒー ショップなどの一般的なネットワークと競合する可能性のある 10.0.0.0/8 を回避するため)、VPC ネットワークも狭めました。

答え1

よく考えてみると、これが機能しなかった理由は、おそらくAllowedIPs = 0.0.0.0/0サーバー A から B への VPN カプセル化されたトラフィックが Wireguard トンネルにルーティングされることが原因であると考えられます。

したがって、解決策はそれを に置き換えることですAllowedIPs = 10.8.0.2/32

関連情報