我的情况: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