在Linux中如何进行域过滤?


12

最好是类似的东西iptables。基本上,我想像在中的IP一样进行域过滤/白名单/黑名单iptables。关于如何执行此操作有什么建议吗?


您什么/为什么要阻止?您是否要过滤传出/传入的HTTP或SMTP或NTP?不同的工具可以用于不同的场景。
克里克


1
@josten理想情况下,您将使用像Squid这样的HTTP代理。阻止域名中iptables可以做到,但它可能是冒险的

Answers:


8

如果使用带有iptables规则的名称解析来丢弃流量,则将在创建该规则期间解析名称。如果发生更改,您的规则将不再有效。这可能是一个解决方案(不是beautyfull的解决方案...):

# iptables -I FORWARD -p udp --dport 53 -m string --hex-string "|03|www|08|facebook|03|com" --algo bm -j DROP

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

# host www.facebook.com
www.facebook.com A record not found, try again

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

用pipe (|03|www|08|facebook|03|com)分隔的十六进制数字表示.dns查询上的点simbol。它会说出以下几个字符将代表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.....

但要记住:

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

资料来源:这里这里


为什么算法类型是bm?
Gaurav Kansal

算法博耶-穆尔- en.wikipedia.org/wiki/...

4

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

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

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

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

# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...

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

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

但:

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

3

对于列入黑名单的最简单方法可能是使用dnsmasq

安装 dnsmasq

$ sudo apt-get install dnsmasq

并将此行添加到 /etc/dnsmasq.conf

address=/facebook.com/127.0.0.1

这将阻止facebook.com及其所有子域。

注:为Ubuntu看到这个帖子


1

如果运行本地缓存bind9,通常可以通过 dummy-block

zone "facebook.com" { type master; file "dummy-block"; };

dummy-block文件:

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                          2         ; Serial
                     604800         ; Refresh
                      86400         ; Retry
                    2419200         ; Expire
                     604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
*       IN      A       127.0.0.1   

也可以看看:

facebook.com示例运行BIND9和ISC-DHCP

一种基于DNS的简单方法来阻止Web广告

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.