Ubuntu 上基于端口的路由

Ubuntu 上基于端口的路由

我的情况:Ubuntu 服务器是具有 2 个网关的 LAN 的一部分。一个网关速度快,但延迟高。另一个网关速度慢,但延迟低。我的服务器通常使用 GW1 来处理所有流量(因为带宽高)。我希望能够通过低延迟连接 ssh 进入服务器。GW2 有一个到服务器的端口转发功能,但显然不能开箱即用,因为服务器将通过 GW1 应答,这会丢弃数据包。

经过一番研究,以下是我所做的(我的 ssh 端口是 222):

我添加了一个 iptables 规则来标记包

iptables -L PREROUTING -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
MARK       tcp  --  anywhere             anywhere             tcp dpt:222 MARK set 0x1

我将以下内容添加到 /etc/iproute2/rt_tables

100    sshtable

我为新表添加了一个 IP 规则 - 这是“IP 规则显示输出”

ip rule show
0:      from all lookup local
32764:  from all fwmark 0x1 lookup sshtable
32766:  from all lookup main
32767:  from all lookup default

我改变了新表的路由 - 这是“ip route show table sshtable”

ip route show table sshtable
default via 192.168.2.2 dev eth0

rp_filter 应该被关闭:

cat /etc/sysctl.conf | grep filter
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

不幸的是,它不起作用。我可以看到传入连接卡在 SYN_SENT(使用 tcptrack)。

你有什么提示给我吗? Nik

答案1

您应该标记整个连接,否则只有第一个数据包会标记。

iptables -t mangle -A PREROUTING -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
iptables -t mangle -A PREROUTING -p tcp -dport 222 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

您可能需要加载该ipt_connmark模块。要确定它是否随内核提供,请运行以下命令:

$ find /lib/modules/`uname -r` -name 'xt_connmark.ko'
$ lsmod | grep 'connmark'

如果尚未加载,请确保加载该模块。

# modprobe ipt_connmark

相关内容