使用iptables 禁止 DNS 流量(通常使用 53 端口),可以通过以下几种方式实现:
1.禁止所有 DNS 请求/响应
禁止 UDP 53 端口出站 iptables -A OUTPUT -p udp --dport 53 -j DROP 禁止 TCP 53 端口出站(DNS 大型查询使用) iptables -A OUTPUT -p tcp --dport 53 -j DROP
禁止 UDP 53 端口入站 iptables -A INPUT -p udp --dport 53 -j DROP 禁止 TCP 53 端口入站 iptables -A INPUT -p tcp --dport 53 -j DROP
2.禁止特定网络接口的 DNS
iptables -A OUTPUT -o eth0 -p udp --dport 53 -j DROP iptables -A OUTPUT -o eth0 -p tcp --dport 53 -j DROP
3.允许本地回环但禁止外部 DNS
允许本地 DNS(127.0.0.1) iptables -A OUTPUT -d 127.0.0.1 -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -d 127.0.0.1 -p tcp --dport 53 -j ACCEPT 允许特定内部 DNS 服务器(如 192.168.1.1) iptables -A OUTPUT -d 192.168.1.1 -p udp --dport 53 -j ACCEPT 禁止所有其他 DNS 流量 iptables -A OUTPUT -p udp --dport 53 -j DROP iptables -A OUTPUT -p tcp --dport 53 -j DROP
4.使用 ipset 批量管理 DNS 服务器
创建 ipset ipset create dns_servers hash:ip 添加公共 DNS 服务器到黑名单 ipset add dns_servers 8.8.8.8 ipset add dns_servers 8.8.4.4 ipset add dns_servers 1.1.1.1 ipset add dns_servers 9.9.9.9 禁止访问这些 DNS 服务器 iptables -A OUTPUT -m set --match-set dns_servers dst -p udp --dport 53 -j DROP iptables -A OUTPUT -m set --match-set dns_servers dst -p tcp --dport 53 -j DROP
5.允许特定进程/用户使用 DNS
只允许特定用户(如用户ID 1000)使用 DNS iptables -A OUTPUT -p udp --dport 53 -m owner --uid-owner 1000 -j ACCEPT iptables -A OUTPUT -p tcp --dport 53 -m owner --uid-owner 1000 -j ACCEPT iptables -A OUTPUT -p udp --dport 53 -j DROP iptables -A OUTPUT -p tcp --dport 53 -j DROP 只允许特定进程(如 dnsmasq) 首先找到进程的 GID getent group dnsmasq 然后基于 GID 允许 iptables -A OUTPUT -p udp --dport 53 -m owner --gid-owner 117 -j ACCEPT
6.完整示例:只允许特定 DNS 服务器
#!/bin/bash 清除现有规则 iptables -F iptables -X 设置默认策略 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许本地回环 iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -i lo -j ACCEPT 只允许访问公司内部 DNS 服务器(10.0.0.1) iptables -A OUTPUT -p udp -d 10.0.0.1 --dport 53 -j ACCEPT iptables -A OUTPUT -p tcp -d 10.0.0.1 --dport 53 -j ACCEPT 禁止所有其他 DNS 流量 iptables -A OUTPUT -p udp --dport 53 -j DROP iptables -A OUTPUT -p tcp --dport 53 -j DROP 允许其他必要的服务(如 HTTP、HTTPS、SSH 等) iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
7.保存规则
CentOS/RHEL 7+ iptables-save > /etc/sysconfig/iptables 或 service iptables save Ubuntu/Debian iptables-save > /etc/iptables/rules.v4 安装持久化工具(Ubuntu) apt-get install iptables-persistent
8.检查规则
查看所有规则 iptables -L -n -v 查看 OUTPUT 链规则 iptables -L OUTPUT -n -v 查看带行号的规则(便于删除) iptables -L OUTPUT -n --line-numbers
注意事项:
1、测试前请确保有其他访问方式(如控制台),避免规则错误导致无法远程连接
2、考虑 DNS over TLS/HTTPS:现代应用可能使用 853 端口(DoT)或 443 端口(DoH)
3、保留必要的本地 DNS:系统服务可能需要本地 DNS 解析
4、规则顺序很重要:iptables 按顺序匹配规则,确保允许规则在拒绝规则之前
对于 DNS over HTTPS(DoH),你可能还需要屏蔽相关端口:
iptables -A OUTPUT -p tcp --dport 443 -m string --string "application/dns-message" --algo bm -j DROP iptables -A OUTPUT -p tcp --dport 443 -m string --string "dns.google" --algo bm -j DROP
请根据实际需求选择合适的方法,并在生产环境前进行充分测试。
文章摘自:https://idc.huochengrm.cn/dns/23966.html
评论
丘香梅
回复iptables可以通过配置规则禁止DNS解析,具体做法是设置DN端口(53)的入站和出站规则为DROP,从而阻止所有DNS请求和响应。
战梦槐
回复iptables通过设置规则禁止DNS解析,具体操作是创建一条拒绝所有针对53端口(DNS端口)的入站连接的规则,并确保该规则位于链的顶端,从而阻止DNS请求的发送。