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
相关产品推荐
相关产品推荐

