
1. 项目概述当服务器带宽被DDoS打满时我们该做什么做运维或者自己搭服务器的朋友最怕半夜手机突然收到告警短信提示服务器带宽跑满、CPU飙升。点开监控一看流量曲线像坐了火箭一样直冲云霄网站打不开SSH连不上整个人瞬间就清醒了。这种场景十有八九是遭遇了分布式拒绝服务攻击也就是我们常说的DDoS。很多新手遇到这种情况的第一反应是“懵”然后手忙脚乱地重启服务、重启服务器甚至直接联系机房拔网线这些操作不仅可能无济于事还可能丢失关键的攻击证据让后续的防御和溯源陷入被动。我处理过不少类似的线上应急事件核心思路其实很清晰先保命再抓凶最后治病。“保命”是指快速缓解攻击影响恢复服务可用性“抓凶”是指精准定位攻击流量来源和特征“治病”则是根据抓到的“凶手”信息制定长效的防御策略。今天要聊的就是“抓凶”这个环节里两个朴实无华但极其强大的命令行工具iftop和tcpdump。它们就像是外科医生的手术刀和侦探的放大镜一个帮你从宏观上看清流量全貌另一个帮你从微观上解剖数据包细节。很多人知道这两个命令但真到了攻击现场却不知道如何组合使用快速形成有效判断。这篇文章我就结合多次实战经验手把手带你走一遍完整的应急排查流程让你下次再遇到DDoS时心里有底手上有招。2. 应急响应第一步确认攻击状态与建立排查环境当告警响起你的首要任务不是立刻埋头敲命令而是先确认攻击的真实性并为自己建立一个安全的、可持续的排查环境。盲目操作很可能把自己关在服务器门外。2.1 攻击状态的多维度确认带宽打满不一定就是DDoS。有时可能是某个合法业务突发巨大流量例如文件下载、视频转码或者是服务器自身出了故障如日志循环异常、进程死循环。你需要通过多个角度交叉验证登录服务器如果SSH已经无法连接你需要立即通过服务商提供的VNC、控制台或者带外管理功能登录。这是你后续所有操作的基础。查看整体负载登录后立刻运行top或htop命令。观察CPU、内存的使用情况。典型的DDoS攻击尤其是流量型往往CPU和内存占用并不高因为流量在到达应用层之前就已经挤满了网络管道。如果CPU占用率也异常高则可能是混合型攻击或者根本是某个进程异常。检查网络连接数运行ss -ant | grep -E ‘:(80|443)’ | wc -l或netstat -ant。如果看到指向你服务端口如80、443的连接数异常增多且状态多为SYN_RECV、ESTABLISHED这可能是连接型DDoS如SYN Flood的特征。查看系统日志快速浏览/var/log/messages或dmesg输出看是否有内核关于网络丢包、连接溢出的报错信息。注意在攻击期间任何命令的执行都可能比平时慢。保持耐心优先使用消耗资源少的命令如ss替代netstat。2.2 建立稳固的排查“后方基地”在确认遭受攻击后你需要立即做两件事来保障自己的操作不会中断启用Screen或Tmux会话这是至关重要的一步。直接在SSH会话里运行命令一旦网络波动或你的电脑休眠连接中断正在运行的tcpdump等命令也会停止前功尽弃。务必先创建一个持久化会话# 安装screen如果未安装 # yum install screen -y # CentOS/RHEL # apt-get install screen -y # Debian/Ubuntu # 创建并进入一个名为‘ddos’的会话 screen -S ddos之后所有命令都在这个screen会话里运行。即使你的SSH断开只要服务器没重启回到服务器后执行screen -r ddos就能恢复现场。准备必要的工具确保iftop和tcpdump已经安装。它们通常不是默认安装的。# CentOS/RHEL yum install iftop tcpdump -y # Debian/Ubuntu apt-get install iftop tcpdump -y如果因为网络问题无法安装可以尝试从本地或镜像源提前准备rpm/deb包。3. 宏观视野用iftop实时锁定异常流量源头iftop是一个类似于top命令的实时流量监控工具它能以可视化的方式展示当前服务器上哪些IP在和你的服务器通信以及通信的速率。在DDoS攻击中它能帮你快速识别出流量最大的那几个“嫌疑犯”。3.1 iftop的基本使用与关键信息解读直接运行iftop命令默认监控第一块网卡通常是eth0。你会看到一个动态刷新的界面分为上中下三部分。上部显示一条流量刻度尺用于衡量下方条状图的长度。中部这是核心区域每一行代表一个主机对或会话。默认显示格式是12.5Kb 25.0Kb 37.5Kb 50.0Kb └─────────────────┴─────────────────┴─────────────────┴───────────────── 192.168.1.100:ssh 10.0.0.5:55664 1.94Kb 1.55Kb 1.77Kb 192.168.1.100:ssh 10.0.0.5:55664 240b 395b 316b每一行有两列箭头表示发出的流量表示接收的流量。右边三个动态变化的数值分别代表过去2秒、10秒、40秒的平均流量速率。下部显示总计的发送TX、接收RX流量以及峰值peak。在攻击现场你的屏幕中部的列表可能会被大量行占满且接收流量的数值会异常巨大。你的目标是快速找到接收流量最大的那些IP。3.2 高级过滤与精准定位默认视图信息可能过于杂乱。你需要使用iftop的过滤和排序功能来聚焦。按接收流量排序进入iftop界面后按t键可以切换显示模式。按一次t变成“两行显示”发送和接收合并为一行。再按一次t变成“只显示接收流量”。在攻击排查时“只显示接收流量”模式最为有用因为它直接高亮了哪些IP在疯狂地向你的服务器发送数据。过滤特定端口如果你的Web服务跑在80/443端口攻击很可能指向这里。启动iftop时指定端口iftop -f ‘port 80 or port 443’或者进入iftop界面后按p键可以开关端口显示让你看清流量具体指向哪个服务端口。屏蔽本地/内网流量有时监控流量或内部系统同步会产生干扰。你可以使用-F参数过滤网段。例如只查看发送到公网IP假设为1.2.3.4的流量iftop -F 1.2.3.4/24但这个参数需要你明确知道自己的网络配置。实操心得在真实的DDoS攻击中你往往会看到几十甚至上百个不同的IP地址同时以很高的速率发送流量这就是“分布式”的体现。通过iftop你可以迅速获得以下关键信息攻击流量的主要目标端口是哪些流量最大的前10个源IP是哪些这些IP是来自同一个国家或ASN自治系统吗记下这些TOP N的IP地址它们是下一步用tcpdump进行深度包分析的直接目标。4. 微观解剖用tcpdump捕获与分析攻击包iftop告诉我们“谁”在疯狂发送流量而tcpdump则要告诉我们“他们发送的到底是什么”。它是网络界的“显微镜”能够捕获流经网卡的原始数据包并允许我们对其内容、协议、标志位进行深入分析。4.1 针对攻击源的精准抓包策略在带宽被打满的服务器上运行tcpdump如果抓所有包可能会加剧负载并且产生巨大的pcap文件难以分析。因此抓包必须精准。假设通过iftop我们发现了两个主要的攻击源IP203.0.113.10和198.51.100.20且流量都指向TCP 80端口。基础抓包命令只抓取来自这两个IP且目标端口为80的包并保存到文件。tcpdump -i eth0 -w attack.pcap ‘(src host 203.0.113.10 or src host 198.51.100.20) and dst port 80’-i eth0指定网卡。-w attack.pcap将抓取的原始数据包写入文件便于后续分析。‘…’BPF过滤表达式这是tcpdump的灵魂。这里只抓出来自两个特定源IP且目标端口为80的包。限制抓包大小与数量为了不影响服务器性能并防止pcap文件过大可以添加限制。tcpdump -i eth0 -s 96 -W 5 -C 100 -w attack.pcap ‘dst port 80’-s 96只抓每个包的前96个字节。对于判断攻击类型如SYN Flood看IPTCP头就够了通常无需抓取完整应用层数据这能极大减少负载和文件大小。-W 5 -C 100最多保存5个文件每个文件最大100MB。文件会轮转命名为attack.pcap, attack.pcap1, attack.pcap2…这个命令抓取了所有目标为80端口的流量适合在攻击源IP非常多难以一一列举时使用。4.2 实时分析与攻击特征识别有时我们需要边抓包边进行初步分析以快速判断攻击类型。识别SYN FloodSYN Flood会发送大量SYN包但不完成三次握手。你可以用以下命令统计来自某个IP的SYN包速率tcpdump -i eth0 -tnn ‘src host 203.0.113.10 and dst port 80 and tcp[tcpflags] (tcp-syn) ! 0 and tcp[tcpflags] (tcp-ack) 0’ | awk ‘{print $3}’ | cut -d. -f1-4 | sort | uniq -c | sort -nr | head这个复杂的命令分解开来tcp[tcpflags] (tcp-syn) ! 0匹配TCP标志位中SYN置位的包。and tcp[tcpflags] (tcp-ack) 0同时要求ACK标志位为0即纯SYN包。后面用awk、cut、sort、uniq进行源IP计数和排序。如果发现来自某个IP的纯SYN包数量在短时间内急剧增加就是典型特征。识别UDP Flood/反射放大攻击这类攻击常使用DNS、NTP、SSDP等协议的反射放大。抓取UDP大包tcpdump -i eth0 -tnn ‘udp and dst port 53 and length 500’查看是否有大量来自不同源IP但目标端口是你服务器53端口DNS的大尺寸UDP包。识别HTTP Flood这类攻击模拟正常HTTP请求更难以过滤。需要查看应用层内容。tcpdump -i eth0 -s0 -A ‘dst port 80 and tcp[((tcp[12:1] 0xf0) 2):4] 0x47455420’-s0抓取完整数据包。-A以ASCII格式打印数据方便看HTTP内容。tcp[((tcp[12:1] 0xf0) 2):4] 0x47455420这是一个高级BPF过滤器用于匹配TCP负载数据前4个字节为GET十六进制0x47455420的包即HTTP GET请求。 通过观察GET请求的URL是否规律、User-Agent是否正常、频率是否异常高来判断。重要提示在生产环境抓包尤其是-s0抓全包对I/O和CPU有显著影响。务必在Screen会话中执行并且抓取时间不宜过长如30-60秒获取足够样本即可。分析应主要在下载到本地后的pcap文件上进行。5. 离线深度分析从抓包文件到攻击报告将抓取到的attack.pcap文件下载到本地分析环境如你的笔记本电脑使用更强大的图形化工具进行深度分析这比在服务器上用命令行更高效、更全面。5.1 使用Wireshark进行可视化分析Wireshark是tcpdump的图形化版本功能强大。统计流量排名打开pcap文件后点击Statistics-Conversations。在“IPv4”或“TCP/UDP”标签页下你可以清晰地看到所有通信对的流量大小、包数排名。这可以验证iftop的发现并发现更多中低流量的攻击IP。分析协议分布点击Statistics-Protocol Hierarchy。这里按协议分层统计了流量占比。如果发现UDP流量特别是DNS、NTP异常高而你的业务主要是TCP/HTTP那很可能遭遇了反射放大攻击。深入查看攻击流在Conversations里找到流量最大的那个TCP流右键点击 -Follow-TCP Stream。Wireshark会重组这个TCP会话的所有数据。对于HTTP Flood你可以直接看到完整的、连续的HTTP请求。观察这些请求URL是否规律是否是针对同一个消耗资源的动态页面如搜索、登录Header是否异常User-Agent是否统一为某个不常见的值是否缺少Referer、Cookie等正常浏览器会发送的头部行为是否异常是否在极短时间内对同一页面发起数十次相同请求识别慢速攻击有些攻击如Slowloris会建立连接后缓慢发送HTTP头部耗尽服务器连接池。在Wireshark中你可以过滤出持续时间很长的TCP连接tcp.time_delta 10并查看其数据交互模式是否长时间只发送了很少的字节。5.2 生成攻击特征摘要分析完成后你需要整理一份关键证据用于向机房、云服务商或安全团队发起投诉和防御请求。这份摘要应包括攻击时间范围精确到分钟。攻击类型判断基于分析是SYN Flood、UDP Flood、HTTP Flood还是混合型主要攻击源IP列表列出流量最大的前20-50个IP。可以从Wireshark的Conversations中导出。攻击目标端口80, 443, 53等。攻击包特征对于SYN Flood附上显示大量SYN包的过滤表达式和统计截图。对于UDP反射注明反射协议DNS/NTP/SSDP和典型的请求内容如DNS查询ANY类型。对于HTTP Flood提供1-2个完整的异常HTTP请求示例包括Headers。抓包文件摘要文件大小、包数量、时间跨度。这份摘要结合原始的pcap文件就是你进行投诉、在防火墙配置黑名单、或者调整DDoS防护策略最有力的证据。6. 应急缓解与后续加固措施定位到攻击源并分析出特征后你需要立即行动缓解攻击并思考如何避免下次再被打得措手不及。6.1 基于分析结果的临时封禁在服务器层面可以立即采取一些措施使用iptables封禁IP对于明确的攻击源IP段可以批量封禁。# 封禁单个IP iptables -A INPUT -s 203.0.113.10 -j DROP # 封禁整个IP段谨慎使用避免误伤 iptables -A INPUT -s 203.0.113.0/24 -j DROP # 保存iptables规则CentOS/RHEL 6 service iptables save # (CentOS/RHEL 7/Ubuntu 使用iptables-persistent或firewalld)对于HTTP Flood可以更精细地封禁例如封禁带有特定异常User-Agent的请求iptables -A INPUT -p tcp --dport 80 -m string --string “Malicious-Bot” --algo bm -j DROP调整内核参数针对SYN Flood可以临时调整内核参数以增加半连接队列容量和减少等待时间。sysctl -w net.ipv4.tcp_syncookies1 sysctl -w net.ipv4.tcp_max_syn_backlog2048 sysctl -w net.ipv4.tcp_synack_retries2 sysctl -w net.ipv4.tcp_syn_retries2注意内核参数的调整需要根据服务器硬件和业务情况谨慎进行不当的设置可能影响正常服务。重要提醒在云服务器环境下优先使用云服务商提供的安全组或网络ACL功能进行封禁。因为云内流量在到达你服务器实例之前会先经过虚拟网络层在安全组层面封禁能更早地丢弃攻击包减轻服务器自身的负载。服务器内部的iptables封禁是最后一道防线。6.2 构建长效防御与监控体系一次应急处理完毕绝不能就此结束。必须建立长效机制。启用专业DDoS防护对于经常遭受攻击或业务关键的系统购买云服务商或第三方的DDoS高防服务是必选项。高防IP、流量清洗中心能抵御绝大多数流量型和反射型攻击。部署Web应用防火墙对于HTTP/HTTPS业务部署WAF可以有效防御HTTP Flood、CC攻击以及各种Web漏洞利用。云WAF或自建ModSecurity都是可选项。完善监控与告警不要只监控带宽。建立更立体的监控连接数监控监控服务器各端口的TCP连接状态特别是SYN_RECV。PPS监控监控每秒数据包数量。某些攻击流量不大但包量巨大如ACK Flood。业务层监控监控关键API的响应时间、错误率。HTTP Flood可能带宽不高但会拖垮应用。为这些指标设置合理的告警阈值。制定并演练应急预案将本文的流程文档化形成团队的《DDoS应急响应手册》。明确每个人的角色谁负责定位、谁负责封禁、谁联系供应商。定期进行演练确保流程顺畅。7. 常见问题与排查技巧实录在实际操作中你肯定会遇到各种各样的问题。这里记录几个我踩过的坑和总结的技巧。7.1 问题排查速查表问题现象可能原因排查命令/思路iftop无显示或显示不全1. 网卡指定错误。2. 权限不足需root。3. 流量类型被过滤。1.ip addr确认活动网卡名可能是ens33, enp0s3等。2. 用sudo iftop或iftop -P运行。3. 尝试iftop -N -n关闭端口解析和DNS解析看纯IP。tcpdump抓不到包1. 过滤表达式错误。2. 抓包位置不对如容器内。3. 网卡处于混杂模式1. 先用tcpdump -i eth0 -c 5抓5个任意包测试。2. 在宿主机上抓取容器的虚拟网卡流量。3. tcpdump无需网卡混杂模式也能抓本机流量。pcap文件过大无法下载抓包时未限制大小和时间。1. 在服务器上用tcpdump -r attack.pcap -c 100先预览前100个包。2. 用scp或rsync支持断点续传。3. 使用tcpdump -s 96只抓包头。攻击IP数量巨大难以封禁这是DDoS常态IP池可能达数万。1.放弃在主机层面封禁这是无效的。2. 立即启用云厂商的DDoS防护服务。3. 联系运营商在骨干网进行流量清洗。攻击停止后服务仍缓慢1. 服务器连接数表被占满。2. 应用进程未释放资源。3. 监控延迟或误报。1. 重启受影响的Web服务如nginx, apache。2. 检查ss -s看TIME-WAIT等状态连接数必要时可调整内核参数。3. 清除DNS缓存、CDN缓存。7.2 独家避坑技巧“Screen/Tmux”是你的生命线我再三强调在应急响应时第一步永远是开Screen/Tmux。我见过太多人因为SSH断连导致抓包中断在老板和用户的双重压力下崩溃的样子。先iftop再tcpdump这个顺序不能乱。先用iftop宏观定位“嫌疑犯”IP和端口再用tcpdump针对性地抓包。一上来就tcpdump -i eth0抓全量包等于在洪水里找一滴水效率极低还可能把系统拖垮。保存证据优先于解决问题在能维持基础服务的情况下花几分钟抓取有效的pcap样本比盲目封IP更重要。这份证据对于后续溯源、投诉、优化防御策略有不可替代的价值。可以设定一个抓包时间比如60秒到点就停。理解云环境的责任共担模型在阿里云、腾讯云等云平台上DDoS防护是分层级的。一般来说云厂商会免费提供一定阈值如5Gbps的基础流量清洗。但超过这个阈值或者针对应用层Layer 7的复杂攻击就需要你购买高防产品。明确你的云服务商能为你做什么你需要自己做什么这点至关重要。保持冷静按流程操作DDoS攻击发生时压力巨大。但越是慌乱越容易出错。心里默念“保命-抓凶-治病”的流程一步一步来。先通过VNC/控制台登录保命再用iftop/tcpdump分析抓凶最后根据分析结果封禁或启用高防治病。建立好自己的应急预案清单把它贴在显眼的地方。处理DDoS攻击是一场与攻击者在时间和资源上的赛跑。通过熟练掌握iftop和tcpdump这一对组合拳你至少能在赛跑中看清对手的样貌和路径从而做出最有效的反击。这套方法不仅适用于DDoS对于任何突发性的网络流量异常排查都是你工具箱里不可或缺的利器。