我有一个像这样的iptables规则:
iptables -t nat -I PREROUTING -p tcp –dport 80 -s 192.168.1.2 -j DNAT – to-destination 192.168.1.1:80
它的作品完美..但我想redirect只有一个这样的url:
iptables -t nat -I PREROUTING -p tcp –dport 80 -s 192.168.1.2 -m string –string“google.com”-j DNAT – 到目的地192.168.1.1:80
这不以任何方式工作…请帮助我
这是行不通的。 只有每个连接的第一个数据包通过NAT表。 只有在第三个数据包中才能看到string。
你应该使用代理来做到这一点,如果你不想在浏览器中configuration它,那么你可以使用透明模式。
这些规则做同样的事情。 无论哪一个匹配,结果都是一样的。
任何可以匹配第二条规则的数据包都已经匹配了第一条规则。 即使数据包符合第二条规则,也不会做任何与第一条规则不同的事情。 (事实上,Iain在你的规则中正确地指出了这一点,这意味着规则实际上是相反的。
我应该警告你,试图改变数据包stream量的方式,你不会像你期望的那样工作。 IPTables工作在数据包级别,而不是连接级别。 带有--string "google.com"规则将匹配此页面上包含string“google.com”的数据包,但不包含TCP握手的任何部分,也不包含其他任何不包含的数据包“google.com”。 这个页面目前大约有45KB,大约有30个数据包,只有两个匹配。 带有--string "google.com"规则可能不会匹配来自Google实际主页的任何数据包。 它可能会redirectDNS请求,如果碰巧通过TCP完成。
正如@diegows在他的回答中指出的那样,只有TCP连接的第一个数据包通过nat表遍历,因为你不能在TCP连接的中间redirect数据包,并期望它能工作,所以它们不能实现。 即使你把这种规则放在不同的表格中,它仍然不起作用。