我尝试检测中转 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 永远不会匹配。
您可以考虑的替代方案包括设置透明代理或反向代理。