iptables无法按比例限速,但可通过hashlimit限单ip新建udp连接速率、限特定端口请求频率、丢弃异常短包、限制并发连接数等组合策略有效抑制udp反射ddos攻击。

iptables 本身不支持直接按“比例”限速(比如限制 UDP 流量占总带宽的 30%),但可以通过组合 connlimit、hashlimit、rate limit 和状态匹配等机制,在实际场景中有效抑制 UDP 反射式 DDoS 攻击——核心思路是:限制单 IP 的并发连接数、请求频率和连接新建速率,而非追求精确带宽占比。
限制单个源 IP 的 UDP 新建连接速率
反射攻击常依赖大量伪造源 IP 的 UDP 请求(如 DNS、NTP、SNMP)。用 hashlimit 对每源 IP 的新建 UDP 连接做速率控制,能快速过滤异常流量:
- 示例规则(每秒最多 5 个新 UDP 连接,超过则丢弃):
iptables -A INPUT -p udp -m state --state NEW -m hashlimit --hashlimit-above 5/sec --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name udp_new_per_ip -j DROP-
关键点:使用
--hashlimit-mode srcip按源 IP 统计;--hashlimit-burst允许短时突发,避免误伤正常客户端;--hashlimit-name需唯一,用于内核哈希表标识。
限制特定端口的 UDP 请求频率(如 DNS/SSDP/NTP)
针对已知易被滥用的 UDP 端口(53、1900、123 等),可单独设置更严格的请求频率上限:
- 例如限制 DNS 查询(UDP 53)每分钟最多 60 次:
iptables -A INPUT -p udp --dport 53 -m hashlimit --hashlimit-above 1/min --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name dns_qps -j DROP-
说明:
1/min表示平均每分钟 1 个包,配合--hashlimit-burst 5允许初始最多 5 个包;适合防御慢速扫描或低频反射探测。
阻止无状态、高频的 UDP 扫描与洪泛
真实反射攻击中,攻击者常发送大量无响应需求的 UDP 包(如空载荷、随机端口)。可结合长度和状态进一步过滤:
- 丢弃极短 UDP 包(常见于探测):
-
iptables -A INPUT -p udp -m length --length 0:28 -j DROP(UDP 头 8 字节 + IP 头最小 20 字节 = 28 字节,低于此多为异常) - 拒绝非 ESTABLISHED/RELATED 的 UDP 回包(防 spoofed 响应):
-
iptables -A INPUT -p udp ! -m state --state ESTABLISHED,RELATED -j DROP(需确保连接跟踪模块已启用:nf_conntrack_udp)
配合 connlimit 控制并发 UDP 会话数
即使速率不高,大量并发 UDP “会话”(如 DNS 多查询未响应)也会耗尽连接跟踪表。用 connlimit 限制单 IP 最大并发连接数:
- 例如限制每个 IP 最多 20 个 UDP 连接:
iptables -A INPUT -p udp -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP-
注意:UDP 连接状态由 conntrack 模拟,依赖超时设置(
/proc/sys/net/netfilter/nf_conntrack_udp_timeout默认 30 秒),建议调低至 10–15 秒以加快释放。
不复杂但容易忽略:这些规则需放在 INPUT 链靠前位置(在 ACCEPT 之前),并确保 nf_conntrack 和 ipt_hashlimit 内核模块已加载。真实防护还需结合应用层限速(如 DNS 服务器自身的 query-per-IP 限制)与网络层黑洞路由(BGP Flowspec 或上游清洗)。单纯靠 iptables 无法替代带宽整形或专用抗 DDoS 设备,但它是第一道轻量、可控的防线。










