iptables怎么禁止dns?

HCRM技术_小炮 DNS 2026-03-06 73 2

使用iptables 禁止 DNS 流量(通常使用 53 端口),可以通过以下几种方式实现:

1.禁止所有 DNS 请求/响应

禁止所有出站 DNS 查询:

禁止 UDP 53 端口出站
iptables -A OUTPUT -p udp --dport 53 -j DROP
禁止 TCP 53 端口出站(DNS 大型查询使用)
iptables -A OUTPUT -p tcp --dport 53 -j DROP

禁止所有入站 DNS 响应:

禁止 UDP 53 端口入站
iptables -A INPUT -p udp --dport 53 -j DROP
禁止 TCP 53 端口入站
iptables -A INPUT -p tcp --dport 53 -j DROP

2.禁止特定网络接口的 DNS

只禁止 eth0 接口的 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

评论

精彩评论
  • 2026-04-19 10:24:43

    iptables可以通过配置规则禁止DNS解析,具体做法是设置DN端口(53)的入站和出站规则为DROP,从而阻止所有DNS请求和响应。

  • 2026-07-15 12:37:47

    iptables通过设置规则禁止DNS解析,具体操作是创建一条拒绝所有针对53端口(DNS端口)的入站连接的规则,并确保该规则位于链的顶端,从而阻止DNS请求的发送。