如何通过 wireguard 覆盖网络转发/路由数据包?

如何通过 wireguard 覆盖网络转发/路由数据包?

我的问题与网络路由和 iptables 的基础知识有关,可能是因为我不了解如何设置它。

我使用 wireguard 在主机之间建立了覆盖网络,其中一个主机位于路由器/NAT 后面。到目前为止,覆盖网络运行良好,每个主机都可以与其他主机通信。

现在,我想让主机 A 成为私有网络的网关,但却无法做到这一点。

你能帮助我解开 iptables 转发的秘密吗?

3 网络

VPN 的覆盖网络是169.254.0.0/24,路由器后面的私有网络是192.168.0.0/24

  • 互联网

答案1

这是工作配置。呼,其实我自己弄的,但我花了一段时间才弄好。

客户

我必须确保对等方(VPN 服务器)被允许使用该192.168.178.0/24范围。

[Interface]
Address = 169.254.0.2/32
PrivateKey = ...
ListenPort = 51280

[Peer]
PublicKey = ...
AllowedIPs = 169.254.0.1/32, 192.168.178.0/24
Endpoint = ...:51280

VPN 服务器

我只需要从tun0接口转发数据包即可MASQUERADE。此外,我还将192.168.178.0/24网络添加到AllowedIPs主机 A 的。

$ iptables -A FORWARD -i tun0 -j ACCEPT
$ iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Wireguard 配置:

[Interface]
Address = 169.254.0.1/32
PrivateKey = ...
ListenPort = 51280

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.2/32

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.3/32, 192.168.178.0/24

主机 A

我需要接受两个接口上的转发数据包。并且我会伪装数据包eth0

$ iptables -A FORWARD -i tun0 -j ACCEPT
$ iptables -A FORWARD -i eth0 -j ACCEPT
$ iptables -A POSTROUTING -o eth0 -j MASQUERADE

Wireguard 的配置没什么特别的,只是连接到 VPN 服务器。

[Interface]
Address = 169.254.0.3/32
PrivateKey = ...
ListenPort = 51280

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.1/32
PersistentKeepalive = 25

然而,有一个重大陷阱当与主机 A(位于路由器/NAT 后面)一起工作时。VPN 服务器必须知道主机 A 的端点(公共 IP + 端口)才能向其发送数据包。路由器会在一段时间后丢失状态,因此 VPN 服务器将无法再连接到主机 A。

我通过将PersistentKeepalive设置添加到[Peer]主机 A 上的 VPN 服务器部分来解决了这个问题。(感谢评论中的@AB 指出这一点。)

我想知道如果两者都在路由器/NAT 后面,该如何解决这个问题。该死,这太复杂了。

相关内容