核心是让半连接队列不成为瓶颈,关键在“快进快出+兜底可靠”:增大tcp_max_syn_backlog、匹配somaxconn与应用backlog,启用tcp_syncookies=1条件触发,调低tcp_synack_retries至2或3,并用iptables限速限频作前置过滤。

高并发服务器防御 SYN 攻击,核心是让半连接队列不成为瓶颈。关键不在“堆大”,而在“快进快出+兜底可靠”:增大容量只是基础,缩短驻留时间、启用无状态响应、配合队列协同才是有效组合。
同步调大三个关联队列参数
半连接队列(tcp_max_syn_backlog)、全连接队列(somaxconn)和应用层 listen 的 backlog 必须匹配,否则调大一个等于白做。
- net.ipv4.tcp_max_syn_backlog:设为 4096~65535,取决于并发压力。2C4G 以上建议 ≥8192
- net.core.somaxconn:必须 ≥ 应用设置的 listen backlog(如 Nginx 默认 511),推荐统一设为 65535
- 检查应用是否显式设置了 backlog(如 Python 的
socket.listen(1024)),若未设,系统按 somaxconn 截断
启用 SYN Cookies 并设为条件触发
这是最可靠的兜底机制——队列满时自动启用,不占内存、不依赖状态,现代内核(≥3.7)已支持带时间戳的 Cookie,SACK 等功能基本不受影响。
- 临时开启:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.tcp_syncookies = 1 - 避免设为 2(无条件开启),除非明确需要,日常用 1 即可兼顾兼容性与防护
压缩半连接生命周期
攻击连接卡在 SYN_RECV 状态越久,队列越容易被占满。减少重传次数比调长超时更直接有效。
- net.ipv4.tcp_synack_retries:从默认 5 降为 2 或 3,SYN+ACK 重试总耗时从约 31 秒压至 1~3 秒
- 无需调整
tcp_syn_retries(客户端参数),它不影响服务端队列压力 - 不建议盲目调小
tcp_fin_timeout或启用tcp_tw_recycle(NAT 下易出问题)
补充网络层过滤作前置缓冲
内核参数是底座,iptables 是第一道闸口,两者配合才能形成纵深。重点防“单 IP 短时高频”而非全量 SYN。
- 限制单 IP 每秒 SYN 数:
iptables -A INPUT -p tcp --syn -m limit --limit 3/sec --limit-burst 6 -j ACCEPT - 超出即丢弃:
iptables -A INPUT -p tcp --syn -j DROP - 对异常源封禁(可选):
iptables -A INPUT -p tcp --syn -m recent --name synflood --rcheck --seconds 10 --hitcount 20 -j DROP










