我在服务器上使用 OpenVPN 客户端,因此所有传出流量都通过 VPN 创建的 tun0 接口进行路由。
我仍然想运行公共可访问的服务,例如 SSH(在端口 22 上)和 UDP 服务器(在端口 19132 上),但 VPN 修改了路由,因此例如传出 SSH 数据包通过 VPN tun0 接口进行路由,从而无法连接从服务器公共IP
因此,我需要根据源端口路由传出数据包,我在网上找到了不同的解决方案,例如这一。
使用上述解决方案,它可以正确路由传出 SSH 数据包,因此 SSH 可以工作,但 UDP 服务器传出数据包仍然被错误路由
没有VPN
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 50:e5:49:ca:ad:12 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 brd 192.168.1.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::6052:495b:8ae4:8ade/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# ip route
default via 192.168.1.1 dev eth0 proto static metric 100
169.254.0.0/16 dev eth0 scope link metric 1000
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.5 metric 100
有VPN
# ip addr
1: lo: The same as without VPN
2: eth0: The same as without VPN
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.8.1.28/24 brd 10.8.1.255 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::2e19:d676:6826:d47d/64 scope link stable-privacy
valid_lft forever preferred_lft forever
# ip route
0.0.0.0/1 via 10.8.1.1 dev tun0
default via 192.168.1.1 dev eth0 proto static metric 100
10.8.1.0/24 dev tun0 proto kernel scope link src 10.8.1.28
VpnPublicIp via 192.168.1.1 dev eth0
128.0.0.0/1 via 10.8.1.1 dev tun0
169.254.0.0/16 dev eth0 scope link metric 1000
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.5 metric 100
尝试的解决方案:
iptables -t mangle -A OUTPUT -p udp --sport 19132 -j MARK --set-mark 65
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
ip route add default via 192.168.1.1 dev eth0 table 128
ip rule add fwmark 65 table 128
ip route flush cache
尝试解决结果:
SSH 传出数据包通过 eth0 正确路由,因此 SSH 可以正常工作。 UDP 服务器传出数据包仍然通过 tun0 路由,如wireshark所示:
我唯一的猜测是 fwmark 可能不适用于 UDP?因为我对 SSH 使用完全相同的命令
答案1
来自端口 19132 的 UDP 数据包实际上是通过 eth0 路由的,但不知何故源地址错误。服务器绑定到 0.0.0.0 并绑定到 192.168.1.5 解决了该问题。