根据源端口将传出数据包路由到 eth0 接口

根据源端口将传出数据包路由到 eth0 接口

我在服务器上使用 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所示: wireshark抓包

我唯一的猜测是 fwmark 可能不适用于 UDP?因为我对 SSH 使用完全相同的命令

答案1

来自端口 19132 的 UDP 数据包实际上是通过 eth0 路由的,但不知何故源地址错误。服务器绑定到 0.0.0.0 并绑定到 192.168.1.5 解决了该问题。

相关内容