iptables不能直接识别DNS放大攻击的恶意性,但可通过匹配UDP端口53、高频率请求、伪造源IP等特征限速或拦截;默认应拒绝所有外部DNS查询,仅允许可信源,并关闭开放递归以防止被用作反射源。

iptables 本身不能直接识别 DNS 放大攻击的“恶意性”,但可以通过匹配其典型流量特征(如 UDP 端口 53、异常高频率、伪造源 IP)进行有效拦截。关键不是“识别 DNS 请求是否合法”,而是限制可疑行为模式——比如非授权递归查询、单 IP 短时间内大量 UDP 53 请求。
封禁非法 DNS 查询来源
DNS 放大攻击常利用开放递归服务器,但你的服务器若不提供递归服务,所有外部发往 53 端口的 UDP 请求都应被拒绝或严格限速。
- 默认禁止所有入站 DNS 查询(除非你明确运行权威 DNS 服务):
iptables -A INPUT -p udp --dport 53 -j DROP - 若需保留本地解析(如 systemd-resolved 或 bind 作为客户端),只允许回环和可信内网:
iptables -A INPUT -p udp --dport 53 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j DROP
对 UDP 53 实施连接速率限制
攻击者常以极高速率发送伪造源 IP 的 DNS 查询包。用 limit 模块可抑制突发流量,避免规则被绕过:
- 限制每个源 IP 每秒最多 3 个新 DNS 查询(适合轻量服务):
iptables -A INPUT -p udp --dport 53 -m state --state NEW -m limit --limit 3/second --limit-burst 6 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -m state --state NEW -j DROP - 注意:
--state NEW只匹配新建连接(UDP 会话首包),不干扰已有响应;--limit-burst允许短时突发,避免误伤正常批量查询。
阻断已知攻击源 IP 或网段
若通过流量分析(如 tcpdump + awk 统计)发现高频攻击 IP,可立即封禁:
- 单 IP 封禁:
iptables -I INPUT -s 192.0.2.45 -j DROP(-I插入顶部,优先生效) - 批量封禁(配合脚本):
for ip in $(cat bad-ips.txt); do iptables -I INPUT -s $ip -j DROP; done - 封禁整个可疑 ASN 网段(如某 IDC 被滥用于反射攻击):
iptables -I INPUT -s 203.0.113.0/24 -j DROP
防止自身成为反射源(关键自查)
iptables 只能拦 inbound 流量,但 DNS 放大攻击依赖你服务器响应伪造请求——所以必须确认:你的 DNS 服务未开启开放递归。
- 检查 bind 配置:
recursion yes;必须仅出现在allow-recursion { 127.0.0.1; 192.168.0.0/16; };范围内 - 检查 unbound 或 dnsmasq 是否监听公网接口(
interface: 0.0.0.0是危险信号) - 用外部工具验证:
dig @your-server-ip google.com +norec应返回 REFUSED,而非成功响应


















