如何解决Wireguard站点到站点网络中的路由

如何解决Wireguard站点到站点网络中的路由

我已经使用 wireguard 建立了站点到站点的网络:

wg-server <-network A-> router A <--internet--> router B <-network B-> wg-client AND host B1, B2 etc

wg-server 正在运行一些网络服务,如 http、ssh 等。

目标是从主机 B1 访问 wg-server 上的服务。

wg-client 和 wg-server 之间的 wireguard 连接正常工作:我可以从彼此访问主机。此外,我可以从 wg-client 访问路由器 A,但不能从主机 B1 访问。

root@wg-client:~# traceroute 192.168.179.1
traceroute to 192.168.179.1 (192.168.179.1), 30 hops max, 60 byte packets
 1  10.8.0.1 (10.8.0.1)  22.939 ms  31.863 ms  32.336 ms
 2  192.168.179.1 (192.168.179.1)  32.235 ms  35.028 ms  34.811 ms

root@wg-client:~# ping -c1 192.168.179.51
PING 192.168.179.51 (192.168.179.51) 56(84) bytes of data.
64 bytes from 192.168.179.51: icmp_seq=1 ttl=64 time=22.3 ms

[host B1]C:\>tracert 192.168.179.1
Routenverfolgung zu 192.168.179.1 über maximal 30 Hops
  1     4 ms     2 ms     2 ms  fritz.box [192.168.76.1]
  2     5 ms     5 ms     4 ms  wg-client [192.168.76.30]
  3     *        *        *     Zeitüberschreitung der Anforderung.

[host B1]C:\>tracert 192.168.179.51
Routenverfolgung zu 192.168.179.51 über maximal 30 Hops
  1    91 ms     2 ms     2 ms  fritz.box [192.168.76.1]
  2     3 ms     4 ms     3 ms  wg-client [192.168.76.30]
  3     *        *        *     Zeitüberschreitung der Anforderung.

[host B1]C:\>ping 192.168.179.51
Ping wird ausgeführt für 192.168.179.51 mit 32 Bytes Daten:
Zeitüberschreitung der Anforderung.

我也无法从 wg-server 访问路由器 B 或主机 B1。

==> 您能提供一些分析和解决问题的提示吗?

网络设置为:

network A = 192.168.179.0/24
network B = 192.168.76.0/24

wg-server:
linux armbian
192.168.179.51 eth0
10.8.0.1 wg0

wg-client:
linux raspbian
192.168.76.30 eth0
10.8.0.3 wg1

router A (fritzbox):
dynamic public ip
internal ip 192.168.179.1
routing 192.168.76.0/24 to 192.168.179.51

router B (fritzbox):
dynamic public ip
internal ip 192.168.76.1
routing 192.168.179.0/24 to 192.168.76.30

host B1:
Windows 11
192.168.76.44

wg-client 的路由表:

root@wg-client:~# ip route
default via 192.168.76.1 dev eth0 src 192.168.76.30 metric 202
10.8.0.0/24 dev wg1 proto kernel scope link src 10.8.0.3
[...]
192.168.76.0/24 dev eth0 proto dhcp scope link src 192.168.76.30 metric 202
192.168.179.0/24 dev wg1 scope link

wg-server 上的路由表:

root@wg-server:~# ip 路由

default via 192.168.179.1 dev eth0 proto dhcp metric 100
10.8.0.0/24 dev wg0 proto kernel scope link src 10.8.0.1
169.254.0.0/16 dev wg0 scope link metric 1000
[...]
192.168.76.0/24 dev wg0 scope link
192.168.179.0/24 dev eth0 proto kernel scope link src 192.168.179.51 metric 100

[...]没有显示到内部 docker 网络的路由。

wg-client 的防火墙 / iptables 已禁用。IP 转发已激活:

root@wg-client:~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

wg-client 上的 wg 配置:

[Interface]
PrivateKey = secret
Address = 10.8.0.3/24
[Peer]
PublicKey = secret
PresharedKey = secret
AllowedIPs = 10.8.0.0/24, 192.168.179.0/24, fd58:8e5e:1d78::0/64
Endpoint = secret.ddnss.de:51820
PersistentKeepalive = 25

wg-server 上的 wg 配置:

[Interface]
Address = 10.8.0.1/24
Address = fd58:8e5e:1d78::1/64
PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = secret

[Peer]
PublicKey = secret
PresharedKey = secret
AllowedIPs = 10.8.0.0/24, 192.168.76.0/24, fd58:8e5e:1d78::0/64

编辑1:

[host B1]C:\>tracert 192.168.179.1

root@wg-client:~# tcpdump -n -i wg1 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on wg1, link-type RAW (Raw IP), snapshot length 262144 bytes

==> wg1 没有结果

root@wg-client:~# tcpdump -n -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
15:45:47.312930 IP 192.168.76.44 > 192.168.179.1: ICMP echo request, id 1, seq 239, length 72
15:45:47.313068 IP 192.168.76.30 > 192.168.76.44: ICMP time exceeded in-transit, length 100
15:45:47.319822 IP 192.168.76.44 > 192.168.179.1: ICMP echo request, id 1, seq 240, length 72
15:45:47.319906 IP 192.168.76.30 > 192.168.76.44: ICMP time exceeded in-transit, length 100
15:45:47.327341 IP 192.168.76.44 > 192.168.179.1: ICMP echo request, id 1, seq 241, length 72
15:45:47.327396 IP 192.168.76.30 > 192.168.76.44: ICMP time exceeded in-transit, length 100
15:45:48.354899 IP 192.168.76.44 > 192.168.179.1: ICMP echo request, id 1, seq 242, length 72

==> icmp 包在 eth0 上可见

==> eth0 和 wg1 之间似乎没有路由

解决了:

我通过在 wg-client 上激活 nftables 解决了我的问题。现在流量在 wg-client 内路由,并通过 wireguard 从网络 B 路由到网络 A。

实际上,这并不是最终的解决方案。问题在于,docker 启动了 iptables 策略,丢弃了前向链中的所有数据包,如https://docs.docker.com/network/iptables/#docker-on-a-router。因此,在 wg-client 我必须设置两条规则并坚持它们:

iptables -I DOCKER-USER -i wg1 -o eth0 -j ACCEPT
iptables -I DOCKER-USER -i eth0 -o wg1 -j ACCEPT

答案1

主机192.168.76.44和类似设备都需要有自己的路由,以便通过 路由流量10.8.0.0/24(或者只是10.8.0.1在您的情况下)192.168.76.30。如果没有这样的路由,它们将通过其默认网关(即路由器 B)路由流量192.168.76.1,该网关将流量转发到其 WAN(其防火墙可能因为该 IP 也属于私有块,所以删除它们)。

在每个 LAN 主机(需要连接到 WG 网络/服务器)上添加所需路由的替代方法是在路由器 B 上添加路由,或者在 WG 客户端上为源 IP 在 / 内的流量10.8.0.0/2410.8.0.1目的地为192.168.76.0/24)设置 SNAT(IP 伪装),这使得流量看起来源自客户端本身(即源 IP“更改”/“翻译”为192.168.76.30)。但是,“解决方法”在某些情况下可能会有缺陷。

相关内容