iptables通过limit(全局速率)和hashlimit(按源ip限速)模块控制新建连接频率,再配合connlimit限制并发连接数,并需启用tcp_syncookies等内核防护机制实现完整dos防御。

iptables 本身不直接限制“连接速率”这个抽象概念,而是通过 limit 和 hashlimit 两个核心模块,分别实现全局或按源 IP 的新建连接频率控制,从而有效缓解 SYN Flood、HTTP 扫描、UDP 反射等典型 DoS 行为。
用 limit 模块做全局速率控制(适合基础防护)
limit 基于令牌桶算法,统计的是每秒匹配规则的数据包数量,不是连接数。但它配合 --syn 可间接限制新 TCP 连接发起频率,对防低强度洪水或扫描很实用。
- 规则必须成对:先放行合规流量,再丢弃超限包,否则所有 SYN 都被拦住
- 示例(每秒最多 3 个新 SYN,突发允许 6 个):
iptables -A INPUT -p tcp --syn -m limit --limit 3/s --limit-burst 6 -j ACCEPTiptables -A INPUT -p tcp --syn -j DROP - 注意:该策略对 UDP 无效;所有 IP 共享一个令牌桶,无法区分攻击源
用 hashlimit 模块按源 IP 限速(推荐用于 CC/UDP 防护)
hashlimit 为每个源 IP 维护独立计数器,支持老化、分组和多维统计,是防御 CC 攻击和 UDP 反射的核心手段。
- 关键参数:
--hashlimit-mode srcip(按客户端 IP)、--hashlimit-above(超阈值触发动作)、--hashlimit-burst(防误杀) - HTTP 防护示例(每个 IP 每秒最多 10 个新连接):
iptables -I INPUT -p tcp --dport 80 --syn -m hashlimit \<br> --hashlimit-above 10/sec \<br> --hashlimit-burst 30 \<br> --hashlimit-mode srcip \<br> --hashlimit-name http_per_ip \<br> -j DROP
- UDP 防护示例(DNS 端口,每分钟最多 60 次请求):
iptables -A INPUT -p udp --dport 53 -m state --state NEW -m hashlimit \<br> --hashlimit-above 60/min \<br> --hashlimit-burst 5 \<br> --hashlimit-mode srcip \<br> --hashlimit-name dns_qpm \<br> -j DROP
搭配 connlimit 控制并发连接数(补 rate-limit 不足)
rate-limit 管的是“新建速度”,connlimit 管的是“同时存在多少连接”。两者互补,才能覆盖 DoS 全链路。
- Web 服务建议上限 30–100 个并发连接(视业务而定):
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP - SSH 更严格,建议设为 5~10:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 -j DROP - 可结合 recent 模块自动封禁频繁超限的 IP,提升响应效率
必须同步启用的内核级防护
iptables 规则只是外层过滤,底层需开启系统级机制增强鲁棒性:
- 启用 SYN cookies:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies,防止连接队列溢出 - 丢弃 INVALID 状态包:
iptables -A INPUT -m state --state INVALID -j DROP,清理畸形会话 - 默认策略设为 DROP,并优先放行回环、已建立连接(ESTABLISHED,RELATED)和必要端口











