我想要一个点到站点拓扑,但由于“客户端”和“服务器”主机都在它们自己的 NAT 网络中,因此我需要依赖 Hub and Spoke 拓扑中的第三个主机。
Host A (hub)
[Interface]
PrivateKey =
Address = 10.201.50.1/32
ListenPort = 51820
PreUp = sysctl -w net.ipv4.ip_forward=1
[Peer]
PublicKey =
AllowedIPs = 10.201.50.2/32
[Peer]
PublicKey =
AllowedIPs = 10.201.50.3/32
Host B (server)
[Interface]
PrivateKey =
Address = 10.201.50.2/32
PreUp = sysctl -w net.ipv4.ip_forward=1
PreUp = iptables -t mangle -A PREROUTING -i %i -j MARK --set-mark 0x40
PreUp = iptables -t nat -A POSTROUTING ! -o %i -m mark --mark 0x40 -j MASQUERADE
PostDown = iptables -t mangle -D PREROUTING -i %i -j MARK --set-mark 0x40
PostDown = iptables -t nat -A POSTROUTING ! -o %i -m mark --mark 0x40 -j MASQUERADE
[Peer]
PublicKey =
Endpoint = 198.230.220.45:51820
AllowedIPs = 10.201.50.0/24
PersistentKeepalive = 15
Host C (client)
[Interface]
PrivateKey =
Address = 10.201.50.3/32
[Peer]
PublicKey =
Endpoint = 198.230.220.45:51820
AllowedIPs = 10.201.50.0/24, 10.0.0.0/24
两个对等体都能够良好地连接到集线器。
interface: wg0
public key:
private key: (hidden)
listening port: 51820
peer:
endpoint: :63882
allowed ips: 10.201.50.3/32
latest handshake: 35 seconds ago
transfer: 213.07 KiB received, 15.93 KiB sent
peer:
endpoint: :33868
allowed ips: 10.201.50.2/32
latest handshake: 1 minute, 6 seconds ago
transfer: 7.19 KiB received, 5.12 KiB sent
我可以从主机 C 顺利 ping 主机 B,但其他连接失败。例如,我无法通过 ssh 进入主机 B,它只是挂起。我无法 curl 在主机 B 端口 80 上运行的 Web 服务器,它也挂起。据我所知,主机 B 上没有运行防火墙。主机 B 网络中的其他主机根本无法访问。
感谢您的帮助。谢谢
答案1
在这种情况下,关键是确保AllowedIPs
每个对等体都配置为允许要传输的数据包的目标 IP 地址发给(或者发送) 对等。
因此,如果您想要从主机 C 通过主机 A 访问主机 B 的本地站点的 CIDR 块为10.0.0.0/24
,请确保AllowedIPs
主机 C 上主机 A 的设置包括10.0.0.0/24
(例如:):
# Host C configuration for Host A peer
AllowedIPs = 10.201.50.0/24, 10.0.0.0/24
并且AllowedIPs
主机 A 上主机 B 的设置包括10.0.0.0/24
(您遗漏了):
# Host A configuration for Host B peer
AllowedIPs = 10.201.50.2/32, 10.0.0.0/24
但是从您对 ping 工作而 SSH/HTTP 不工作的描述来看,您可能还遇到了 MTU 问题(数据包碎片化/被拒绝,因为它们的大小对于沿途的某个特定跳跃来说有点太大)。尝试将此设置添加到[Interface]
每个 WireGuard 配置的部分:
MTU = 1280
而且您不需要在主机 A 上进行伪装(只需在主机 B 上进行伪装,就像您所做的那样)。
但是,如果你想要路由全部流量(0.0.0.0/0
)从主机 C 通过主机 A 到主机 B,请将主机 A 的 WireGuard 配置更改为以下内容:
[Interface]
PrivateKey = ...
Address = 10.201.50.1/24
ListenPort = 51820
Table = 123
PreUp = sysctl -w net.ipv4.ip_forward=1
PreUp = ip rule add iif %i table 123 priority 456
PostDown = ip rule del iif %i table 123 priority 456
# to Host B
[Peer]
PublicKey = ...
AllowedIPs = 0.0.0.0/0
# to Host C
[Peer]
PublicKey = ...
AllowedIPs = 10.201.50.3/32
这将对流量使用自定义路由表(123
),以避免干扰主机 A 的主路由表。
(并且也更改您的主机 C 配置以供使用AllowedIPs = 0.0.0.0/0
,但不对其配置进行任何其他更改。)