SYN洪水攻击通过伪造SYN包耗尽服务器半连接队列,Linux可通过启用SYN Cookies、调大tcp_max_syn_backlog和somaxconn、减少tcp_synack_retries、合理配置tcp_tw_reuse及iptables限速等措施有效防御。

SYN洪水攻击利用TCP三次握手的特性,大量发送伪造源IP的SYN包,耗尽服务器的半连接队列(SYN Queue),导致正常连接无法建立。Linux内核提供多种机制缓解该类攻击,配合合理参数调优可显著提升抗压能力。
启用SYN Cookies防御机制
SYN Cookies是内核在SYN队列满时的兜底方案:不分配内存保存半连接,而是将客户端信息(如时间戳、MSS等)编码进初始序列号(ISN),待收到ACK后验证并重建连接。该机制默认关闭,需手动开启。
- 临时启用:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 永久生效:在/etc/sysctl.conf中添加net.ipv4.tcp_syncookies = 1,执行sysctl -p加载
- 注意:启用后部分TCP扩展功能(如TCP选项中的窗口缩放、SACK)可能受限,但对大多数服务影响极小
调整半连接队列与全连接队列大小
半连接队列(SYN Queue)长度由net.ipv4.tcp_max_syn_backlog控制;全连接队列(Accept Queue)长度受应用listen()系统调用的backlog参数和net.core.somaxconn共同限制。二者过小会加剧SYN泛洪影响。
- 增大半连接队列:net.ipv4.tcp_max_syn_backlog = 65535(建议不低于4096)
- 增大全连接队列上限:net.core.somaxconn = 65535(需同步调整应用层listen backlog)
- 检查当前队列使用情况:ss -s | grep "synrecv" 或查看/proc/net/netstat中TcpExtListenOverflows计数
缩短SYN超时与快速回收半连接
减少半连接在队列中停留时间,可加快资源释放,提高队列周转率。但需注意与NAT或低质量网络的兼容性。
- 降低SYN-RECV状态超时:net.ipv4.tcp_synack_retries = 3(默认5次,减少重传轮数)
- 启用TIME-WAIT套接字快速回收(慎用):net.ipv4.tcp_tw_recycle = 0(已从Linux 4.12移除,且在NAT环境下极易引发连接失败,不推荐启用)
- 更安全的替代:复用TIME-WAIT套接字(仅限明确无冲突场景):net.ipv4.tcp_tw_reuse = 1,需确保net.ipv4.tcp_timestamps = 1
结合iptables限制新建连接速率
内核参数调优是基础,但无法替代网络层过滤。通过iptables对SYN包做限速,可有效拦截异常流量,减轻内核压力。
- 每秒最多允许10个新连接(每个IP):iptables -A INPUT -p tcp --syn -m limit --limit 10/sec --limit-burst 20 -j ACCEPT
- 超出即丢弃:iptables -A INPUT -p tcp --syn -j DROP
- 建议搭配ipset实现黑名单动态封禁,或使用fail2ban自动响应扫描行为

















