DNAt 不适用于标记的数据包

DNAt 不适用于标记的数据包

我尝试检测中转 http 流量并通过 iptables 字符串模块将其转发到一台主机。

iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -p tcp    \
  -m string --string "GET" --algo kmp \
  -m mark --mark 0x0 -j CONNMARK --set-mark 0x55
iptables -A PREROUTING -t mangle -j CONNMARK --save-mark

iptables -A PREROUTING -t nat -p tcp -m connmark --mark 0x55 -j DNAT --to-destination 10.10.10.10:80

iptables -L -v -t mangle –行号

Chain PREROUTING (policy ACCEPT 2469 packets, 2078K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     2469 2078K CONNMARK   all  --  any    any     anywhere             anywhere             CONNMARK restore
2        1   186 CONNMARK   tcp  --  any    any     anywhere             anywhere             STRING match  "GET" ALGO name kmp TO 65535 mark match 0x0 CONNMARK set 0x55
3     2469 2078K CONNMARK   all  --  any    any     anywhere             anywhere             CONNMARK save

mangle 表中的数据包数量增加。但 DNAT 计数为零。

iptables -L -v -t nat --行号

iptables -L -v -t nat --line-numbers
Chain PREROUTING (policy ACCEPT 306 packets, 61227 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  any    any     anywhere             anywhere             connmark match  0x55 to:10.10.10.10:80

这个规则有什么问题吗?

所有连锁店均已接受

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

答案1

这将不起作用,因为您正在尝试匹配 TCP 连接内的内容,因此该连接已经建立。然而,DNAT 需要在连接建立之前进行,因此进行 DNAT 为时已晚。

因此,只有建立新连接的数据包才会被“nat”表实际处理。所有连续的数据包将使用在第一个数据包期间设置的相同 SNAT/DNAT/等策略自动进行处理。

因此,当连接的第一个数据包(不包含任何文本数据)时,您的字符串匹配尚未设置标记,因此 DNAT 永远不会匹配。

您可以考虑的替代方案包括设置透明代理或反向代理。

相关内容