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

使用iptables TPROXY监听所有端口时无法建立出站连接的问题求助

iptables TPROXY监听所有端口时无法建立出站连接的问题求助

大家好,我最近在配置TPROXY透明代理时遇到了一个棘手的问题,想请各位帮忙分析下:

我的核心需求是把所有进入服务器的TCP连接都重定向到本地的一个监听程序(已开启IP_TRANSPARENT选项,入站连接处理一切正常),但现在当我尝试主动发起出站TCP连接时,出现了连接无法建立的情况——从抓包来看,SYN包能正常发送出去,对方也返回了SYN-ACK包,但我的系统始终没有回应ACK,看起来这些SYN-ACK包被TPROXY规则拦截并丢弃了。

我已经做的配置尝试

  • 最初参考博客配置的iptables规则:
iptables -t mangle -I PREROUTING -i eth0 -p tcp -j TPROXY --on-port=1234 --on-ip=127.0.0.1

我把原博客中的-d 192.0.2.0/24改成了-i eth0,个人认为这个改动不会导致出站连接的问题。

  • 后来看到有建议用路由策略来规避这个问题,于是做了以下配置:
    1. 添加自定义路由表:
    echo "10 tproxy" >> /etc/iproute2/rt_tables
    
    1. 配置路由规则,让本地IP(10.x.x.81)发起的流量走自定义路由表:
    ip rule add from 10.x.x.81 table tproxy
    ip route add default via 10.x.x.80 dev ens2 table tproxy
    
    对应的路由规则和路由表状态:
    # ip rule show
    0:      from all lookup local
    32764:  from 10.x.x.81 lookup tproxy
    ...
    
    # ip route show table tproxy
    default via 10.64.70.80 dev ens2
    
    1. 更新iptables规则,尝试排除本地IP发起的流量以及SSH端口:
    -A PREROUTING ! -s 10.x.x.81/32 -i ens2 -p tcp -m tcp ! --dport 22 -j TPROXY --on-port 5000 --on-ip 127.0.0.1
    

抓包结果

执行tcpdump得到的关键报文如下:

11:42:28.172268 IP hostname.46324 > remote.https: Flags [S], seq 2783956497, win 64240, options [mss 1460,sackOK,TS val 1288228251 ecr 0,nop,wscale 7], length 0
11:42:28.173479 IP remote.https > hostname.46324: Flags [S.], seq 573845087, ack 2783956498, win 65160, options [mss 1460,sackOK,TS val 3249746343 ecr 1288227230,nop,wscale 7], length 0
11:42:29.202975 IP remote.https > hostname.46324: Flags [S.], seq 573845087, ack 2783956498, win 65160, options [mss 1460,sackOK,TS val 3249747372 ecr 1288227230,nop,wscale 7], length 0
11:42:29.620887 IP hostname.46334 > remote.https: Flags [S], seq 1774017241, win 64240, options [mss 1460,sackOK,TS val 1288229700 ecr 0,nop,wscale 7], length 0
11:42:29.621686 IP remote.https > hostname.46334: Flags [S.], seq 1078655880, ack 1774017242, win 65160, options [mss 1460,sackOK,TS val 3249747791 ecr 1288229700,nop,wscale 7], length 0

能看到对方的SYN-ACK包已经到达我的服务器,但系统没有回应,连接始终无法建立。

想请教各位,是不是我的路由策略或者iptables规则哪里配置有误?有没有其他方法可以让出站连接的响应包绕过TPROXY规则,正常传递到发起连接的进程?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:52:58