iptables 防 syn flood 必须结合内核参数调优与多模块协同:启用 tcp_syncookies、扩大 tcp_max_syn_backlog、降低 tcp_synack_retries、开启 rp_filter;配合 limit 限速、recent 动态封禁,并验证规则命中与半连接数。

iptables 本身不跟踪连接状态,单靠包过滤无法真正抵御 SYN Flood。有效防护必须结合内核参数调优与 iptables 多模块协同,核心是“限速 + 记录 + 拦截 + 承压加固”四层配合。
启用并配置关键内核参数
这是底层承压基础,比 iptables 规则更关键:
-
开启 SYN Cookies:执行
echo 1 > /proc/sys/net/ipv4/tcp_syncookies,并写入/etc/sysctl.conf中的net.ipv4.tcp_syncookies = 1,它是半连接队列溢出时的最后防线 -
扩大半连接队列:将
net.ipv4.tcp_max_syn_backlog提高至 4096 或更高(如 32768),默认值 1024 在中高并发下极易打满 -
减少 SYN-ACK 重试次数:设为
net.ipv4.tcp_synack_retries = 3(默认 5),加快异常连接释放 -
启用反向路径过滤:
net.ipv4.conf.all.rp_filter = 1可过滤部分伪造源 IP 包(注意可能影响某些负载均衡架构)
修改后务必运行 sysctl -p 生效,并用 sysctl net.ipv4.tcp_syncookies 确认返回 1。
使用 limit 模块做速率限制
适合轻量级防护或作为第一道缓冲,防止突发流量误杀:
- 允许每秒最多 1 个新 SYN 请求,允许短时突发 3 个:
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m limit --limit 1/sec --limit-burst 3 -j ACCEPT - 其余未匹配的 SYN 包直接丢弃:
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j DROP
注意:该策略对 NAT 后或局域网客户端较友好,但阈值需按实际业务调整;例如高并发 Web 可放宽至 --limit 5/sec。
用 recent 模块实现动态 IP 封禁
比单纯限速更精准,能识别并拉黑高频发起新连接的源 IP:
- 先加载模块:
modprobe xt_recent(recent 默认不加载) - 记录每个新 SYN 的源 IP:
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m recent --name synflood --set - 60 秒内同一 IP 发起 ≥5 个新 SYN 即封禁:
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m recent --name synflood --update --seconds 60 --hitcount 5 -j DROP - 确保这条规则放在允许 ESTABLISHED/RELATED 连接的规则之后,避免影响已有会话
验证与日常监控要点
规则加进去不等于生效,必须主动验证:
- 查看规则命中数:
iptables -L INPUT -n -v | grep SYN,观察 pkts 列是否增长 - 检查半连接堆积情况:
ss -s | grep synrecv或netstat -n | grep SYN_RECV | wc -l,攻击缓解后数值应明显回落(正常应低于 100) - 模拟测试可用:
hping3 -S -p 80 -i u10000 服务器IP(每秒 100 包),观察拦截效果 - 若发现大量规则命中,可结合日志或脚本提取高频 IP,进一步加入黑名单











