Linux服务器DDoS攻击排查实战:从症状识别到应急响应

📅 2026/7/4 22:54:49
Linux服务器DDoS攻击排查实战:从症状识别到应急响应
1. 项目概述当服务器“卡死”时你首先应该做什么如果你负责的Linux服务器突然变得异常缓慢网站打不开SSH登录卡顿甚至直接宕机你的第一反应是什么是重启服务还是检查代码在多年的运维和网络安全工作中我见过太多工程师的第一反应是“重启大法好”。但很多时候这恰恰会掩盖真正的问题甚至让攻击者得逞。服务器性能骤降尤其是网络服务不可用一个非常常见且危险的元凶就是DDoS攻击。DDoS全称分布式拒绝服务攻击它的原理并不复杂但破坏力极强。想象一下你的服务器是一家热门餐厅正常情况下来就餐的顾客合法请求络绎不绝后厨和服务员都能有条不紊地处理。突然有成百上千个捣乱分子攻击流量涌入餐厅他们不点餐只占着座位大声喧哗或者不停地要求服务员做各种无理服务。很快餐厅的通道被堵死真正的顾客进不来服务员也累瘫了整个餐厅陷入瘫痪。DDoS攻击就是网络世界的这种“恶意占座”行为攻击者控制着遍布全球的“肉鸡”被入侵的计算机或物联网设备向你的服务器发起海量垃圾请求耗尽它的带宽、CPU、内存或连接数等资源导致合法用户无法访问。因此学会快速、准确地判断服务器是否正在遭受DDoS攻击是每一位服务器管理员、开发者和安全从业者的核心生存技能。这不仅仅是“查看一下流量”那么简单它需要你像侦探一样从系统表现、网络流量、连接状态和日志记录等多个维度收集线索并进行交叉验证。本文将基于我处理过数十起真实攻击事件的经验手把手带你走完从“感觉不对劲”到“确认被打了”的完整排查流程并提供一系列可直接在终端执行的命令和脚本。无论你是运维新手还是有一定经验的工程师都能从中找到可立即上手的实战方法。2. 攻击迹象初判服务器异常的“临床症状”在动用任何工具之前一个有经验的管理员会先通过一些“体感”和基础命令对服务器的健康状况做一个快速扫描。这就像医生问诊先了解病人的主要症状。2.1 性能指标的异常飙升最直接的感受就是服务器“变慢了”。但这种“慢”需要量化。立刻打开终端连接服务器如果还能连上的话执行以下命令进行快速体检1. 整体负载与CPU使用率top/htop运行top命令重点关注前几行的信息load average(平均负载)这三个数字分别代表过去1分钟、5分钟、15分钟的系统平均负载。对于单核CPU持续高于1.0就表示系统过载对于多核CPU负载值接近或超过核心数就是严重警报。DDoS攻击尤其是应用层攻击很容易导致负载飙升。%Cpu(s)按下数字1可以展开所有CPU核心的详情。观察us用户空间和sy内核空间的占用率。如果它们持续接近100%且waIO等待不高那很可能是CPU计算资源被恶意请求耗尽。实操心得单纯看top的进程列表可能找不到消耗CPU的“元凶”因为DDoS攻击的请求可能分散在无数个短暂的网络连接处理进程中。这时高CPU使用率配合高负载但无单一突出进程就是典型特征。2. 内存与交换分区free -h运行free -h以人类可读的方式查看内存。关注available列这是系统可用内存的真实反映。如果available内存极低甚至swap交换分区使用量 (used) 开始快速增长说明物理内存已被耗尽系统开始使用硬盘作为虚拟内存这会导致性能呈指数级下降。DDoS攻击可能导致服务器创建大量临时进程或缓存大量无效会话迅速吃光内存。3. 网络连接状态ss或netstatss命令比传统的netstat更快是首选。执行ss -tunlp或netstat -tunlp。连接数激增观察ESTAB(ESTABLISHED) 状态的连接数。你可以用ss -t state established | wc -l快速统计。这个数字在平时应该有一个相对稳定的基线。如果它突然增长数倍甚至数十倍且没有对应的业务增长就是强烈信号。异常连接状态特别留意SYN-RECV状态的连接。这是TCP三次握手中服务器发出SYN-ACK后等待客户端ACK的状态。如果这个状态的连接数异常多很可能正在遭受SYN Flood攻击。2.2 网络层面的直观感受如果服务器上的服务还能勉强响应但从外部访问体验极差就需要从网络层面入手。1. 带宽是否被“堵死”iftop或nload安装并运行iftop(yum install iftop -y或apt install iftop)。iftop会实时显示进出网卡的流量并按流量大小排序。你会直观地看到是哪个或哪几个IP地址在疯狂地发送或接收数据。如果发现某个IP的发送带宽TX异常高且持续不断它很可能就是攻击源或反射攻击的受害者。nload命令则更简洁地显示总带宽利用率快速判断带宽是否已饱和。2. 丢包与延迟ping与mtr从你的本地电脑或一个健康的网络节点向服务器IP执行ping。如果出现严重丢包packet loss 20%和延迟激增time 几百ms而服务器所在机房网络正常这强烈指向带宽耗尽型DDoS攻击。使用mtr命令如mtr -r 你的服务器IP可以进行路由跟踪帮助判断问题发生在机房边界还是更上游的网络。注意事项在怀疑遭受攻击时尽量避免在服务器上对外发起大量ping或traceroute测试这可能会加重网络负担或干扰监控数据。应从外部网络进行探测。3. 深度取证分析揪出攻击流量的“狐狸尾巴”初步怀疑后我们需要更深入的证据来坐实攻击行为并识别攻击类型。这需要分析系统日志和网络数据包。3.1 系统与服务日志分析日志是记录服务器活动的“黑匣子”是排查问题的金矿。1. 系统日志 (/var/log/messages或/var/log/syslog)使用tail -f /var/log/messages或journalctl -f实时查看日志或者用grep搜索历史异常。资源耗尽错误搜索“Out of memory” (OOM),“kernel: TCP: too many orphaned sockets”,“possible SYN flooding”等关键词。这些都是内核在资源不足时发出的直接警告。连接限制错误“Too many open files”表明进程打开的文件描述符包括网络套接字超过了系统限制这是连接数攻击的典型后果。2. Web服务器日志 (Nginx/Apache)以Nginx为例访问日志通常在/var/log/nginx/access.log。使用一些简单的命令进行快速分析统计请求最频繁的IPawk {print $1} /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20这个命令能列出前20个请求最多的IP地址。如果发现某个IP在短时间内比如1分钟产生了成千上万条请求且User-Agent相似或请求的URL很怪异如大量请求同一个耗资源的API接口那它很可能在进行HTTP Flood或CC攻击。统计请求最频繁的URLawk {print $7} /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20攻击者常常会针对登录页面、搜索接口、API端点等消耗资源的动态页面进行攻击。3. 防火墙日志 (/var/log/iptables.log或journalctl查询)如果你配置了iptables或firewalld的日志记录这里会有最直接的攻击证据。你需要查看是否有大量来自特定IP或IP段的丢包 (DROP) 或拒绝 (REJECT) 记录。3.2 网络数据包嗅探与流量分析对于更复杂的攻击或者需要精准识别攻击模式时需要直接分析网络数据包。1. 使用tcpdump进行抓包tcpdump是网络分析的神器。在攻击可能发生的网卡通常是eth0或ens33上抓包tcpdump -i eth0 -n -s 0 -w ddos_suspect.pcap-i eth0: 指定网卡。-n: 不解析主机名加快速度。-s 0: 抓取完整数据包。-w file.pcap: 保存到文件便于后续分析。 抓包一段时间如30秒后按CtrlC停止。注意在高流量时抓包可能会影响性能并产生巨大文件需谨慎。2. 使用Wireshark(或命令行工具tshark) 分析将抓取的ddos_suspect.pcap文件下载到本地用Wireshark图形化工具打开分析会非常直观统计 - 对话查看IPv4或TCP/UDP对话按数据包数量或字节数排序。攻击源IP通常会名列前茅。过滤器应用tcp.flags.syn1 and tcp.flags.ack0过滤出所有SYN包用于分析SYN Flood。udp查看所有UDP流量分析UDP Flood。http查看HTTP请求分析CC攻击模式。观察特征大量来自不同源IP但目标端口相同的SYN包大量源IP端口随机、目标端口固定的UDP包大量HTTP GET/POST请求指向同一个URL。3. 使用netstat/ss进行连接特征分析除了看总数还可以分析连接的细节netstat -anp | grep ‘tcp\|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr | head -20这个命令组合能统计出发起连接最多的前20个IP地址对于识别攻击源非常有效。4. 专项检测识别特定类型的DDoS攻击不同的DDoS攻击类型在系统上留下的痕迹侧重点不同。我们可以进行一些针对性的检查。4.1 SYN Flood攻击检测SYN Flood利用TCP三次握手的缺陷。检查半连接队列状态是关键。netstat -n | grep ^tcp | awk ‘{print $6}’ | sort | uniq -c或者使用ss更高效ss -n state syn-recv | wc -l查看SYN-RECV状态连接的数量。如果这个数字异常高例如超过数百甚至上千且远高于ESTAB状态连接同时服务器配置的net.ipv4.tcp_max_syn_backlog参数值较小就极有可能是SYN Flood。内核参数检查sysctl net.ipv4.tcp_max_syn_backlog sysctl net.ipv4.tcp_syncookiestcp_max_syn_backlog定义了半连接队列的最大长度。如果SYN-RECV数接近这个值队列可能已满。tcp_syncookies为1时会在队列满时启用SYN Cookie机制来缓解攻击。4.2 UDP/ICMP Flood攻击检测这类攻击旨在耗尽带宽。使用iftop或nload观察总带宽占用最为直接。此外可以用netstat统计UDP连接数netstat -nua | wc -l如果UDP连接数巨大且服务器上并没有运行大量的UDP服务如DNS、游戏服务那就很可疑。4.3 HTTP Flood / CC攻击检测这类应用层攻击模仿正常用户更难区分。关键在于分析请求的行为模式。请求速率单个IP每秒请求数RPS远超人类极限。可以用之前的日志分析命令按秒级时间窗口统计。请求内容User-Agent单一或为非常用浏览器/爬虫。Referer缺失或异常。请求的URL高度集中且多为动态、耗资源的页面如/login,/search?q...,/api/loadData。缺少正常的页面浏览逻辑如只请求某个API不加载CSS/JS/图片。会话行为大量请求不带Cookie或使用相同的、无效的Session ID表明攻击未通过完整的Web应用流程。你可以编写一个简单的脚本实时分析Nginx日志对单个IP的请求频率进行阈值告警。4.4 反射放大攻击检测如DNS/NTP放大这类攻击的特点是入站流量巨大出站流量很小。攻击者伪造你的服务器IP向开放的DNS/NTP服务器发送小查询这些服务器会向你的IP返回大得多的响应数据包。监测不对称流量使用iftop观察如果RX(接收) 流量极高而TX(发送) 流量相对很低且接收流量中充斥着DNS(53/UDP)或NTP(123/UDP)等协议的数据包就很可能是反射攻击。抓包分析用tcpdump抓包过滤udp port 53会发现大量来自不同IP开放解析器的DNS响应包指向你的服务器IP但你的服务器并没有发起对应的查询。5. 构建实时监控与告警体系被动排查不如主动预警。建立一个简单的实时监控脚本能在攻击发生时第一时间通知你。5.1 关键指标监控脚本示例以下是一个基础的Bash脚本示例用于监控网络连接数和带宽并在超过阈值时发出告警这里以发送日志到文件为例实际可集成邮件、钉钉、企业微信等。#!/bin/bash # monitor_ddos.sh # 设置阈值 CONN_THRESHOLD1000 # ESTABLISHED连接数阈值 BANDWIDTH_THRESHOLD100 # 带宽利用率百分比阈值 INTERFACE“eth0” # 监控网卡 LOG_FILE“/var/log/ddos_monitor.log” while true; do # 1. 检查TCP连接数 ESTAB_COUNT$(ss -t state established | wc -l) if [ $ESTAB_COUNT -gt $CONN_THRESHOLD ]; then echo “$(date) - 警告: ESTABLISHED连接数异常升高: $ESTAB_COUNT” $LOG_FILE # 此处可添加告警动作如发送邮件: mail -s “DDoS警报-高连接数” adminexample.com fi # 2. 检查带宽利用率 (使用/proc/net/dev简单计算) RX_BYTES_PREV$(cat /proc/net/dev | grep $INTERFACE | awk ‘{print $2}’) TX_BYTES_PREV$(cat /proc/net/dev | grep $INTERFACE | awk ‘{print $10}’) sleep 1 RX_BYTES_CURR$(cat /proc/net/dev | grep $INTERFACE | awk ‘{print $2}’) TX_BYTES_CURR$(cat /proc/net/dev | grep $INTERFACE | awk ‘{print $10}’) RX_RATE$(( ($RX_BYTES_CURR - $RX_BYTES_PREV) * 8 / 1000 )) # 换算成Kbps TX_RATE$(( ($TX_BYTES_CURR - $TX_BYTES_PREV) * 8 / 1000 )) # 假设你的总带宽是100Mbps (100000 Kbps)计算利用率 TOTAL_BW100000 RX_UTIL$(( RX_RATE * 100 / TOTAL_BW )) TX_UTIL$(( TX_RATE * 100 / TOTAL_BW )) if [ $RX_UTIL -gt $BANDWIDTH_THRESHOLD ] || [ $TX_UTIL -gt $BANDWIDTH_THRESHOLD ]; then echo “$(date) - 警告: 带宽利用率异常! RX: ${RX_UTIL}%, TX: ${TX_UTIL}%” $LOG_FILE # 此处可添加告警动作 fi sleep 5 # 每5秒检查一次 done5.2 与现有监控系统集成对于生产环境更推荐使用成熟的监控系统Zabbix/PrometheusGrafana可以自定义监控项Item采集net.tcp.connTCP连接数、net.if.in/out网卡流量、system.cpu/util等指标并设置灵活的触发器Trigger和告警动作Action。Cloud Provider Tools如果使用阿里云、腾讯云等云服务器务必开启其云监控和DDoS基础防护服务。控制台会提供更直观的流量图表和攻击事件告警。6. 应急响应流程确认攻击后的第一步该做什么一旦确认服务器正在遭受DDoS攻击切忌慌乱。按照以下流程操作可以最大程度减少损失启动应急预案立即通知相关团队成员运维、开发、业务负责人。评估影响范围确定受影响的业务是全部业务还是某个特定服务/端口。启用云端防护如果可用云服务器用户立即登录云控制台将服务器IP切换到DDoS高防IP或云盾等清洗服务。这是最快速有效的方式攻击流量会在云端被清洗只有正常流量会到达你的服务器。自建机房用户联系你的ISP互联网服务提供商或机房告知他们你正在遭受攻击请求他们协助在 upstream 进行流量清洗或黑洞路由。本地临时缓解识别并封禁攻击源通过iftop,netstat, 日志分析找到攻击源IP段使用iptables或firewalld进行临时封禁。例如iptables -A INPUT -s 1.2.3.0/24 -j DROP。注意对于分布式攻击源IP海量且分散此方法效果有限。调整Web服务器配置对于HTTP Flood可以临时限制单个IP的连接速率。例如在Nginx中http { limit_conn_zone $binary_remote_addr zoneperip:10m; limit_conn perip 10; # 每个IP同时最多10个连接 limit_req_zone $binary_remote_addr zoneperip_req:10m rate10r/s; # 每秒10个请求 limit_req zoneperip_req burst20 nodelay; }启用SYN Cookie如果确认是SYN Flood确保net.ipv4.tcp_syncookies 1已启用。收集证据在采取防护措施的同时保存好关键时间段的系统日志、Web日志、防火墙日志以及tcpdump抓包文件。这些对于事后分析攻击模式和溯源至关重要。业务恢复与复盘攻击缓解后逐步将流量切回并监控业务恢复情况。事后必须组织复盘分析攻击入口、防护短板并更新应急预案。7. 根治与加固如何让服务器更“抗打”应急处理是治标系统加固才是治本。以下是一些提升Linux服务器自身抗DDoS能力的基础加固措施7.1 操作系统内核参数优化编辑/etc/sysctl.conf添加或修改以下参数然后执行sysctl -p生效。# 防御SYN Flood net.ipv4.tcp_syncookies 1 # 开启SYN Cookie net.ipv4.tcp_max_syn_backlog 8192 # 增大半连接队列大小 net.ipv4.tcp_synack_retries 2 # 减少SYN-ACK重试次数 net.ipv4.tcp_syn_retries 2 # 减少SYN重试次数 # 加快TCP连接回收与重用 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_tw_recycle 0 # 在NAT环境下建议为0避免问题 net.ipv4.tcp_fin_timeout 30 # 调整本地端口范围 net.ipv4.ip_local_port_range 1024 65535 # 调整系统文件描述符和进程限制 fs.file-max 6553507.2 配置高效的防火墙规则使用iptables或更现代的nftables设置防护规则。示例使用iptables设置基础防护# 1. 建立连接追踪表限制单个IP的新连接速率 iptables -N DDOS_PROTECT iptables -A DDOS_PROTECT -m state --state NEW -m recent --set --name DDOS --rsource iptables -A DDOS_PROTECT -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name DDOS --rsource -j DROP iptables -A DDOS_PROTECT -j ACCEPT # 2. 将自定义链应用到INPUT链针对已建立的服务端口如SSH的22Web的80/443 iptables -A INPUT -p tcp --dport 22 -j DDOS_PROTECT iptables -A INPUT -p tcp --dport 80 -j DDOS_PROTECT iptables -A INPUT -p tcp --dport 443 -j DDOS_PROTECT # 3. 限制ICMP (Ping) 请求速率防止ICMP Flood iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # 4. 限制无效数据包 iptables -A INPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP重要提示防火墙规则是一把双刃剑过于严格的规则可能误伤正常流量。上述规则仅为示例在生产环境应用前必须在测试环境充分验证并确保你有可靠的远程管理通道如通过控制台或未被规则限制的特定管理IP避免将自己锁在服务器外。7.3 应用层防护与架构优化使用Web应用防火墙WAF对于HTTP/HTTPS服务部署WAF如 ModSecurity, 云WAF可以有效识别和拦截CC攻击、SQL注入、恶意爬虫等应用层威胁。启用CDN将静态资源甚至整个网站接入CDN。CDN节点分布广泛可以吸收和分散流量攻击者很难直接攻击到源站IP。隐藏源站IP源站IP是攻击者的终极目标。确保源站IP不直接暴露在公网只允许CDN节点或高防IP回源。扩容与负载均衡通过增加服务器实例并配置负载均衡可以提高服务的整体容量。虽然无法抵御超大流量攻击但能提升应对小规模攻击的韧性。与专业安全服务联动对于关键业务投资购买商业DDoS防护服务是必要的。它们拥有海量的带宽和专业的清洗中心是抵御大规模攻击的最有效手段。排查DDoS攻击是一个从现象到本质从应急到加固的持续过程。最关键的永远是提前准备建立监控、制定预案、做好加固。当警报真的响起时你才能临危不乱有条不紊地按照既定的流程保护你的服务器和数据。