我正在使用 WireGuard 设置 VPN,但在相应的 VPN 服务器上配置防火墙时卡住了。我希望以下功能可用:
10.6.0.0/24
可从 LAN () 访问VPN 设备 (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。
如果需要更多信息,请询问:)感谢您的时间!
答案1
问题已解决
正如@MichaelHampton 上面正确评论的那样,在这种情况下,NAT 是不必要的。整个任务仅仅是正确路由的问题,而不是 NAT 的问题。
问题的根源
为了让客户端能够连接到 LAN(10.20.0.0/24
),您必须将此子网添加到AllowedIPs
服务器配置内的指令中才允许。
但是,这会自动为相应子网设置新路由,覆盖原始路由。结果:您的服务器无法再访问 LAN 子网中的主机,导致所有连接尝试失败:
Destination Gateway Genmask Flags Metric Ref Use Iface
-ok-> 10.6.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0
-!!-> 10.20.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0
-ok-> 10.20.0.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
由于此路由的度量为 0(低于下面的默认路由的度量),因此该路由将始终被优先使用,并且使得无法尝试连接 LAN。
永久解决方案
就我而言,我只需将以下行添加到我的/etc/wireguard/wg0.conf
:
PostUp = route del -net 10.20.0.0/24 dev wg0
这将删除将要创建的路线每次 wireguard 重启时. 这需要对所有非 VPN 子网且不应被覆盖的子网执行。
编辑:您只需添加Table=off
到您的/etc/wireguard/wg0.conf
WireGuard 即可停止弄乱您的路由表 :)
总而言之,这是一次相当令人紧张的经历。我很确定我会写一个脚本来处理这些事情,让 WireGuard 更加“即插即用” :)