我想阻止源URL中包含某些字符串的所有传入tcp数据包。例如,我想阻止源URL包含“facebook.com”的所有包。
使用下面的命令,我可以阻止包含字符串“facebook.com”的任何包(输入,输出,转发)。问题是如果字符串“facebook.com”在数据包的html体内,这也将被阻止。
#iptables -A INPUT -i eth0 -m string --algo bm --string“facebook.com”-j DROP
#iptables -A OUTPUT -m string --algo bm --string“facebook.com”-j DROP
#iptables -A FORWARD -i eth0 -m string --algo bm --string“facebook.com”-j DROP
有一种简单的方法可以仅在数据包的源URL中匹配字符串吗?
答案 0 :(得分:1)
有一种简单的方法可以匹配字符串中的字符串 包?
它适用于某些网站(如www.ku.edu),但它不起作用 facebook:'(
请注意,Facebook使用SSL,因此您不会在数据包中进行任何字符串匹配(它们将被加密)。它可能适用于ku.edu,因为它是HTTP流量而不是HTTPS。要使用IP表执行所需操作,您需要根据IP地址或主机名进行过滤。你可以试试-j DROP -d facebook.com
之类的东西。
同意DanFromGermany的说法,iptables不适合这项工作。基于IP地址或主机名的阻止最初可能会起作用,但它可能会中断并且难以维护。我相信当iptables加载规则集时,DNS名称将解析为IP地址。这意味着如果Facebook更改其外部IP(可能是由于故障转移或负载问题)或者有多个IP,它将无法工作。
答案 1 :(得分:0)
首先,根据MAN页面,字符串过滤器接受"来自"和"到"参数,限制搜索的字节范围。假设通过这台机器的数据包没有什么特别之处(即隧道或任何特殊的标题),你可以指定"来自"为40个字节(20个字节的IP头,20个字节的tcp头),"到"大约80(我建议查看一些样本包以验证这些数字)
其次,为了最大限度地减少误报,请尝试阻止包含facebook作为HTTP主机的请求数据包(即"主机:facebook.com"或者主机:www.facebook.com" ),我还将它限制为tcp(" -p tcp")和端口80.结果是这样的:
iptables -A OUTPUT -p tcp --dport 80 -m string --algo bm --from 40 --to 80 --string "Host: facebook.com" -j DROP
请注意,我目前在Windows计算机上无法验证语法。
无论如何,这对HTTPS会话没有帮助。如果你需要使用iptables阻止与facebook的HTTPS会话,你必须像约翰建议的那样使用-j DROP -d facebook.com
。当然,这仍然不能通过代理或隧道通过HTTPS访问Facebook,但它应该足以阻止大多数用户。