iptables可通过limit和connlimit模块限制SYN包速率及单IP并发半连接数来缓解SYN洪水攻击,但需结合SYN Cookie、调优内核参数等机制才有效。

iptables 可以通过限制每秒新建连接数来缓解 SYN 洪水攻击,核心是用 limit 和 connlimit 模块配合 SYN 标志进行过滤,但要注意:单纯限速不能完全阻止攻击,需结合状态跟踪、SYN Cookie 等机制才更有效。
识别并匹配 SYN 数据包
SYN 洪水攻击的特点是大量只发 SYN、不完成三次握手的连接请求。iptables 需精准匹配这类包:
- 使用
-p tcp --syn匹配 TCP SYN 包(比--tcp-flags更简洁可靠) - 避免用
-m state --state NEW,因未完成握手的连接在 conntrack 中可能不被识别为 NEW - 规则应放在 INPUT 链靠前位置,确保在连接跟踪前生效
每秒限制新建 SYN 连接数
用 limit 模块控制单位时间内的 SYN 包数量,适合防御轻量级泛洪:
- 示例命令:
iptables -A INPUT -p tcp --syn -m limit --limit 10/sec --limit-burst 20 -j ACCEPT -
--limit 10/sec表示平均允许每秒 10 个 SYN 包 -
--limit-burst 20是初始令牌桶容量,允许短时突发(如页面加载引发的合法并发) - 超出后建议跳过后续规则或直接 DROP,不要用 REJECT(会触发 RST,增加攻击者探测反馈)
按源 IP 限制并发半连接数
防止单个恶意 IP 发起大量半开连接,用 connlimit 限制每个 IP 的未完成连接数:
- 示例命令:
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 -j DROP -
--connlimit-above 50表示单个 IPv4 地址同时超过 50 个 SYN_RECV 状态连接即丢弃 -
--connlimit-mask 32表示按 /32(单 IP)统计;若需按网段限流(如防扫描器),可设为 24 - 该规则依赖连接跟踪模块(nf_conntrack),确保
nf_conntrack_tcp_be_liberal=1已启用以提升半连接识别率
配套加固建议
iptables 规则只是第一道防线,必须配合内核参数调优才能真正提升抗压能力:
- 启用 SYN Cookie:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies(内核自动处理超量 SYN,无需分配内存) - 缩短半连接队列超时:
echo 30 > /proc/sys/net/ipv4/tcp_synack_retries(默认 5 次重试约 218 秒,减至 30 秒加快清理) - 调小 SYN 队列长度:
echo 512 > /proc/sys/net/ipv4/tcp_max_syn_backlog(避免队列过大导致资源耗尽) - 记录被限流的 IP(可选):
iptables -A INPUT -p tcp --syn -m limit --limit 5/min -j LOG --log-prefix "SYN-FLOOD: ",便于事后分析









