首页服务器教程Linux Tcpdump抓包教程:安装、过滤规则与常用命令详解

Linux Tcpdump抓包教程:安装、过滤规则与常用命令详解

2026-08-05 476

服务器出现连接超时、接口访问失败、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、端口或协议过滤条件;
  • 使用-ctimeout-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

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。
Linux Tcpdump抓包教程
下一篇:

已经没有下一篇了!

相关文章