Linux防火墙如何防止DNS劫持
导读:Linux防火墙防止DNS劫持的关键措施 1. 配置防火墙规则限制DNS流量访问 通过iptables/nftables设置严格规则,仅允许受信任的DNS服务器或本地服务访问DNS端口(UDP 53/TCP 53),阻断非法DNS查询或响应...
Linux防火墙防止DNS劫持的关键措施
1. 配置防火墙规则限制DNS流量访问
通过iptables/nftables设置严格规则,仅允许受信任的DNS服务器或本地服务访问DNS端口(UDP 53/TCP 53),阻断非法DNS查询或响应。
- 拒绝外部DNS回复,仅允许本地解析服务:若使用本地DNS缓存(如unbound/dnsmasq),可禁止外部对53端口的回复,防止劫持者伪造响应。
iptables -A OUTPUT -p udp --dport 53 -j DROP # 阻止外部UDP DNS回复 iptables -A OUTPUT -p tcp --dport 53 -j DROP # 阻止外部TCP DNS回复 - 限制DNS查询来源:仅允许内部网络或特定IP访问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)保存规则,避免重启失效。
2. 强制使用加密DNS协议(DoT/DoH)
通过加密DNS流量(如DNS over TLS/HTTPS),防止中间人攻击篡改DNS响应。
- DNS over TLS(DoT):使用stubby或systemd-resolved配置加密上游DNS。例如,stubby配置文件
/etc/stubby/stubby.yml中指定可信DNS服务器:启动stubby: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"systemctl enable --now stubby。 - DNS over HTTPS(DoH):使用cloudflared或dnscrypt-proxy将DNS请求隧道化。例如,cloudflared代理DNS:
修改cloudflared proxy-dns --port 5053 --upstream https://1.1.1.1/dns-query/etc/resolv.conf指向本地代理:nameserver 127.0.0.1#5053。
3. 启用DNSSEC验证
DNSSEC通过数字签名验证DNS数据的完整性和来源真实性,防止伪造解析结果。
- 配置本地DNS解析器支持DNSSEC:以unbound为例,在
/etc/unbound/unbound.conf中启用验证:
重启unbound:server: val-permissive-mode: no # 严格验证模式 auto-trust-anchor-file: "/var/lib/unbound/root.key" # 自动信任根锚点systemctl restart unbound。 - 验证DNSSEC生效:使用dig命令查询已知存在DNSSEC签名的域名(如
sigfail.verteiltesysteme.net),若返回SERVFAIL则表示验证成功(未通过验证的域名会返回正常结果)。
4. 监控与审计DNS流量
通过日志分析及时发现异常DNS查询(如大量失败查询、异常IP解析),快速响应劫持行为。
- 查看DNS查询日志:若使用bind9,可开启查询日志(
logging { channel query_log { file "/var/log/named/query.log"; severity debug 3; } ; category queries { query_log; } ; } ;),或使用unbound的verbosity: 2记录详细日志。 - 实时监控DNS流量:使用tcpdump捕获DNS流量,检测异常请求:
结合工具(如ELK Stack、Splunk)分析日志,识别高频查询、陌生域名解析等异常。tcpdump -i eth0 -n port 53 -vv # 监控eth0接口的DNS流量
5. 配置严格的访问控制列表(ACL)
通过防火墙ACL限制DNS服务的访问范围,仅允许可信客户端或网络使用DNS服务。
- 基于IP的ACL:仅允许内部网段访问DNS服务器,拒绝外部IP:
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 - 基于服务的ACL:若DNS服务器仅需响应特定域名(如公司内部域名),可配置条件转发(如BIND的
allow-query指令),限制查询范围。
通过以上措施,Linux防火墙可有效防止DNS劫持,提升DNS解析的安全性。需结合实际情况调整规则(如信任的DNS服务器、内网网段),并定期更新防火墙规则和DNS软件以应对新威胁。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux防火墙如何防止DNS劫持
本文地址: https://pptw.com/jishu/735799.html
