面对一台怀疑被攻击的Linux服务器,最直接有效的起点不是查日志,而是抓包。日志可能被篡改或抹除,但网络层的原始数据包不会说谎。tcpdump作为Linux下最基础的抓包工具,能让你实时看到进出服务器的每一比特数据,迅速定位异常流量、扫描行为、DDoS攻击或漏洞利用的载荷。关键是你要知道抓什么、怎么看、如何从海量数据中提炼出攻击向量。

理解攻击向量的分析逻辑

攻击向量不是单指某个IP或端口,而是攻击者从进入点到最终目标的完整路径。用tcpdump分析时,要关注三个层面:流量模式是否异常(如突发性SYN洪流)、协议行为是否违规(如畸形HTTP请求)、载荷内容是否包含恶意特征(如反弹Shell命令)。抓包前先明确问题范围——是服务器向外发起异常连接(可能已被入侵),还是外部对服务器发起攻击。前者抓出口流量,后者抓入口流量。

基础抓包命令与过滤策略

直接运行tcpdump不加任何过滤会瞬间淹没在数据里。你需要精准过滤,从网络层到应用层逐级收缩。先看所有进出eth0网卡的流量,排除SSH管理会话的干扰:

tcpdump -i eth0 -nn not port 22

-nn参数禁止域名和端口名解析,直接显示IP和端口号,既加速抓包又避免反向查询产生的额外DNS流量干扰判断。如果怀疑特定IP在扫描或攻击,立即锁定:

tcpdump -i eth0 -nn src host 192.168.1.100

src表示源地址,dst表示目标地址。实际分析中,组合过滤才是核心。比如捕获所有发往本机80端口的SYN包,用于识别TCP SYN Flood:

tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0 and dst port 80'

这条命令直接读取TCP标志位,只抓SYN包。如果一秒内刷出数百条记录,基本可以判定是SYN Flood攻击。tcpdump的强大在于BPF过滤器可以深入协议字段,比如抓取ICMP Echo Request(ping洪水)且包大小超过正常值(如1000字节)的异常流量:

tcpdump -i eth0 -nn 'icmp[icmptype] == 8 and greater 1000'
分析端口扫描行为

端口扫描是攻击的前奏。用tcpdump可以快速识别扫描类型。TCP Connect扫描会产生大量SYN包后紧跟RST或ACK,而SYN扫描(半开扫描)只发送SYN包,收到SYN/ACK后不发ACK而是发RST。抓取短时间内同一源IP向大量不同端口发送SYN包的流量:

tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0 and not host your_trusted_ip'

观察输出,如果某个IP在几秒内对多个端口发起连接,且端口号呈递增或随机分布,这就是扫描特征。更隐蔽的UDP扫描会产生大量到不同端口的UDP包,目标端口关闭时会触发ICMP Port Unreachable响应。抓取这种模式:

tcpdump -i eth0 -nn 'udp or icmp[icmptype] == 3'

ICMP类型3是目标不可达,代码3是端口不可达。大量此类响应说明有人在探测UDP服务。

捕获DDoS攻击流量特征

DDoS攻击的流量模式与正常流量有本质区别。反射放大攻击(如DNS、NTP、Memcached)会使用特定端口作为反射源。如果服务器突然收到大量来自53端口(DNS)或11211端口(Memcached)的UDP大包,且源IP分散,这是典型的反射攻击。抓取并统计:

tcpdump -i eth0 -nn 'udp and src port 53 and greater 500' -c 1000

HTTP Flood攻击则表现为大量正常TCP连接,但请求内容异常。抓取80端口的HTTP请求头:

tcpdump -i eth0 -nn -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

-A以ASCII显示内容,-s 0抓取完整包。这条命令过滤出有数据的TCP包,然后查看HTTP请求是否反复请求同一资源、是否包含随机参数、User-Agent是否异常。攻击流量往往缺少正常浏览器的完整头信息或Cookie。

深入载荷分析发现漏洞利用

真正的威胁藏在载荷里。SQL注入、命令注入、Webshell上传都通过HTTP请求体传输。抓取POST请求的完整内容:

tcpdump -i eth0 -nn -A -s 0 'tcp port 80 and (tcp[((tcp[12]&0xf0)>>2):4] = 0x504f5354)'

0x504f5354是“POST”的十六进制。输出中查看请求体是否包含SQL语句片段(如union select)、系统命令(如whoami、id)、编码后的恶意代码(base64字符串)。对于HTTPS流量,tcpdump看不到加密内容,但可以抓取TLS握手阶段的Server Name Indication(SNI),分析客户端正在访问哪些域名,判断是否有到恶意域名的异常连接:

tcpdump -i eth0 -nn -A 'tcp port 443 and (tcp[((tcp[12]&0xf0)>>2):2] = 0x1603)'

0x1603是TLS握手记录。在输出中搜索SNI字段,检查域名是否可疑。如果服务器本身不提供HTTPS服务却向外发起443连接,说明可能已被植入后门向外通信。

检测反弹Shell与C2通信

服务器被入侵后,攻击者通常会建立反弹Shell或C2信道。反弹Shell的特征是长时间保持的TCP连接,且数据交互具有规律性。抓取所有非标准端口的出站连接:

tcpdump -i eth0 -nn 'tcp and not dst port (22 or 80 or 443 or 53) and src host server_ip'

观察是否有连接到可疑IP的高位端口(如4444、5555、8888等常见反弹Shell端口)。进一步抓取这些连接的内容:

tcpdump -i eth0 -nn -A -s 0 'host suspicious_ip'

如果看到明文传输的系统命令或输出(如/bin/sh、root、passwd文件内容),可以确认是反弹Shell。更隐蔽的C2通信可能使用DNS隧道或ICMP隧道。DNS隧道会产生大量TXT或NULL类型的DNS查询,域名长度异常。抓取DNS查询:

tcpdump -i eth0 -nn 'udp port 53' -v

-v显示详细信息,查看查询域名是否由随机字符组成、长度是否超过正常域名。ICMP隧道则利用ICMP Echo的载荷传输数据,抓取ICMP包并检查载荷是否包含非随机内容:

tcpdump -i eth0 -nn -X 'icmp'

-X以十六进制和ASCII同时显示,如果载荷中出现可读文本或规律性数据,说明ICMP被滥用。

高级抓包技巧与实时分析

面对高速流量,tcpdump可以配合管道实时处理。比如统计每秒SYN包数量,快速判断SYN Flood:

tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0' -l | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush()}'

-l参数使输出行缓冲,配合awk实时打印时间戳。更高效的做法是将抓包数据保存为pcap文件,后续用Wireshark或其他工具深度分析:

tcpdump -i eth0 -nn -w attack_capture.pcap -s 0

保存完整包数据,-s 0确保不截断。设置文件轮转避免磁盘写满:

tcpdump -i eth0 -nn -w capture_%Y%m%d_%H%M%S.pcap -G 3600 -s 0

-G 3600每小时生成一个新文件。事后用tcpdump读取pcap文件进行过滤分析,不影响实时抓包。

识别特定攻击场景的实战案例

场景一:发现服务器向外大量发送DNS查询,疑似DNS隧道。抓包命令:

tcpdump -i eth0 -nn -v 'udp port 53 and src host 192.168.1.10' -c 100

输出显示查询域名如“aGVsbG8ud29ybGQ=.malicious.com”,base64解码后是“hello.world”,确认数据外泄。

场景二:Web服务器响应缓慢,怀疑慢速HTTP攻击(Slowloris)。抓取80端口流量,关注不完整的HTTP请求:

tcpdump -i eth0 -nn -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

检查输出中是否存在只发送了部分HTTP头、从不发送结束标志的请求,攻击者通过保持大量半开连接耗尽服务器连接池。

场景三:SSH暴力破解。抓取22端口的连接失败记录:

tcpdump -i eth0 -nn 'tcp port 22 and (tcp[tcpflags] & tcp-rst != 0)'

大量RST包说明连接被拒绝,结合源IP统计即可发现爆破源。更精确的方法是抓取SSH协议版本交换:

tcpdump -i eth0 -nn -A -s 0 'tcp port 22 and (tcp[((tcp[12]&0xf0)>>2):4] = 0x5353482d)'

0x5353482d是“SSH-”的十六进制,能看到客户端和服务端的版本字符串,判断是否有异常客户端。

从抓包到防御的闭环思路

tcpdump的价值不仅是发现问题,更是为防御提供依据。抓到攻击流量后,立即提取特征:攻击源IP段、目标端口、请求特征字符串、User-Agent模式、载荷关键字。这些特征可以直接写入iptables规则临时阻断:

iptables -A INPUT -s attack_ip -j DROP

或写入Web服务器(如Nginx)的黑名单规则,针对特定User-Agent或URL模式返回403。长期看,将pcap文件中的攻击载荷提取出来,转化为IDS/IPS规则,比如Snort或Suricata的签名,实现自动化检测。tcpdump的抓包数据是安全运营的原始情报,每一次分析都在完善你的防御体系。

掌握tcpdump的精髓在于理解协议行为,而不只是记住命令参数。当你看到SYN包就知道握手状态,看到RST就知道拒绝原因,看到载荷中的十六进制就能识别恶意模式,你就不再依赖工具的报告,而是直接与网络对话。这种能力让你在任何应急响应中,都能第一时间抓住攻击的本质。