服务器无法真正自动检测并响应ddos攻击,所谓“自动”实为监控脚本持续采集ss -s、/proc/net/sockstat等硬指标,发现syn队列溢出、time-wait堆积或非业务端口连接异常后,调用sysctl或iptables临时干预;仅可安全调整tcp_max_syn_backlog、somaxconn、tcp_tw_reuse等参数,严禁自动化修改tcp_tw_recycle、ip_local_port_range或无条件封禁策略。

服务器无法真正“自动检测攻击特征并收紧连接表或关端口”——Linux 内核本身不识别DDoS或拒绝服务行为,所有所谓“自动响应”,本质是外部监控脚本持续采集硬指标,发现异常后调用命令临时干预。关键在于盯准可量化、低误报的信号,并只动安全范围内参数。
必须实时盯住的三个核心指标
不用装额外工具,靠系统自带命令就能获取真实压力信号:
- SYN 队列是否溢出:运行 ss -s | grep "synrecv",若返回值接近或等于 tcp_max_syn_backlog(默认常为128或256),或 dmesg 中出现 possible SYN flooding on port,说明连接请求已压垮入口队列
- TIME-WAIT 连接是否堆积:执行 awk '/TW/ {print $2}' /proc/net/sockstat,连续两分钟高于25000,且应用层无大量短连接需求,大概率是异常扫描或慢速攻击所致
- 非业务端口是否有活跃连接:用 ss -tuln | grep -vE ':(80|443|22|3306|8080) '(按实际业务端口调整)快速列出监听但非核心的端口;再结合 ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -5 查看哪些IP在疯狂连非业务端口
可安全收紧的内核连接状态表参数
仅限运行时动态调整,必须配合阈值判断,不能无条件拉满:
- 当 synrecv 数量持续超过当前 tcp_max_syn_backlog 的70%,立即同步调高两项:
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.core.somaxconn=65535
(注意:两个值必须一致,否则以较小值生效) - 确认不是NAT环境且服务器仅作客户端用途时,启用连接复用:
sysctl -w net.ipv4.tcp_tw_reuse=1 - 若 /proc/net/sockstat 中TW值长期超30000,且业务无长连接依赖,可缩短回收时间:
sysctl -w net.ipv4.tcp_fin_timeout=25
关闭非业务端口的实操方式
不推荐直接停服务进程,优先用防火墙精准阻断,保留日志和回滚能力:
- 查出监听但未被业务调用的端口(如 23、139、445、3389 等):
ss -tuln | awk '$5 ~ /:[0-9]+$/ {split($5,a,":"); print a[2]}' | sort -u - 对每个非必要端口,添加DROP规则并记录日志:
iptables -A INPUT -p tcp --dport 139 -j LOG --log-prefix "BLOCKED_SMB: "
iptables -A INPUT -p tcp --dport 139 -j DROP - 保存规则防止重启丢失(CentOS/RHEL):
service iptables save 或 iptables-save > /etc/sysconfig/iptables
绝对禁止自动化的操作
以下动作一旦由脚本擅自触发,极易引发大面积连接中断甚至服务不可用:
- net.ipv4.tcp_tw_recycle=1:内核5.4+已彻底移除,旧版开启会导致NAT环境下90%以上客户端连接失败
- net.ipv4.ip_local_port_range 缩小范围:会直接降低并发出站连接能力,影响健康检查、上游调用等正常逻辑
- 未经确认直接 killall -9 监听进程:可能误杀监控、日志或配置同步组件
- 用 ufw default deny 或全盘 iptables -P INPUT DROP:没有白名单兜底就等于自断后路











