我的问题与网络路由和 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 后面,该如何解决这个问题。该死,这太复杂了。