我正在使用 WireGuard 设置 VPN,并且在相应的 VPN 服务器上配置我的防火墙时卡住了。我想要以下功能:
- VPN 设备 (
10.6.0.0/24
) 可从 LAN (10.20.0.0/24
) 获得(问题!) 10.20.0.0/24
可从 VPN ( ) 获得的LAN 设备 (10.6.0.0/24
)(有效!)
当前的 iptables 配置:
向任何方向转发来自现有(已打开)连接的所有流量
iptables -t filter -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
这使得 LAN 设备可以从 VPN 获得(工作正常)
# Direction: VPN -> LAN -------------------------------------------------------------
iptables -t nat -A PREROUTING -d 10.20.0.0/24 -j DNAT --to-destination 10.6.0.1 # Act as destination NAT from VPN to LAN (be the LAN-gateway for the VPN)
iptables -t filter -A FORWARD -s 10.6.0.0/24 -d 10.20.0.0/24 -j ACCEPT # Accept traffic from VPN to LAN
iptables -t nat -A POSTROUTING -s 10.6.0.0/24 -d 10.20.0.0/24 -j MASQUERADE # Mask traffic from VPN to LAN for responses
这将使 VPN 设备可以从 LAN 中使用(需要帮助!)
# Direction: LAN -> VPN -------------------------------------------------------------
iptables -t filter -A FORWARD -s 10.20.0.0/24 -d 10.6.0.0/24 -j ACCEPT # Accept traffic from LAN to VPN
iptables -t nat -A POSTROUTING -s 10.20.0.0/24 -d 10.6.0.0/24 -j MASQUERADE # Mask traffic from LAN to VPN for responses
目前的发现:
通过查看这些规则,我可能在下部错过了另一个 DNAT/SNAT,但我仍然无法弄清楚......
VPN 接口上的接口计数器显示,ping 被发送到 VPN 客户端并返回!所以问题似乎是到达的 VPN 数据包要被转换并转发到 LAN。
如果需要更多信息,请询问:) 感谢您的宝贵时间!
问题已解决
正如@MichaelHampton 上面正确评论的那样,在这种情况下不需要NAT。整个任务仅仅是正确路由的问题,而不是 NAT-ing。
问题的根源
为了让客户端能够连接到 LAN (
10.20.0.0/24
),您必须将此子网添加到AllowedIPs
服务器配置中的指令中才能被允许。然而,这会自动为相应的子网设置一条新路由,覆盖原始路由。结果:您的服务器无法再访问 LAN 子网中的主机,这导致所有连接尝试都失败:
由于此路由的度量为 0(低于下面默认路由的度量),因此该路由将始终是首选,并且无法尝试连接到 LAN。
永久决议
就我而言,我只是在我的
/etc/wireguard/wg0.conf
:这删除了每次wireguard重新启动时将创建的路由。这需要对所有不是 VPN 子网的子网进行,并且不应被覆盖。
编辑:您可以添加
Table=off
到您的/etc/wireguard/wg0.conf
和 WireGuard 将停止弄乱您的路由表 :)总而言之,这是一次相当伤脑筋的经历。我很确定会编写一个脚本来处理这些事情,使 WireGuard 更加“即插即用”:)