【问题标题】:Can iptables allow DNS queries only for a certain domain name?iptables 可以只允许对某个域名进行 DNS 查询吗?
【发布时间】:2012-12-15 08:08:54
【问题描述】:

我现在有 iptables 阻止所有 UDP 流量,但是我想只允许某些 DNS 查询通过。

让我们以 google.com 为例。

我正在尝试使用字符串匹配来查找请求中的域名,并允许它。这就是我想出的。

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --string "google.com" --algo bm -j ACCEPT

我也尝试过--dport 53 而不是--sport。没有骰子。

如果有人知道如何做到这一点或看到我出错的地方,我们将不胜感激!

谢谢, 震动

【问题讨论】:

    标签: linux dns iptables


    【解决方案1】:

    我知道这有点晚了,但既然你还没有结束这个问题......

    如果你在wireshark或类似软件中查看DNS请求包的内容,你会发现没有使用点字符。域名的每一部分都是一个计数字符串,所以google.com请求的实际字节数为:

    06 67 6f 6f 67 6c 65 03 63 6f 6d
    

    第一个字节 (06) 是 google 的长度,然后是 6 个 ASCII 字符,然后是 com 长度的计数字节 (03),然后是......你明白了。

    要在 iptables 中匹配此内容,请使用以下内容:

    iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --hex-string "|06|google|03|com" -algo bm -j ACCEPT
    

    --hex-string 参数解析提供的字符串以查找由垂直条对分隔的十六进制值。竖线之外的任何内容都被解释为 ASCII 文本。

    如果您在添加条目后列出 OUTPUT 表,您会发现以下内容:

    ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain STRING match  "|06676f6f676c6503636f6d|" ALGO name bm TO 65535
    

    您可以通过使用--from--to 参数限制搜索范围来稍微调整规则并加快速度。

    【讨论】:

    • 好人,你节省了很多时间。虽然这需要时间来验证。
    • 为什么算法类型是 bm (Boyer-Moore)?
    • @GauravKansal 从记忆中,这是我在执行此操作时可以找到的所有示例中使用的那个。另一种选择是 Knuth-Morris-Pratt,在这种情况下,它不一定比 Boyer-Moore 快,而且开销可能略高。我无法确认这一点,因为我没有进行任何测试。
    • 这个答案很棒,我很高兴地采纳了它!但是,应该指出的是,从技术上讲,可以使用多个问题来制作 DNS 查询,只要允许的主机也在 DNS 查询的问题部分中,就允许某人解析任意主机。不过,很少支持带有多个问题的 DNS 查询。
    • @Corey 如果规则会拒绝对某个域的请求,是的。但最初的任务(和我的)是只允许某些主机。如果您随后在问题部分中使用至少一个允许的主机制作多 DNS 查询,则可以通过将其添加到问题部分来查询任何主机。
    【解决方案2】:

    我发现带点的字符串不可靠。

    这将起作用:

    iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 2021-05-12
      • 2017-06-08
      • 2012-07-28
      • 1970-01-01
      相关资源
      最近更新 更多