--limit 100/s 对 NTP/SSDP/CharGEN 放大攻击无效,因其不区分源IP、不跟踪会话,攻击者可用海量肉鸡低频发包绕过;须改用-m hashlimit按srcip,dstport组合限速,并配合rp_filter、服务加固与DROP策略。

为什么 --limit 100/s 对 NTP/SSDP/CharGEN 放大攻击基本无效
因为这些协议的反射放大攻击本质是「伪造源 IP 的 UDP 请求」,攻击流量根本不会触发连接状态,iptables 的 -m limit 在 INPUT 链上对单个目标端口限速时,只按「每秒匹配到的包数」计数,不区分源 IP、不跟踪会话。攻击者用百万级肉鸡发包,每个 IP 只打 1–2 个包/秒,--limit 100/s 完全拦不住——总流量轻松突破 Gbps,而规则认为“每个源都远低于阈值”。
真正有效的限速必须绑定源 IP + 端口组合
关键不是限制“本机某端口每秒收多少包”,而是限制“每个源 IP 向本机某端口每秒最多发几个包”。需配合 -m hashlimit(比 limit 更精准)或 -m connlimit(对已建连接有效,但 UDP 无连接,慎用)。
-
-m hashlimit --hashlimit-above 5/sec --hashlimit-burst 10 --hashlimit-mode srcip,dstport --hashlimit-name ntp_limit --hashlimit-htable-expire 60000:对每个srcip+dstport组合独立限速,超速丢包 - 必须加
--hashlimit-mode srcip,dstport,否则默认只按 srcip,会导致不同端口间误杀(比如封掉正常 HTTP 请求) -
--hashlimit-htable-expire 60000防止哈希表无限膨胀(单位毫秒),不设可能吃光内存 - NTP(端口 123)、SSDP(端口 1900)、CharGEN(端口 19)要分别写三条规则,不能合并
INPUT 链规则顺序和配套防护要点
限速规则必须放在所有 ACCEPT 规则之前,且优先于状态检测(-m state --state NEW)。否则包已被放行,限速形同虚设。
- 先 DROP 已知恶意 IP 段(用
ipset加载黑名单),再做 hashlimit,避免资源浪费在已知攻击源上 - 对 NTP 服务,如果无需对外提供,直接
-p udp --dport 123 -j DROP最彻底;若必须开放,确保ntpd或chronyd配置了restrict default kod nomodify notrap nopeer noquery - SSDP 和 CharGEN 基本没有合理公网暴露场景,建议直接禁用:
-p udp --dport 1900 -j DROP、-p udp --dport 19 -j DROP - 启用
net.ipv4.conf.all.rp_filter=1(反向路径过滤),能拦截部分伪造源 IP 的包,但不能替代 iptables 规则
验证规则是否生效的实操检查项
别只看 iptables -L -n -v 的包计数,要确认三件事:
- 执行
iptables -t filter -L INPUT -n -v | grep hashlimit,确认规则在 INPUT 链且位置靠前(行号小) - 用
cat /proc/net/ip_tables_names确保内核加载了ipt_hashlimit模块(没加载会静默跳过规则) - 模拟攻击测试:用
hping3 -2 -p 123 -i u10000 --flood attacker_ip(每秒 100 包),观察iptables -L INPUT -n -v中对应规则的 pkts 计数是否增长,且实际进到应用层的包极少 - 注意:
hashlimit的统计有轻微延迟(毫秒级),不要用watch -n 1看实时计数,改用iptables -L -n -v -x抓快照对比
UDP 反射放大攻击的防护粒度很细,--limit 100/s 这种全局速率限制只是幻觉。真实有效的规则必须带源识别、端口绑定、哈希表生命周期控制,且要和系统级防护(rp_filter、服务配置)配合。漏掉任意一环,就可能被绕过。










