syn cookie是防御syn flood攻击的核心技术,通过加密生成序列号替代内存分配,在半连接队列溢出时启用,验证ack合法性后才建立连接;linux中需设tcp_syncookies=1并配合调大队列参数、缩短重试、iptables限速协同生效。

当服务器突然响应缓慢、CPU或带宽被占满、大量连接卡在SYN_RECV状态时,极大概率正遭受SYN Flood攻击——攻击者伪造海量源IP发送SYN包,迅速填满内核半连接队列,导致合法用户无法建立TCP连接。
启用SYN Cookies(必须第一步)
这一步不可跳过,是所有防护的基石。不开启它,后续iptables规则再严密也挡不住队列溢出崩溃。
临时启用:执行 echo 1 > /proc/sys/net/ipv4/tcp_syncookies,立即生效。
永久生效:编辑 /etc/sysctl.conf,添加或修改一行:net.ipv4.tcp_syncookies = 1,然后运行 sysctl -p 加载配置。
【注意:启用后SACK等部分TCP扩展会被禁用,但对HTTP/HTTPS/API等绝大多数服务无感知,必须开启】
调优内核连接队列参数
光靠SYN Cookies兜底不够,得给正常流量留足缓冲空间,并让无效连接快速释放。
第一步:扩大半连接队列上限。默认常为1024,小流量服务设为4096,中高并发建议8192~32768:
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
第二步:同步调大全连接队列(accept队列),避免此处成为新瓶颈。该值需 ≥ 应用程序listen()调用时指定的backlog参数,且不能低于tcp_max_syn_backlog:
sysctl -w net.core.somaxconn=8192
第三步:缩短SYN+ACK重传周期。默认重试5次、总等待超30秒,设为2次后总超时约6秒,能更快清理僵尸连接:
sysctl -w net.ipv4.tcp_synack_retries=2
最后执行 sysctl -p 保存全部变更。
用iptables限制SYN请求速率与并发数
内核兜底,iptables前置过滤。重点不是封死SYN,而是控制每个真实IP的行为节奏。
方法一:按速率限新连接(防突发洪水)
插入INPUT链开头,允许单IP每秒最多3个新SYN,突发允许10个,超出即丢弃:
iptables -A INPUT -p tcp --syn -m hashlimit --hashlimit-name syn_flood --hashlimit-mode srcip --hashlimit 3/sec --hashlimit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
方法二:按并发半连接数限流(防慢速扫描)
单个IP同时处于SYN_RECV状态的连接超过30个就拉黑:
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 30 -j DROP
【这两条规则必须加在INPUT链靠前位置,且确保nf_conntrack模块已加载:运行 lsmod | grep nf_conntrack 验证】
验证防护是否生效
检查SYN Cookies是否真正启用:
sysctl net.ipv4.tcp_syncookies 输出应为 net.ipv4.tcp_syncookies = 1。
查看当前半连接数量:
netstat -n | grep SYN_RECV | wc -l
监控半连接队列溢出次数(关键指标!):
watch -n 1 'netstat -s | grep -i "listen"' ,若输出中 timesthe listen queue of a socket overflowed 数值不再持续增长,说明防护已起效。











