我的问题是我无法建立传出连接。
我关注了博客文章使用 TPROXY 将任何 TCP 连接重定向到单个侦听器:
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
据我所知 这对我面临的问题没有影响。
我正在运行一个监听器IP_TRANSPARENT
并且获得了预期的所有连接。
有时我想建立传出的 TCP 连接,如果我正确读取的话,SYN 数据包会按预期发出,但任何响应都会被 TPROXY 规则拦截并丢弃。
我认为使用路由可以解决这一问题吗?
根据建议,我尝试添加一条传出连接路由,如下所示:
echo "10 tproxy" >> /etc/iproute2/rt_tables
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
并将 iptables 规则更新为:
-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
仍然有同样的问题:
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
答案1
是的,因为TPROXY
规则会拦截所有传入流量并将其重定向到侦听器
你可以允许传出连接,方法是使用策略路由来绕过TPROXY
规则路由传出的流量
方法如下:首先我们创建一个新的路由表,echo "10 tproxy" >> /etc/iproute2/rt_tables
然后我们添加新的路由规则,ip rule add from <your_ip_address> table tproxy
然后我们添加一个新的默认路由ip route add default via <your_default_gateway> dev eth0 table tproxy
,最后我们修改 TPROXY 规则以仅匹配不是来自我们 IP 地址的流量
iptables -t mangle -I PREROUTING ! -s <your_ip_address> -i eth0 -p tcp -j TPROXY --on-port=1234 --on-ip=127.0.0.1