高负载服务器防DDoS需“疏”“稳”优先:同步设net.core.somaxconn和net.ipv4.tcp_max_syn_backlog为65535,启用tcp_syncookies=1,缩短tcp_synack_retries=3、tcp_fin_timeout=15,禁用tcp_tw_recycle,tcp_tw_reuse=1仅限客户端,缓冲区max值不超物理内存10%,并监控/proc/net/sockstat等实时指标。

高负载服务器面对DDoS攻击时,内核参数不是调得越大越好,而是要让关键链路不卡顿、资源不被无效连接耗尽、异常状态能快速释放。重点不在“堵”,而在“疏”和“稳”。
先拉齐连接队列容量,避免SYN包还没排队就被丢弃
SYN Cookies 不是前置过滤器,它只在队列真正溢出时才启动。如果 net.core.somaxconn 和 net.ipv4.tcp_max_syn_backlog 还停留在默认的 128 或 1024,攻击流量一来,大量 SYN 包根本进不了队列,直接被内核静默丢弃——这时候开不开 tcp_syncookies 都没意义。
- 两者必须同步设为 65535:确保应用层 accept 队列和内核半连接队列容量一致,不出现中间环节瓶颈
- 执行 sysctl -w net.core.somaxconn=65535 和 sysctl -w net.ipv4.tcp_max_syn_backlog=65535
- 写入配置文件后务必运行 sysctl -p 加载,否则修改只是文本
收紧连接生命周期,加速异常连接释放
攻击常伴随大量半开连接或长时间空闲连接,拖慢系统响应。缩短超时时间能让资源更快回归可用状态。
- 将 net.ipv4.tcp_synack_retries 设为 3(默认 5),加快放弃异常三次握手
- 把 net.ipv4.tcp_fin_timeout 调至 30 秒以内(如 15 或 20),减少 TIME-WAIT 占用
- 启用 net.ipv4.tcp_tw_reuse = 1,仅对主动发起连接的客户端有效(如服务端调用外部 API),不影响监听行为
- 绝对禁用 net.ipv4.tcp_tw_recycle,该参数已在主流内核中移除,旧版本开启会导致 NAT 环境下连接随机失败
控制资源消耗,防止参数反成攻击入口
盲目放大缓冲区或连接数,可能引发内存耗尽、OOM Killer 杀进程,反而导致服务中断。
- net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 的 max 值不要超过物理内存的 10%
- 限制连接跟踪表大小:net.netfilter.nf_conntrack_max = 131072(根据内存按需设置),并搭配 iptables 限速规则
- ICMP 不必完全禁 ping,改用限速:net.ipv4.icmp_ratelimit = 100,兼顾诊断与防护
- 关闭无用协议功能:net.ipv4.conf.all.accept_redirects = 0、net.ipv4.conf.all.send_redirects = 0
验证与监控不能少,改完不看等于白改
参数生效与否不能靠猜测,得看实时数据和连接状态。
- 检查当前值:sysctl net.ipv4.tcp_syncookies net.core.somaxconn net.ipv4.tcp_max_syn_backlog
- 观察半连接数:netstat -s | grep -i "listen\|syn" 或查看 /proc/net/netstat
- 监控 TIME-WAIT 数量:awk '/^TCP:/ {print $10}' /proc/net/sockstat,持续高于 2 万说明连接模式本身需优化(比如加连接池、关 keepalive)
- 确认 conntrack 表使用率:cat /proc/sys/net/netfilter/nf_conntrack_count / cat /proc/sys/net/netfilter/nf_conntrack_max

















