如何使用iptables正确阻止整个顶级域名(TLD)?
如何使用iptables正确阻止整个顶级域名(TLD)?
先给你说清楚:iptables本身没法直接识别顶级域名(比如.zip),因为它是工作在IP层的工具,只认IP地址、端口这些网络参数,不懂域名后缀那套逻辑。所以要实现阻止整个TLD,得绕个弯,结合DNS工具或者IP集合来做,下面给你两种实用的方法:
方法一:用dnsmasq+ipset+iptables(最推荐)
这种方法是让本地DNS把目标TLD的所有域名解析结果自动加入IP集合,再用iptables拦截这个集合,既高效又能覆盖动态变化的IP,适合长期使用。
先安装所需工具
- Debian/Ubuntu系统:
sudo apt install dnsmasq ipset - CentOS/RHEL系统:
sudo yum install dnsmasq ipset
- Debian/Ubuntu系统:
创建一个ipset集合,用来存放要阻止的TLD对应的IP
sudo ipset create block_tld_zip hash:ip timeout 86400这里的
timeout 86400是让IP自动过期(24小时),避免集合里堆积太多无效IP。配置dnsmasq,让它自动收集目标TLD的解析IP
编辑dnsmasq的配置文件(通常是/etc/dnsmasq.conf),添加一行:ipset=/zip/block_tld_zip意思是:所有
.zip域名的解析结果,都会自动添加到block_tld_zip这个ipset集合里。重启dnsmasq让配置生效
sudo systemctl restart dnsmasq添加iptables规则,拦截这个IP集合的流量
sudo iptables -I OUTPUT -m set --match-set block_tld_zip dst -j DROP这条规则的作用是:所有发往
block_tld_zip集合内IP的出站请求,直接丢弃。
方法二:用iptables字符串匹配(仅适用于未加密HTTP,不推荐)
如果你的场景只有未加密的HTTP流量(没有HTTPS),可以临时用iptables的字符串匹配模块,匹配请求里的域名后缀,但这个方法效率低,而且HTTPS流量里的域名是加密的,完全抓不到,所以只适合临时测试:
sudo iptables -I OUTPUT -p tcp --dport 80 -m string --string ".zip" --algo bm -j DROP
这里的--algo bm是用Boyer-Moore算法做字符串匹配,.zip就是要拦截的后缀。
注意事项
- 用方法一的话,要确保系统默认使用本地dnsmasq作为DNS服务器,不然用户用其他外部DNS(比如8.8.8.8)的话,dnsmasq就抓不到解析请求,规则会失效。可以把
/etc/resolv.conf里的nameserver改成127.0.0.1。 - ipset集合可以通过timeout参数自动清理过期IP,也可以手动用
ipset flush block_tld_zip清空集合。 - 对于像.zip这种风险TLD,除了iptables,最好再配合浏览器扩展或系统级DNS过滤,多一层防护更稳妥。
备注:内容来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

