You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ipset+策略路由转发流量至NAT接口后响应报文无法接收的问题排查

ipset+策略路由转发流量至NAT接口后响应报文无法接收的问题排查

我来帮你梳理排查这个问题,结合你的配置和抓包信息,能看出几个关键的疏漏点,咱们一步步来修正:

1. 首先是iptables链的引用错误

你在mangle表创建了自定义链TEST_ROUTE,但后续的OUTPUT和PREROUTING规则里却跳转到了不存在的TEST链,这会导致你的标记规则根本没生效!(不过你提到所有包都走到了em2,可能是实际配置里写对了但提问时打错了,一定要先确认这个点)

修正后的规则应该是:

# 替换原来错误的跳转规则
iptables -t mangle -A OUTPUT -j TEST_ROUTE
iptables -t mangle -A PREROUTING -j TEST_ROUTE

2. 回程路由的策略缺失(核心问题)

你当前只标记了出站流量走表100,但响应报文从em2返回时,系统没法识别这是之前通过策略路由发出去的连接,导致包虽然到了em2接口,却无法正确路由回本地进程。

解决这个问题的关键是用CONNMARK标记整个连接,让双向流量都能继承标记走正确的路由:

# 先清空原有TEST_ROUTE链的规则(如果需要)
iptables -t mangle -F TEST_ROUTE

# 只给未标记过的目标ipset内的连接设置MARK,并保存到CONNMARK
iptables -t mangle -A TEST_ROUTE -m set --match-set test dst -m connmark ! --mark 0 -j RETURN
iptables -t mangle -A TEST_ROUTE -m set --match-set test dst -j MARK --set-mark 1
iptables -t mangle -A TEST_ROUTE -m set --match-set test dst -j CONNMARK --save-mark

# 在PREROUTING链恢复CONNMARK到MARK,让回程包也带上标记
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

3. 反向路径过滤(rp_filter)导致丢包

Linux的rp_filter机制如果是严格模式(值为1),会因为回程包的源IP不在em2的直连子网里而丢弃它,你需要调整这个参数:

# 临时生效
sysctl -w net.ipv4.conf.all.rp_filter=2
sysctl -w net.ipv4.conf.em2.rp_filter=2

# 永久生效可以写入/etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter=2" >> /etc/sysctl.conf
echo "net.ipv4.conf.em2.rp_filter=2" >> /etc/sysctl.conf
sysctl -p

最后验证配置

你可以通过以下命令确认连接跟踪和路由规则是否正常:

# 查看1.1.1.1相关的连接跟踪状态
conntrack -L | grep 1.1.1.1
# 查看策略路由规则
ip rule show
# 查看表100的路由
ip route show table 100

备注:内容来源于stack exchange,提问作者Hoping White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:33:06