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)

序列图

我已通过 Wireguard 将笔记本电脑 (10.8.0.2) 连接到服务器 A (10.8.0.1)。我可以 ping/curl 到服务器 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

笔记本电脑 wireguard:

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

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

服务器A wireguard:

[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.0.0.0/8 via 10.0.0.1 dev enp7s0与其他路由有冲突,因为 10.10.0.0/24 子网属于更大的 10.0.0.0/8 范围。因此我移动了我的 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

相关内容