UDP 53/123 放大攻击的典型特征是:单IP毫秒级高频发包、目标端口固定为53或123、UDP无连接状态致state匹配失效、源IP分散但各IP发包规律。

UDP 53/123 放大攻击的典型特征是什么
这类攻击利用 DNS(端口 53)或 NTP(端口 123)等无状态协议,伪造源 IP 向开放服务发送小请求,诱使服务器返回远大于请求的响应,从而放大流量打向受害者。真实攻击包往往表现为:单个源 IP 在极短时间内(毫秒级)高频发包、目标端口固定、UDP 报文无连接上下文、iptables 的 state 匹配几乎无效。
- 源 IP 高度分散(常为僵尸网络),但单个 IP 可能在一秒内发几十到上百个 UDP 包
- 目标端口集中在
53或123,且目的地址是本机(非转发) -
conntrack表里基本无对应条目,-m state --state NEW不起作用 - 单纯 DROP 所有
udp dpt:53会误杀正常 DNS 查询,必须做速率区分
用 hashlimit 做 per-IP 限速比 limit 更可靠
limit 模块对所有匹配包共享一个全局令牌桶,无法识别不同源 IP;而 hashlimit 可按 srcip(甚至 srcip,dstport)哈希分桶,真正实现“每个 IP 各自受限”。这对放大攻击尤其关键——攻击者通常不会只用一个 IP 狂刷,但每个 IP 的发包节奏又足够规律。
- 必须指定
--hashlimit-mode srcip,否则默认行为可能不生效 - 推荐搭配
--hashlimit-burst 3和--hashlimit-avg 1/sec:允许突发 3 包,之后限为每秒最多 1 包 - 使用
--hashlimit-name dns_flood(名称需唯一,避免冲突) - 规则要放在
INPUT链靠前位置(在 ACCEPT 已有规则之前),否则可能被跳过
示例命令(临时防御 DNS 放大):
iptables -I INPUT -p udp --dport 53 -m hashlimit --hashlimit-above 1/sec --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-name dns_flood -j DROP
为什么 rate-limit 要配合 recent 模块做二次拦截
hashlimit 能压住单 IP 流量,但攻击者可快速换一批 IP 绕过。此时需要记录“刚被限速过的 IP”,并在后续几秒内直接 DROP——这正是 recent 模块的用途。它把 IP 写入内存列表,支持超时(--seconds)和命中计数(--rcheck / --update)。
- 先用
hashlimit触发限速,再用-m recent --name dns_bad --set标记该 IP - 紧接着加一条规则:
-m recent --name dns_bad --rcheck --seconds 60 -j DROP,让该 IP 接下来 60 秒内所有 UDP 53 包都被丢弃 - 注意
--set和--rcheck必须用同一个--name,且--rcheck规则要放在--set规则之前(否则逻辑顺序错乱)
实际部署时最容易忽略的三个点
-
hashlimit 的 --hashlimit-htable-size 默认值太小(如 1024),高并发攻击下哈希表溢出会导致限速失效;建议显式设为 --hashlimit-htable-size 4096
-
recent 模块的默认最大条目数(/proc/sys/net/netfilter/nf_conntrack_max 无关,而是 nfnetlink_log 相关参数)可能不足,可通过 modprobe xt_recent ip_list_tot=8192 加载时调整
- 所有规则都应加
-i eth0(替换为实际外网接口),避免影响内网管理流量;若机器做 DNS 转发,还需额外排除 -s 10.0.0.0/8 等可信段
hashlimit 的 --hashlimit-htable-size 默认值太小(如 1024),高并发攻击下哈希表溢出会导致限速失效;建议显式设为 --hashlimit-htable-size 4096 recent 模块的默认最大条目数(/proc/sys/net/netfilter/nf_conntrack_max 无关,而是 nfnetlink_log 相关参数)可能不足,可通过 modprobe xt_recent ip_list_tot=8192 加载时调整 -i eth0(替换为实际外网接口),避免影响内网管理流量;若机器做 DNS 转发,还需额外排除 -s 10.0.0.0/8 等可信段 规则不是加完就一劳永逸。攻击者会试探你的阈值,1/sec 对某些业务可能偏严,5/sec 又可能放行太多;得结合 tcpdump -n udp port 53 | head -20 和 iptables -L INPUT -nv 实时观察命中数来调。










