【问题标题】:How can I drop packets matching the source URL如何丢弃与源 URL 匹配的数据包
【发布时间】:2014-08-11 16:21:28
【问题描述】:

我想阻止所有在源 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 中的字符串?

【问题讨论】:

  • 不确定是否可以深入研究这一层,匹配--string "Host: facebook.com"(来自 HTTP 请求标头)是否有帮助?
  • 它适用于某些网站(如 www.ku.edu),但不适用于 facebook :'(
  • 好的,那么我还有一条评论。 IPtables 不是您尝试做的事情的正确工具。调查这部分流量不是防火墙的工作。您需要的是具有内容过滤功能的代理服务器。喜欢 Squid+Dansguardian
  • 除非我严重误解了您的措辞(“在源 URL 中包含某些字符串的 tcp 数据包”),否则您似乎不了解 TCP 或防火墙。 TCP(或就此而言的 IP)不包含 URL,它们是位于顶部的另一个协议(例如 HTTP)的一部分。从 TCP 的角度来看,URL 是有效负载的一部分(它是一个不透明的 blob)。
  • 并非所有 TCP 数据包都有与其相关的 URL 或 URI。您正在寻找 TCP 级别以上的过滤...

标签: linux firewall iptables


【解决方案1】:

有一种简单的方法可以只匹配源 URL 中的字符串 包?

它适用于某些网站(如 www.ku.edu),但不适用于 脸书:'(

请注意,Facebook 使用 SSL,因此您不会在数据包中匹配任何字符串(它们将被加密)。它可能适用于 ku.edu,因为它是 HTTP 流量而不是 HTTPS。要使用 IP 表执行您想要的操作,您需要根据 IP 地址或主机名进行过滤。你可以试试-j DROP -d facebook.com 之类的东西。

同意 DanFromGermany 的观点,即 iptables 不是适合这项工作的工具。基于 IP 地址或主机名的阻止最初可能会起作用,但它可能会中断并且难以维护。我相信当iptables加载规则集时,DNS名称被解析为IP地址。这意味着如果 Facebook 更改其外部 IP(可能是由于故障转移或负载问题)或拥有多个 IP,它将无法正常工作。

【讨论】:

  • 是的,我遇到的最大问题是这个。当 facebook 更改其 IP 地址时,iptables 规则将不起作用,因为 iptables 仅在插入规则的那一刻解析地址。
  • 再一次,我真的相信 iptables 不是适合这项工作的工具,而且我要建议的内容非常骇人听闻……但是阻止 facebook 的另一种可能方法是阻止所有 DNS 请求匹配 facebook.com。
【解决方案2】:

首先,根据MAN页面,字符串过滤器接受“from”和“to”参数,限制搜索的字节范围。假设通过这台机器的数据包没有什么特别之处(即隧道或任何特殊标头),您可以将“from”指定为 40 字节(20 字节 IP 标头,20 字节 tcp 标头),“to”约为 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 会话,则必须像 John 建议的那样使用 -j DROP -d facebook.com。当然,这对于通过代理或隧道通过 HTTPS 访问 facebook 的人仍然不起作用,但它应该足以阻止大多数用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多