我家里有一个 OpenVPN 服务器,同时也是一个 OpenVPN 客户端。目的是在多个设备之间共享一个外部 IP 地址。在本地网络中,一切正常,因为我已经为本地网络设置了伪装。但如果客户端尝试从 Internet 连接,那么就会出现问题,因为传入的数据包是通过一个接口 (eth0) 接收的,但回复是通过默认网关 (tun1) 发送的。我如何强制这些数据包通过其原始网关 (eth0) 发送?
我尝试了以下方法:
echo "101 ovpntraffic">>/etc/iproute2/rt_tables
ip rule add fwmark 2 table ovpntraffic
ip route add default via 192.168.75.1 dev eth0 table ovpntraffic
iptables -t mangle -A OUTPUT -p udp -m udp --sport 1194 -j MARK --set-mark 2
根据我的理解,这应该用标记 2 标记从端口 1194(OpenVPN 服务器使用的端口)发出的所有数据包。然后这些数据包应该根据表 ovpntraffic 进行路由,并最终通过网关 192.168.75.1 发送。但 OpenVPN 客户端仍然无法与服务器建立连接。上面的配置有什么问题?
同时,我可以明确指定通过 eth0 路由的特定客户端 IP。在这种情况下,一切都按预期工作:客户端可以连接到 OpenVPN 服务器。
答案1
我想我几年前就遇到过类似的问题。你可以尝试一下:
--multihome
配置多宿主 UDP 服务器。当 OpenVPN 已配置为侦听所有接口时,可以使用此选项,并将尝试将客户端会话绑定到接收数据包的接口,以便传出的数据包将从同一接口发出。请注意,此选项仅与 UDP 服务器相关,目前仅在 Linux 上实现。
来源:http://openvpn.net/index.php/open-source/documentation/manuals/427-openvpn-22.html