Linux 内核参数调优能缓解 SYN 洪水攻击导致的连接队列满问题,但无法单独抵御大流量攻击,适合作为服务器基础加固的一部分配合防火墙使用。
先说结论:内核参数调整主要是为了增强系统在高并发半连接状态下的存活能力,不能替代流量清洗或防火墙策略。
- 先判断:确认攻击类型是否为 SYN Flood,查看当前半连接队列是否满载。
- 优先做:开启 syncookies 并调整 backlog 队列长度,同时限制 SYN 重试次数。
- 再验证:观察系统日志和网络状态,确认正常业务未受影响且攻击症状减轻。
命令速用版
以下命令可临时生效,重启后失效,适合紧急止血:
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_synack_retries=2为什么会这样
TCP 握手过程中,服务器收到 SYN 包后会进入 SYN_RECV 状态并等待客户端 ACK。洪水攻击会发送大量伪造 SYN 包,占满服务器的半连接队列(backlog),导致合法用户无法建立连接。调整内核参数主要是为了加快资源释放速度,或在队列满时启用 Cookie 机制验证合法性。
分步处理
1. 备份当前配置,防止修改错误导致网络异常:
cp /etc/sysctl.conf /etc/sysctl.conf.bak2. 编辑 /etc/sysctl.conf 文件,添加或修改以下参数:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.core.somaxconn = 10243. 使配置生效:
sysctl -p注意:较新内核已移除 net.ipv4.tcp_tw_recycle 参数,不要强行添加,否则可能导致配置加载失败或网络连接问题。
怎么验证是否生效
使用 sysctl -a | grep tcp_syn 确认参数值已变更。通过 ss -n state syn-recv | wc -l 观察 SYN_RECV 状态连接数。查看系统日志 dmesg 或 /var/log/messages,确认没有频繁的 TCP 队列溢出警告。
常见坑
1. 不要开启 tcp_tw_recycle,该参数在 NAT 环境下会导致正常用户连接失败,且在 Linux 4.12 后已被移除。
2. tcp_max_syn_backlog 设置过大可能消耗过多内存,需根据服务器内存大小调整。
3. 内核参数仅能缓解症状,若攻击流量超过带宽上限,仍需联系运营商或使用高防服务。
参考来源
- Linux Kernel Documentation, "IP Sysctl Variables", https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html
- Red Hat Enterprise Linux, "Security Guide", Network Security Section