服务器出现连接超时、接口访问失败、DNS解析异常或端口通信问题时,仅查看应用日志往往无法确定故障发生在哪个环节。Tcpdump可以直接捕获经过网络接口的数据包,帮助管理员检查客户端是否发起请求、服务器是否返回响应,以及TCP连接和DNS查询是否正常。
Tcpdump是Linux、BSD、Solaris等类Unix系统中常用的命令行抓包工具。它基于libpcap捕获网络流量,支持按网卡、协议、IP地址、端口和数据包方向设置过滤条件,也可以将数据保存为pcap文件,再使用Wireshark进行图形化分析。
抓包数据可能包含IP地址、域名、Cookie、请求参数及其他敏感信息。只能在拥有管理权限或获得明确授权的服务器和网络中使用Tcpdump,并妥善保管生成的pcap文件。
一、Tcpdump可以做什么
Tcpdump主要用于捕获和分析经过服务器网络接口的数据包,常见用途包括:
- 检查指定端口是否收到请求;
- 判断TCP连接在哪个阶段失败;
- 排查DNS查询和响应异常;
- 分析客户端与服务器之间的数据流向;
- 检查防火墙、反向代理和负载均衡配置;
- 捕获HTTP明文请求;
- 保存pcap文件并交给Wireshark分析;
- 比较不同网卡、IP或端口的流量。
Tcpdump名称通常被理解为“TCP数据转储”,但它不只支持TCP,还可以捕获UDP、ICMP、ARP、DNS等多种协议流量。
二、如何安装Tcpdump
1、Ubuntu和Debian安装Tcpdump
更新软件包索引并安装:
sudo apt update
sudo apt install tcpdump
原命令中的apt-getinstall缺少空格,正确写法是:
sudo apt-get install tcpdump
2、CentOS和RHEL安装Tcpdump
较新的系统可以使用:
sudo dnf install tcpdump
旧版CentOS可使用:
sudo yum install tcpdump
3、AlmaLinux和Rocky Linux安装Tcpdump
sudo dnf install tcpdump
4、验证是否安装成功
tcpdump --version
正常情况下,终端会显示Tcpdump和libpcap的版本信息。
5、Windows如何使用Tcpdump
Tcpdump主要用于类Unix系统。Windows用户可以使用Wireshark附带的TShark、Npcap,或者使用WinDump。
旧资料中经常提到WinPcap,但该项目已经长期停止维护。现代Windows环境通常优先选择Npcap,并根据软件要求安装兼容模式。
三、Tcpdump基本命令格式
Tcpdump的基本格式如下:
sudo tcpdump [选项] [过滤表达式]
例如,监听eth0网卡上的80端口流量:
sudo tcpdump -i eth0 -nn port 80
其中:
sudo:抓包通常需要管理员权限或相应Linux能力;-i eth0:指定监听eth0网卡;-nn:不解析主机名和服务名称;port 80:只捕获源端口或目标端口为80的数据包。
如果当前系统中没有eth0,需要先查看实际网卡名称。
四、常用Tcpdump参数说明
Tcpdump参数较多,日常服务器排障常用以下选项。
| 参数 | 作用 |
|---|---|
-D |
列出可以抓包的网络接口 |
-i |
指定监听的网络接口 |
-c |
捕获指定数量的数据包后退出 |
-n |
不把IP地址解析为主机名 |
-nn |
不解析主机名和端口服务名称 |
-A |
以ASCII格式显示数据内容 |
-X |
同时以十六进制和ASCII格式显示数据 |
-e |
显示数据链路层头部信息 |
-q |
使用较简洁的输出格式 |
-v |
显示详细信息 |
-vv |
显示更详细的信息 |
-vvv |
显示最详细的信息 |
-s |
设置每个数据包的抓取长度 |
-w |
将数据包写入pcap文件 |
-r |
从pcap文件读取数据 |
-C |
达到指定文件大小后切换文件 |
-W |
限制轮转文件数量 |
-G |
按时间间隔轮转文件 |
-tttt |
输出完整日期和时间 |
-l |
对标准输出启用行缓冲 |
-U |
将捕获的数据及时写入文件 |
-p |
不让网卡进入混杂模式 |
-S |
显示绝对TCP序列号 |
1、-s参数应该怎么设置
部分旧版本Tcpdump默认只抓取数据包开头的一小段,现代版本通常会采用较大的默认抓取长度。为了保存完整数据包,可以明确使用:
sudo tcpdump -s 0
这里的0表示根据当前Tcpdump和libpcap的实现捕获完整数据包,而不是仅保存固定长度的数据。
2、-A、-X和-XX有什么区别
-A:以ASCII格式显示数据包内容;-X:同时显示十六进制和ASCII数据;-XX:与-X类似,同时包含链路层头部。
这些选项可能直接显示明文请求和敏感参数,生产环境中应谨慎使用。
3、-w为什么看不到终端输出
使用-w后,Tcpdump会把原始数据包写入文件,而不是在终端中逐条解析显示。例如:
sudo tcpdump -i eth0 -nn -w capture.pcap
抓包结束后,可以使用Tcpdump或Wireshark打开该文件。
五、如何查看服务器网卡
1、列出Tcpdump支持的网卡
sudo tcpdump -D
输出结果可能包括:
1.eth0
2.any
3.lo
2、使用ip命令查看网卡
ip address
云服务器中的网卡名称不一定是eth0,也可能是:
ens3
ens5
enp0s3
enp1s0
3、监听所有网卡
Linux通常可以使用any伪接口监听多个网卡:
sudo tcpdump -i any -nn
any适合不确定流量经过哪张网卡的场景,但它在链路层信息和混杂模式方面存在一定限制。
六、Tcpdump过滤表达式怎么写
Tcpdump使用BPF过滤表达式筛选数据包,常用过滤对象包括:
host:主机;net:网段;port:端口;portrange:端口范围;src:来源;dst:目标;tcp:TCP协议;udp:UDP协议;icmp:ICMP协议;ether:以太网和MAC地址。
过滤条件可以使用以下逻辑运算符组合:
and:同时满足;or:满足任一条件;not:排除条件。
为了避免Shell错误解释括号或特殊字符,复杂表达式建议放在单引号中。
七、Tcpdump常见抓包命令
1、监听默认网卡
sudo tcpdump
这种方式会输出大量数据,不适合流量较高的生产服务器。实际排障时建议明确指定网卡和过滤条件。
2、监听指定网卡
sudo tcpdump -i eth0
显示IP和数字端口:
sudo tcpdump -i eth0 -nn
3、限制抓包数量
捕获100个数据包后自动退出:
sudo tcpdump -i eth0 -nn -c 100
4、抓取指定主机
捕获与192.168.1.2有关的全部流量:
sudo tcpdump -i eth0 -nn 'host 192.168.1.2'
只捕获发往该主机的数据:
sudo tcpdump -i eth0 -nn 'dst host 192.168.1.2'
只捕获该主机发出的数据:
sudo tcpdump -i eth0 -nn 'src host 192.168.1.2'
5、抓取指定端口
捕获80端口流量:
sudo tcpdump -i eth0 -nn 'port 80'
捕获目标端口为443的数据包:
sudo tcpdump -i eth0 -nn 'dst port 443'
捕获来源端口为53的数据包:
sudo tcpdump -i eth0 -nn 'src port 53'
6、抓取指定主机和端口
捕获来自192.168.1.2且经过80端口的流量:
sudo tcpdump -i eth0 -nn 'src host 192.168.1.2 and port 80'
捕获发往192.168.1.2:443的TCP流量:
sudo tcpdump -i eth0 -nn 'tcp and dst host 192.168.1.2 and dst port 443'
7、排除指定端口
排除SSH的22端口:
sudo tcpdump -i eth0 -nn 'not port 22'
远程连接服务器抓包时,经常需要排除当前SSH流量,否则终端输出本身可能产生更多网络数据,形成大量无关记录。
同时排除SSH和HTTPS:
sudo tcpdump -i eth0 -nn 'not port 22 and not port 443'
8、抓取端口范围
sudo tcpdump -i eth0 -nn 'portrange 8000-9000'
9、抓取指定网段
sudo tcpdump -i eth0 -nn 'net 192.168.1.0/24'
只捕获来自该网段的数据:
sudo tcpdump -i eth0 -nn 'src net 192.168.1.0/24'
10、抓取指定MAC地址
正确的MAC地址过滤命令如下:
sudo tcpdump -i eth0 -nn 'ether host 11:22:33:44:55:66'
只匹配来源MAC地址:
sudo tcpdump -i eth0 -nn 'ether src 11:22:33:44:55:66'
保存为pcap文件:
sudo tcpdump -i eth0 -nn -w mac-capture.pcap \
'ether host 11:22:33:44:55:66'
MAC地址过滤只能在相应的二层网络范围内生效。经过路由器或云平台虚拟网络后,服务器通常看不到远端用户的真实MAC地址。
八、按网络协议抓包
1、只抓取TCP数据包
sudo tcpdump -i eth0 -nn tcp
2、只抓取UDP数据包
sudo tcpdump -i eth0 -nn udp
3、抓取ICMP数据包
sudo tcpdump -i eth0 -nn icmp
该命令可用于分析IPv4 Ping请求和响应。
IPv6环境可以使用:
sudo tcpdump -i eth0 -nn icmp6
4、抓取ARP数据包
sudo tcpdump -i eth0 -nn arp
ARP抓包适合排查同一局域网中的IP与MAC地址解析问题。
九、常见服务器故障抓包示例
1、检查DNS查询
捕获UDP 53端口流量:
sudo tcpdump -i any -nn 'udp port 53'
同时捕获使用TCP的DNS查询:
sudo tcpdump -i any -nn 'port 53'
如果需要查看DNS解析详情,可以提高输出级别:
sudo tcpdump -i any -nn -vv 'port 53'
2、检查HTTP明文请求
sudo tcpdump -i eth0 -nn -s 0 -A 'tcp port 80'
该命令可能显示请求头、Cookie和提交内容,只能在授权环境下使用。
HTTPS流量经过TLS加密,Tcpdump通常只能看到连接信息,不能直接读取加密后的HTTP正文。
3、检查SSH连接
sudo tcpdump -i eth0 -nn 'tcp port 22'
检查指定客户端是否连接服务器:
sudo tcpdump -i eth0 -nn \
'src host 203.0.113.10 and tcp dst port 22'
4、检查MySQL连接
MySQL默认使用3306端口:
sudo tcpdump -i eth0 -nn 'tcp port 3306'
如果数据库只监听本地回环接口,应监听lo:
sudo tcpdump -i lo -nn 'tcp port 3306'
5、检查Web应用端口
例如检查3000端口的Node.js应用:
sudo tcpdump -i any -nn 'tcp port 3000'
如果反向代理访问应用时出现502错误,可以用该命令确认Nginx是否向应用端口发起连接,以及应用是否返回数据。
十、如何抓取TCP握手数据包
TCP建立连接通常经过SYN、SYN-ACK和ACK三个步骤。
只捕获包含SYN标志的数据包:
sudo tcpdump -i eth0 -nn \
'tcp[tcpflags] & tcp-syn != 0'
只捕获初始SYN,不包含SYN-ACK:
sudo tcpdump -i eth0 -nn \
'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn'
如果持续看到客户端SYN,但没有服务器SYN-ACK,可能需要检查:
- 服务是否监听目标端口;
- 云平台安全组是否放行;
- Linux防火墙是否拦截;
- 请求是否到达正确IP;
- 服务器是否存在路由或网络故障。
十一、如何保存和读取pcap文件
1、将抓包结果保存到文件
sudo tcpdump -i eth0 -nn -s 0 -w capture.pcap
按Ctrl+C结束抓包。
2、读取pcap文件
tcpdump -nn -r capture.pcap
只读取文件中的80端口流量:
tcpdump -nn -r capture.pcap 'port 80'
3、保存指定数量的数据包
sudo tcpdump -i eth0 -nn -c 1000 -w capture.pcap
捕获1000个数据包后自动退出,适合避免抓包任务长时间运行。
十二、如何轮转Tcpdump抓包文件
长时间抓包容易占满服务器磁盘,应设置文件大小、时间或文件数量限制。
1、按文件大小轮转
每个文件最大100MB,最多保存10个文件:
sudo tcpdump -i eth0 -nn -s 0 \
-C 100 -W 10 -w capture.pcap
-C 100表示文件达到约100MB时切换,-W 10限制最多保存10个轮转文件。
2、按时间轮转
每300秒生成一个文件:
sudo tcpdump -i eth0 -nn -s 0 \
-G 300 -w 'capture-%Y%m%d-%H%M%S.pcap'
按时间轮转时,还需要结合timeout、-W或外部任务管理工具限制总运行时间及文件数量。
3、限制抓包持续时间
抓取60秒后停止:
sudo timeout 60 tcpdump -i eth0 -nn -s 0 \
-w capture.pcap
该方式适合快速收集故障时间段的网络数据。
十三、Tcpdump输出怎么看
典型输出如下:
10:20:31.123456 IP 192.168.1.10.52344 > 192.168.1.20.80:
Flags [S], seq 1000, win 64240, length 0
主要字段含义如下:
| 字段 | 含义 |
|---|---|
10:20:31.123456 |
数据包时间 |
IP |
网络协议 |
192.168.1.10.52344 |
来源IP和来源端口 |
> |
数据方向 |
192.168.1.20.80 |
目标IP和目标端口 |
Flags [S] |
TCP标志位 |
seq |
TCP序列号 |
win |
TCP接收窗口 |
length |
数据负载长度 |
常见TCP标志包括:
[S]:SYN,请求建立连接;[S.]:SYN和ACK,同意建立连接;[.]:ACK确认;[P.]:PSH和ACK,通常携带应用数据;[F.]:FIN,正常关闭连接;[R]:RST,重置连接。
十四、Tcpdump常见问题
1、提示没有权限怎么办
抓包通常需要root权限,可以使用:
sudo tcpdump
生产环境中也可以通过Linux capabilities授予受控权限,但需要谨慎配置,避免普通用户获得不必要的网络监听能力。
2、找不到eth0怎么办
先运行:
ip address
或者:
sudo tcpdump -D
再将命令中的eth0替换为实际网卡名称,例如ens3。
3、抓不到本机服务之间的流量怎么办
本机进程可能通过回环接口通信,需要监听lo:
sudo tcpdump -i lo -nn
也可以先监听所有接口:
sudo tcpdump -i any -nn
4、为什么看不到HTTPS正文
HTTPS通过TLS加密。Tcpdump可以看到IP、端口、连接时间、数据包大小和部分握手信息,但不能直接显示加密后的HTTP正文。
若需分析HTTPS应用问题,应结合反向代理日志、应用日志、浏览器开发者工具和授权的调试方案。
5、为什么主机名和端口名称影响排查效率
默认情况下,Tcpdump可能尝试把IP和端口解析成名称,增加DNS查询或让输出不够直观。服务器排障通常建议使用:
-nn
6、如何停止Tcpdump
在前台运行时按:
Ctrl+C
Tcpdump随后会显示已捕获、过滤器接收和内核丢弃的数据包数量。
十五、Tcpdump使用注意事项
- 只在拥有管理权限或明确授权的网络中抓包;
- 为命令添加IP、端口或协议过滤条件;
- 使用
-c、timeout、-C和-W限制数据量; - 抓包前确认服务器剩余磁盘空间;
- 不要公开上传包含敏感信息的pcap文件;
- 传输pcap前进行加密并限制访问权限;
- 分析完成后按安全规范删除不再需要的数据;
- 生产环境避免长时间开启无过滤抓包;
- 处理HTTPS问题时不要假设Tcpdump可以直接解密业务数据。
常见问题
Tcpdump是什么?
Tcpdump是基于libpcap的命令行网络抓包工具,可捕获并过滤经过网络接口的数据包,也能将数据保存为pcap文件。
Tcpdump和Wireshark有什么区别?
Tcpdump主要通过命令行工作,适合服务器和远程环境;Wireshark提供图形界面,适合对pcap文件进行深入分析。两者可以配合使用。
Tcpdump怎么抓取指定IP和端口?
例如捕获来自192.168.1.2且经过80端口的流量:
sudo tcpdump -i eth0 -nn \
'src host 192.168.1.2 and port 80'
Tcpdump怎么排除SSH端口?
sudo tcpdump -i eth0 -nn 'not port 22'
远程排障时排除SSH流量,可以减少终端连接产生的无关数据。
Tcpdump怎么保存抓包文件?
sudo tcpdump -i eth0 -nn -s 0 -w capture.pcap
抓包完成后,可以使用tcpdump -r或Wireshark读取。
Tcpdump能查看HTTPS内容吗?
通常不能。HTTPS正文经过TLS加密,Tcpdump主要用于分析连接、握手、延迟和数据包流向,无法直接显示加密后的请求内容。
相关教程:
《Linux怎么设置开机自启?systemd注册系统服务详细步骤》
《Linux实时查看日志文件教程:tail、Multitail、Lnav等常用日志监控方法》
《Linux日志轮转机制详解:logrotate安装、配置、工作原理与排查方法》
-
广告合作
-
QQ群号:4114653



