如何在 Linux 中进行域过滤?

14 linux firewall domain

最好是类似于iptables. 基本上,我想做域过滤/白名单/黑名单,就像我在iptables. 有没有关于如何做到这一点的建议?

小智 10

如果您使用带有 iptables 规则的名称解析来丢弃流量,则名称将在创建该规则期间进行解析。如果有什么变化,你的规则将不再有效。这可能是一个解决方案(不是一个美丽的......):

# iptables -I FORWARD -p udp --dport 53 -m string --hex-string "|03|www|08|facebook|03|com" --algo bm -j DROP
Run Code Online (Sandbox Code Playgroud)

从局域网内的另一台主机:

# host www.facebook.com
www.facebook.com A record not found, try again
Run Code Online (Sandbox Code Playgroud)

基本上,您是在对每个 dns packet( udp/53) 说www.facebook.com to要丢弃的十六进制字符串。请注意,这将丢弃名称解析,而不是 http 流量本身。

用管道(|03|www|08|facebook|03|com)分隔的十六进制数字是.dns 查询中点符号的表示。它将说明以下多少个字符将代表FQDN(主机、域、顶级域)的每个部分示例:

主持人: mail.google.com

十六进制表示: 04 6d 61 69 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d

“视觉表现: 04mail06google03com

使用 tcpdump 获取数据包:

# tcpdump -i eth0 -X dst port 53

15:50:11.643672 IP xxx.xxx.xxx.xxx:xxx > ns4.google.com.domain: 16530 A? mail.google.com. (33)
        0x0000:  4500 003d 779a 4000 4011 b390 c949 4742  E..=w.@.@....IGB
        0x0010:  d8ef 260a 8424 0035 0029 0fc0 4092 0000  ..&..$.5.)..@...
        0x0020:  0001 0000 0000 0000 046d 6169 6c06 676f  .........mail.go
        0x0030:  6f67 6c65 0363 6f6d 0000 0100 01         ogle.com.....
Run Code Online (Sandbox Code Playgroud)

但要记住:

  • 如果您尝试过滤更具体的流量,如 smtp、ftp 或 http,那么该协议的代理应该会更好。
  • 您正在“劫持”dns 查询而不是阻止域。用户没那么蠢 ;)

来源:这里这里


小智 5

也许你的问题的答案为时已晚,但最近我需要解决一个类似的问题,谷歌把我带到这里

在搜索失败后,我用 C 编写了一个小实用程序,用于拦截 DNS 响应,将其中的域名与给定的正则表达式进行比较,并列出匹配的 IP 地址。这是:https : //github.com/vmxdev/sidmat/

您不需要设置自己的 DNS 服务器,实用程序可以从任何服务器捕获 DNS 响应

例如,要查看现在已解析的 facebook.com(和子域)IP 地址,您可以运行

# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...
Run Code Online (Sandbox Code Playgroud)

其中 eth0 是路由器上的网络接口(或 DNS 响应通过的地方)

您可以轻松地将它与 iptables(或 iptables 与 ipset)集成

但:

  • 实用程序真的很简单。它不会执行很多检查,因此攻击者可以欺骗它
  • 如果用户不使用 DNS 进行名称解析,则此技术无用