tcp_syncookies必须开启,它是唯一能在不耗内存前提下抵御SYN Flood的核心机制:将客户端信息编码进SYN+ACK序列号,收到ACK后验证重建连接;临时启用用echo 1 > /proc/sys/net/ipv4/tcp_syncookies,永久生效需在/etc/sysctl.conf中写入net.ipv4.tcp_syncookies = 1并执行sysctl -p。

tcp_syncookies 必须开,不是可选项
SYN Flood 攻击会让服务器半连接队列瞬间打满,tcp_syncookies=1 是唯一能在不耗内存前提下扛住伪造 SYN 的机制。它把客户端 IP、端口、时间戳等信息编码进 SYN+ACK 的初始序列号里,收到 ACK 后再解码验证——全程不占队列空间。
临时启用:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
永久生效:在 /etc/sysctl.conf 中写入 net.ipv4.tcp_syncookies = 1,再执行 sysctl -p
注意:tcp_syncookies 开启后会禁用 SACK 和时间戳扩展,但对 HTTP、HTTPS、SSH 等常规服务无实际影响;关掉它等于放弃最后一道保命线。
半连接队列和全连接队列要同步调大
只调 tcp_max_syn_backlog 不够,应用 accept() 调用慢时,全连接队列(somaxconn)也会溢出,导致内核丢包、客户端重试、放大攻击效果。
-
net.ipv4.tcp_max_syn_backlog:建议设为4096或更高(高并发场景可到32768),不能低于应用 backlog 值 -
net.core.somaxconn:必须 ≥tcp_max_syn_backlog,推荐统一设为8192 - 应用层也要匹配:Nginx 需显式写
listen 80 backlog=8192;Java 的ServerSocket构造时传入8192
常见错误:改了内核参数但没改应用配置,结果 ss -s 里能看到大量 embryonic(半连接)和 failed(全连接溢出)计数。
iptables 限速必须区分“速率”和“并发”,用错模块就失效
connlimit 只管当前 ESTABLISHED 连接数,对短连接爆破(比如每秒建断 100 次 SSH)完全无效;真要控每秒新建连接,得用 hashlimit 或 limit。
防 Web 层 CC 攻击(如登录接口):
iptables -I INPUT -p tcp --dport 80 --syn -m hashlimit \--hashlimit-name http_syn \--hashlimit-mode srcip \--hashlimit-upto 5/sec \--hashlimit-burst 20 \-j ACCEPTiptables -A INPUT -p tcp --dport 80 --syn -j DROP
关键点:
-
--syn只匹配 SYN 包,避免误伤已有连接 -
--hashlimit-burst允许突发,防止合法用户被误杀 - 规则必须加在
INPUT链靠前位置,且确保nf_conntrack模块已加载(lsmod | grep nf_conntrack) - 别漏兜底 DROP 规则——没它,超限流量会继续往下走链
SSH 防爆破不能只靠密码强度
暴力破解几乎全走 SSH,光改密码或加密强度没用,必须从连接行为本身卡住节奏。
三件事必须做:
- 禁用密码登录:
PasswordAuthentication no,强制密钥认证 - 改默认端口(如
Port 2222),过滤掉 90% 扫描器 - 用
ufw limit 2222或 firewalld 的limit value="6/m"控制新建连接频率
注意:ufw limit 默认是每 30 秒最多 6 个新连接,超出自动封 IP 30 秒;firewalld 的 limit 单位支持 5/s、10/m,更灵活,但必须加 --permanent 才持久化。
真正容易被忽略的是日志联动——UFW 或 fail2ban 必须解析 /var/log/auth.log,否则攻击者换 IP 就绕过所有限制。


















