Linux防火墙需结合内核参数调优与规则策略防御SYN攻击:启用tcp_syncookies、增大tcp_max_syn_backlog、减少tcp_synack_retries;配合firewalld/iptables限速限连;用connlimit限制单IP并发;建议fail2ban联动日志告警。

Linux 防火墙本身不直接“感知”SYN攻击,但配合内核参数调优和规则策略,能构建有效防御层。关键不是等攻击发生再手动封IP,而是让系统在连接建立前就过滤、限速、丢弃异常流量。
启用并加固内核级 SYN 防护
这是最基础也最关键的防线,无需额外软件,直接生效:
-
开启 SYN Cookie:防止半连接队列溢出。执行
sysctl -w net.ipv4.tcp_syncookies=1;永久生效需写入/etc/sysctl.conf并运行sysctl -p -
增大 SYN 队列容量:默认常为 1024,建议设为 2048 或更高,命令为
sysctl -w net.ipv4.tcp_max_syn_backlog=2048 -
缩短 SYN-ACK 重试次数:减少无效连接占用资源时间,设为 2 次(约 1~3 秒),命令为
sysctl -w net.ipv4.tcp_synack_retries=2
用 firewalld 或 iptables 实施连接速率控制
单靠内核参数不够,必须结合防火墙规则对流量做实时干预:
- 对 HTTP/HTTPS 端口启用每分钟最多 60 个新连接的限制:
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" limit value="60/m" accept' --permanent - 对高频新建连接源(如 1 秒内超 10 个 SYN)直接拒绝:
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" limit value="10/s" reject' --permanent - 若用 iptables,可更精细控制:
iptables -A INPUT -p tcp --syn -m hashlimit --hashlimit 3/sec --hashlimit-burst 10 -j ACCEPT,之后跟一条iptables -A INPUT -p tcp --syn -j DROP
限制单 IP 并发连接数防资源耗尽
攻击者常通过大量 IP 或单 IP 多连接打满服务端资源,需针对性限制:
- 使用 connlimit 模块限制每个源 IP 的并发连接数,例如只允许最多 50 个:
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j REJECT --reject-with tcp-reset - 若用 firewalld,可通过脚本提取
netstat -tn | awk '$NF=="ESTABLISHED" {print $5}' | cut -d: -f1 | sort | uniq -c中超阈值(如 >50)的 IP,自动加入 block zone - 建议搭配定时任务(如每 2 分钟执行一次)+ 自动解封(如 30 分钟后移除),避免误伤
补充建议:日志联动与长期防护
静态规则只能应对已知模式,动态响应才能提升实战能力:
- 启用
fail2ban监控 auth.log 或 web 日志,识别扫描、爆破行为并触发封禁 - 将
netstat -s | grep -i "SYN"或ss -s输出纳入监控,当半连接数突增时告警 - 高负载场景下,同步调大
net.core.somaxconn(全连接队列)并确保应用 listen() 的 backlog 参数匹配,否则内核参数调整无效


















