如何阻止指向某域名及其子域名的通配符出站流量?已尝试两种方法未生效
如何阻止指向某域名及其子域名的通配符出站流量?已尝试两种方法未生效
我完全理解你想彻底阻断某个域名及其所有子域名出站请求的需求,试了两种方法都没达到预期确实挺闹心的,咱们先分析下你之前的方法为啥没用,再给你几个靠谱的解决方案。
先说说你试过的两种方法问题出在哪
/etc/hosts.deny 无效的原因
这个文件的作用是限制入站服务的访问,比如拒绝某个IP连接你的SSH、FTP服务,根本管不到本机主动发起的出站请求。你写的这些规则:ALL : .domain.com ALL: .cdnsub.com对出站流量完全没影响,所以没用是正常的。
iptables 字符串匹配无效的原因
这个方法有两个致命问题:- 匹配范围太窄:你只写了精确匹配
Host: domain.com的规则,但子域名的Host头是Host: sub.domain.com,根本匹配不到; - HTTPS流量加密:现在绝大多数网站都是HTTPS,Host头是在TLS握手的SNI字段里加密传输的,iptables的
string模块抓不到加密后的内容,自然没法阻断HTTPS请求。
- 匹配范围太窄:你只写了精确匹配
推荐的有效解决方案
1. 最简单的方案:/etc/hosts 文件(适合已知所有子域名的场景)
把要阻止的域名和子域名全部指向0.0.0.0或者127.0.0.1,这样本机发起请求时会解析到无效IP,从而阻断访问:
0.0.0.0 domain.com 0.0.0.0 www.domain.com 0.0.0.0 cdnsub.com 0.0.0.0 img.cdnsub.com # 其他已知子域名都可以加在这里
缺点是如果有未知的子域名,没法自动覆盖,得手动添加。
2. 最省心的方案:用本地DNS服务器实现通配符阻断(推荐)
装个轻量的DNS服务器比如dnsmasq,它支持通配符解析,能一次性阻断所有子域名:
- 先安装dnsmasq(以Ubuntu为例):
sudo apt install dnsmasq - 编辑配置文件
/etc/dnsmasq.conf,添加通配符规则:
这两行的意思是,所有address=/domain.com/0.0.0.0 address=/cdnsub.com/0.0.0.0domain.com和cdnsub.com的子域名,都会被解析到0.0.0.0。 - 把本机的DNS设置为
127.0.0.1,让系统用dnsmasq来解析域名,最后重启dnsmasq生效:
这个方法能自动覆盖所有子域名,不管是已知还是未知的,非常省心。sudo systemctl restart dnsmasq
3. IP层面阻断:iptables + ipset(适合需要更底层控制的场景)
如果需要从IP层面阻断,可以用ipset来管理要阻断的IP,再配合iptables规则:
- 创建一个ipset集合:
sudo ipset create blocked_domains hash:ip - 写个脚本定期解析目标域名及其子域名的IP,添加到ipset里(可以用
cron定时运行):#!/bin/bash # 清空旧的IP sudo ipset flush blocked_domains # 解析目标域名及其子域名 for domain in domain.com *.domain.com cdnsub.com *.cdnsub.com; do dig +short $domain | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | while read ip; do sudo ipset add blocked_domains $ip done done - 添加iptables规则,阻断这个ipset集合的出站流量:
这个方法的好处是阻断IP层面的流量,但缺点是域名的IP可能会变,需要定期更新ipset里的内容。sudo iptables -A OUTPUT -m set --match-set blocked_domains dst -j DROP
备注:内容来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

