Iptables 字符串

Iptables 字符串

我有一条这样的 iptables 规则:

iptables -t nat -I PREROUTING -p tcp --dport 80 -s 192.168.1.2 -j DNAT --到目标 192.168.1.1:80

它运行完美..但我只想重定向一个 URL,如下所示:

iptables -t nat -I PREROUTING -p tcp --dport 80 -s 192.168.1.2 -m string --string “google.com” -j DNAT --to-destination 192.168.1.1:80

这根本不起作用...请帮助我

答案1

这行不通。只有每个连接的第一个数据包会穿过 NAT 表。只有在第三个数据包(即带有有效负载的数据包)中才会显示字符串。

如果您不想在浏览器中进行配置,则应该使用代理在透明模式下执行此操作。

答案2

这些规则的作用是一样的。无论匹配哪一条,结果都是一样的。

任何能够匹配第二条规则的数据包都已经匹配了第一条规则。即使一个数据包做过匹配第二条规则,它不会做与第一条规则不同的事情。(实际上,Iain 正确地指出了-I规则中的,这意味着规则实际上是相反的顺序。)

我应该警告你,尝试以你现在的方式改变数据包流不会像你预期的那样工作。IPTables 的工作方式是水平,而不是联系级别。带有 的规则--string "google.com"将匹配此页面上包含字符串“google.com”但不包含任何 TCP 握手部分的数据包,也不匹配任何其他不包含“google.com”的数据包。此页面目前约为 45KB,大约有 30 个数据包,其中只有两个匹配。带有 的规则--string "google.com"可能不会匹配来自 Google 实际主页的任何数据包。如果 DNS 请求恰好通过 TCP 完成,它可能会重定向 DNS 请求。

正如 @diegows 在他的回答中指出的那样,只有任何 TCP 连接的第一个数据包会穿过 nat 表,因为您无法在 TCP 连接中间重定向数据包并期望它能正常工作,所以他们不让这成为可能。即使您将这种规则放在不同的表中,它仍然不起作用。

相关内容