我已经使用 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/24
(10.8.0.1
目的地为192.168.76.0/24
)设置 SNAT(IP 伪装),这使得流量看起来源自客户端本身(即源 IP“更改”/“翻译”为192.168.76.30
)。但是,“解决方法”在某些情况下可能会有缺陷。