通过iptables/nftables设置严格规则,仅允许受信任的DNS服务器或本地服务访问DNS端口(UDP 53/TCP 53),阻断非法DNS查询或响应。
iptables -A OUTPUT -p udp --dport 53 -j DROP # 阻止外部UDP DNS回复
iptables -A OUTPUT -p tcp --dport 53 -j DROP # 阻止外部TCP DNS回复
iptables -A INPUT -p udp --dport 53 -s 192.168.1.0/24 -j ACCEPT # 允许内网UDP查询
iptables -A INPUT -p tcp --dport 53 -s 192.168.1.0/24 -j ACCEPT # 允许内网TCP查询
iptables -A INPUT -p udp --dport 53 -j DROP # 拒绝其他UDP查询
iptables -A INPUT -p tcp --dport 53 -j DROP # 拒绝其他TCP查询
iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或service iptables save(CentOS/RHEL)保存规则,避免重启失效。通过加密DNS流量(如DNS over TLS/HTTPS),防止中间人攻击篡改DNS响应。
/etc/stubby/stubby.yml中指定可信DNS服务器:upstream_recursive_servers:
- address_data: 1.1.1.1 # Cloudflare DoT
tls_auth_name: "cloudflare-dns.com"
- address_data: 9.9.9.9 # Quad9 DoT
tls_auth_name: "dns.quad9.net"
启动stubby:systemctl enable --now stubby。cloudflared proxy-dns --port 5053 --upstream https://1.1.1.1/dns-query
修改/etc/resolv.conf指向本地代理:nameserver 127.0.0.1#5053。DNSSEC通过数字签名验证DNS数据的完整性和来源真实性,防止伪造解析结果。
/etc/unbound/unbound.conf中启用验证:server:
val-permissive-mode: no # 严格验证模式
auto-trust-anchor-file: "/var/lib/unbound/root.key" # 自动信任根锚点
重启unbound:systemctl restart unbound。sigfail.verteiltesysteme.net),若返回SERVFAIL则表示验证成功(未通过验证的域名会返回正常结果)。通过日志分析及时发现异常DNS查询(如大量失败查询、异常IP解析),快速响应劫持行为。
logging { channel query_log { file "/var/log/named/query.log"; severity debug 3; }; category queries { query_log; }; };),或使用unbound的verbosity: 2记录详细日志。tcpdump -i eth0 -n port 53 -vv # 监控eth0接口的DNS流量
结合工具(如ELK Stack、Splunk)分析日志,识别高频查询、陌生域名解析等异常。通过防火墙ACL限制DNS服务的访问范围,仅允许可信客户端或网络使用DNS服务。
iptables -A INPUT -p udp --dport 53 -s 10.0.0.0/8 -j ACCEPT # 允许内网10.0.0.0/8
iptables -A INPUT -p tcp --dport 53 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j DROP
iptables -A INPUT -p tcp --dport 53 -j DROP
allow-query指令),限制查询范围。通过以上措施,Linux防火墙可有效防止DNS劫持,提升DNS解析的安全性。需结合实际情况调整规则(如信任的DNS服务器、内网网段),并定期更新防火墙规则和DNS软件以应对新威胁。