iptables 防 syn flood 的核心是连接建立前拦截异常流量,通过专用链限速(10/s,burst 20)、单 ip 新建连接限制(60 秒内 5 个)、半连接总数限制(500)、配合 tcp_syncookies 等内核参数协同防御,并辅以 ss/netstat 监控和 iptables 计数器验证。

直接用 iptables 防 SYN Flood,核心是“在连接建立前就拦截异常流量”,不依赖应用层,见效快、开销低。重点不是堵死所有 SYN,而是限制速率、识别异常、配合系统参数协同防御。
设置专用链 + 限速规则
避免污染默认 INPUT 链,先建独立链,再挂载规则:
-
创建新链:
iptables -N SYN_FLOOD -
把所有入向 SYN 包导向该链:
iptables -A INPUT -p tcp --syn -j SYN_FLOOD -
允许合理速率的 SYN 包通过:
iptables -A SYN_FLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN(每秒平均 10 个,初始可突增 20 个) -
超出限速的包直接丢弃:
iptables -A SYN_FLOOD -j DROP
注意:--limit-burst 是“信用额度”,不是上限;它允许突发流量短时通过,避免误伤正常用户(如网页含多个资源请求)。
补充状态与连接数控制
单靠限速不够,还需防单 IP 持续刷量或连接堆积:
-
限制单 IP 新建连接数(60 秒内最多 5 个):
iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --set --name SYN_PER_IPiptables -A INPUT -p tcp --syn -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --name SYN_PER_IP -j DROP -
限制半连接总数(防止队列占满):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 500 -j DROP
这两条能有效应对扫描器或小规模 Botnet 的集中攻击,且不影响合法用户的首次访问。
启用内核级防护作为兜底
iptables 是第一道防线,内核参数是关键补强,必须同步配置:
-
开启 SYN Cookies(最实用):
echo 1 > /proc/sys/net/ipv4/tcp_syncookies,并写入/etc/sysctl.conf持久化:net.ipv4.tcp_syncookies = 1 -
调大半连接队列(高并发服务建议):
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog -
减少重试次数(缩短资源占用时间):
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries
这些参数重启失效,务必执行 sysctl -p 加载,否则仅临时生效。
验证与日常监控
规则上线后需快速确认是否起效,并建立轻量监控习惯:
-
实时查看半连接数量:
ss -s | grep synrecv或netstat -n | grep SYN_RECV | wc -l,持续高于 300 就要警惕 -
检查 iptables 计数器:
iptables -L SYN_FLOOD -v -n,看 DROP 行的 packets 数是否明显增长 - 记录高频触发者(可选):在 DROP 前加一条 LOG 规则,配合脚本自动提取并临时封禁反复触发的 IP
不需要复杂平台,一个定时脚本每分钟跑一次检查 + 发邮件告警,就能覆盖大多数突发场景。











