WireGuard 将 Hub and Spoke 与 Point to Site 相结合

WireGuard 将 Hub and Spoke 与 Point to Site 相结合

我想要一个点到站点拓扑,但由于“客户端”和“服务器”主机都在它们自己的 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,但不对其配置进行任何其他更改。)

相关内容