如何通过iptables在路由器上阻断Google DNS服务器(8.8.8.8)?
如何通过iptables在路由器上阻断Google DNS服务器(8.8.8.8)?
嘿,我来帮你搞定这个问题!先说说为啥你的现有规则没拦住DNS流量,再给你正确的配置,最后把你困惑的链(chain)和源/目标(source/destination)的区别讲明白。
一、你的规则为啥没生效?
你现在用dns.google这个域名来配置规则,但iptables只会在加载规则的那一刻解析一次域名,如果dns.google解析到多个IP(比如Google DNS还有8.8.4.4),或者之后IP有变化,规则就可能没覆盖到你要阻断的8.8.8.8。这就是为啥ping被拦住了,但DNS查询还能通的核心原因。
二、正确的阻断配置
咱们直接用IP地址来配置,精准阻断8.8.8.8的DNS服务(DNS主要用UDP 53端口,大体积查询会用到TCP 53端口,所以两个都要拦):
1. 先删除现有规则(避免冲突)
# 删除INPUT链里的旧DROP规则 iptables -D INPUT -s dns.google -j DROP iptables -D INPUT -d dns.google -j DROP # 删除FORWARD链里的旧DROP规则 iptables -D FORWARD -s dns.google -j DROP iptables -D FORWARD -d dns.google -j DROP # 删除OUTPUT链里的旧DROP规则 iptables -D OUTPUT -s dns.google -j DROP iptables -D OUTPUT -d dns.google -j DROP
2. 添加精准的阻断规则
- 阻止内网机器使用8.8.8.8做DNS(用FORWARD链,因为内网机器的流量要经过路由器转发到外网):
# 阻断UDP 53(绝大多数DNS请求用这个协议) iptables -I FORWARD -d 8.8.8.8 -p udp --dport 53 -j DROP # 阻断TCP 53(大体积DNS查询会用到) iptables -I FORWARD -d 8.8.8.8 -p tcp --dport 53 -j DROP # 阻断返回的DNS响应流量(保险起见,加上更稳妥) iptables -I FORWARD -s 8.8.8.8 -p udp --sport 53 -j DROP iptables -I FORWARD -s 8.8.8.8 -p tcp --sport 53 -j DROP
- 如果还要阻止路由器自己用8.8.8.8做DNS,就添加OUTPUT链的规则:
iptables -I OUTPUT -d 8.8.8.8 -p udp --dport 53 -j DROP iptables -I OUTPUT -d 8.8.8.8 -p tcp --dport 53 -j DROP
3. 保存规则(避免重启路由器后丢失)
不同系统的保存命令不一样:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL:
service iptables save
三、关于iptables链和源/目标的区别
你之前的理解基本是对的,我再给你掰扯得更清楚:
- INPUT链:处理进入路由器本身的流量,比如内网机器访问路由器的管理界面,或者外网给路由器发的响应。
- 内网机器发请求给路由器:source是内网机器IP,destination是路由器IP。
- 外网机器给路由器发响应:source是外网IP(比如8.8.8.8),destination是路由器的公网IP。
- OUTPUT链:处理路由器自己发起的流量,比如路由器自己ping 8.8.8.8,或者路由器自身的DNS查询。
- source是路由器的IP(公网/内网,看目标地址),destination是目标IP(比如8.8.8.8)。
- FORWARD链:处理路由器转发的流量(这是内网机器和外网通信的核心链)。
- 内网机器访问8.8.8.8:source是内网机器IP,destination是8.8.8.8,流量走FORWARD链。
- 8.8.8.8给内网机器发响应:source是8.8.8.8,destination是内网机器IP,流量也走FORWARD链。
这样配置后,你再用内网机器测试nslookup superuser.com 8.8.8.8,应该就会超时或者失败了~
备注:内容来源于stack exchange,提问作者Dinamo
相关产品推荐
相关产品推荐

