
Tcpdump 是信息安全领域常用的嗅探和网络分析工具,大部分 Linux 发行版都内置了 Tcpdump 工具。如果没有,也可以直接使用对应的包管理器进行安装(如:$ sudo apt-get install tcpdump 和 $ sudo yum install tcpdump)
1、命令选项
-i any:监听所有网络接口
-i eth0:监听指定的网络接口(eth0)
-D:列出所有可用的网络接口
-n:不解析主机名
-nn:不解析主机名和端口名
-q:输出较少的信息
-t:更便于阅读的时间戳输出
-tttt:最便于阅读的时间戳输出
-X:以 HEX 和 ASCII 模式输出数据包的内容
-XX:与 -X 选项相同,同时还输出 ethernet 头
-v, -vv, -vvv:输出更多数据包的信息
-c:获取到指定数目的数据包后就停止
-s:定义 snaplength (size) ,-s0 表示获取全部
-S:输出绝对序列号
-e:获取 ethernet 头信息
-E:通过提供 key 来解密 IPSEC 流量
二、表达式
通过表达式可以对各种不同类型的网络流量进行过滤,以获取到需要的信息。这也是 tcpdump强大功能的一个体现。主要有 3 种类型的表达式:
- Type(类型)选项包括
host(主机名,域名,IP 地址)、net(子网)和port(端口) - Direction(方向)选项包括
src和dst以及它们的组合 - Proto(协议)包括
tcp、udp、ICMP、ether 和arp
三、应用实例
指定网络接口:
tcpdump -i <dev>

ens33是centos7系统中第一张的网卡设备名称
原始信息输出模式:
tcpdump -ttttnnvvS -i <dev>

更详细的输出,不解析主机名和端口名,使用绝对序列号,方便阅读的时间戳
通过IP地址过滤:
tcpdump host <IP>

192.168.1.11是同网段的另外一台服务器
HEX 输出
tcpdump -nnvXSs 0

抓取一个HEX格式的icpm包
通过源地址和目标地址进行过滤(源地址:src 目标地址:dst)
tcpdump src 192.168.1.11 -i ens33

tcpdump dst 192.168.1.11 -i ens33

通过子网进行过滤
tcpdump net 192.168.1.0/24

监听指定端口号
tcpdump dst port 22 -i ens33

抓取ens33网卡接口目标地址端口为22的包
指定协议
tcpdmp icmp -i ens33

端口范围 tcpdump portrange 1-65535

通过包大小过滤(通过length查看)
tcpdump less 32
tcpdump greater 64
查找 http 包
查找 user-agent 信息
tcpdump -vvAls0 | grep 'User-Agent:'
查找只是 GET 请求的流量
tcpdump -vvAls0 | grep 'GET'
查找 http 客户端 IP
tcpdump -vvAls0 | grep 'Host:'
查询客户端 cookie
tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:'
查找 DNS 流量
tcpdump -vvAs0 port 53
四、高级功能
1. 逻辑运算符
可以通过命令选项的不同组合(使用逻辑运算符)完成更复杂的任务。运算符包括以下3种:
- AND(
and或&) - OR(
or或||) - EXCEPT (
not或!)
tcpdump port 22 and src 192.168.1.11 -i ens33

即捕捉从指定主机(192.168.1.11)发出,且目标端口为 22 的所有网络数据
tcpdump src net 192.168.1.0/24 and dst net 192.168.0.0/24 or 192.168.2.0/24

即捕捉从指定子网(192.168.1.0/24)发送到目标子网(192.168.0.0/24 和 192.168.2.0/24)的所有网络数据
2. 指定 TCP 标志位(Flags)
tcpdump 'tcp[13] & 32!=0' 所有 URGENT (URG) 包tcpdump 'tcp[13] & 16!=0' 所有 ACKNOWLEDGE (ACK) 包tcpdump 'tcp[13] & 8!=0' 所有 PUSH (PSH) 包tcpdump 'tcp[13] & 4!=0' 所有 RESET (RST) 包tcpdump 'tcp[13] & 2!=0' 所有 SYNCHRONIZE (SYN) 包tcpdump 'tcp[13] & 1!=0' 所有 FINISH (FIN) 包tcpdump 'tcp[13]=18' 所有 SYNCHRONIZE/ACKNOWLEDGE (SYNACK) 包
其他指定标志位的方式如:
tcpdump 'tcp[tcpflags] == tcp-syn'tcpdump 'tcp[tcpflags] == tcp-fin'
一些特殊的用法
tcpdump 'tcp[13] = 6' RST 和 SYN 同时启用的数据包(不正常)tcpdump 'tcp[32:4] = 0x47455420' 获取 http GET 请求的文本

tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D' 获取任何端口的 ssh 连接(通过 banner 信息)

tcpdump 'ip[8] < 10' ttl 小于 10 的数据包(出现问题或 traceroute 命令)

tcpdump 'ip[6] & 128 != 0' 非常有可能是黑客入侵的情况
五、核心结构模板以及标准案例解读
核心结构模板
无论查什么网络问题,先跑这条命令,它能看到最核心的 TCP 交互逻辑。
sudo tcpdump -i eth0 -nn -S host <目标IP>
- 把
<目标IP>换成你要排查的那个客户端 IP(比如192.168.1.220)。 - 把
eth0换成你服务器的网卡名(如果不确定,就用ip addr看一眼,通常是第一个非 lo 的网卡)。 - 先不要加任何过滤条件(如 port, flags 等),先看全貌,再用人眼过滤。
返回格式:
[时间戳] IP [源IP].[源端口] > [目的IP].[目的端口]: Flags [标志位], seq [序列号], ack [确认号], win [窗口大小], length [数据长度]: [应用层摘要]
| 字段 | 示例值 | 含义与人话解读 |
|---|---|---|
| 时间戳 | 10:37:46.604735 | 发生的时间。用来计算两个包之间隔了多久(减法运算)。 |
| 方向 | 192...220 > 172...124 | 谁发给谁。箭头左边是发送方,右边是接收方。 |
| Flags | [S] | 最关键! 表示包的类型。 • [S]: SYN (发起连接)• [S.]: SYN+ACK (同意连接)• [.]: ACK (纯确认/心跳)• [P.]: PUSH (有真实数据,如 HTTP 请求)• [F.]: FIN (我要断开连接) |
| seq | 3029259600 | 序列号。你可以把它想象成“快递单号”,保证数据包顺序不错乱。一般不用细看数值,除非丢包。 |
| ack | (第一行没有) | 确认号。表示“我收到了你之前的哪个包”。 (注意:只有带 ACK 标志的包才有这个字段) |
| length | 0 | 数据载荷长度。 • 0: 纯控制包(握手、挥手、空确认)。• >0: 里面藏着真实数据(如 HTML 代码、图片数据)。 |
| 摘要 | HTTP: GET /... | tcpdump 智能识别出的应用层内容。如果是 HTTP,它会直接显示请求方法;如果是 HTTPS,这里通常为空或显示 TLS 相关。 |
案例解读
假如172.16.1.124部署了一个 nginx 服务,192.168.1.220 进行 curl 访问,在172.16.1.124使用此抓包命令结果如下
root@sh-cen-test:~# sudo tcpdump -i eth0 -nn -S host 192.168.1.220
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
11:09:40.190804 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [S], seq 1645009870, win 64240, options [mss 1460,sackOK,TS val 1914913400 ecr 0,nop,wscale 7], length 0
11:09:40.190833 IP 172.16.1.124.80 > 192.168.1.220.59596: Flags [S.], seq 4035228215, ack 1645009871, win 65160, options [mss 1460,sackOK,TS val 4133407660 ecr 1914913400,nop,wscale 7], length 0
11:09:40.200955 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [.], ack 4035228216, win 502, options [nop,nop,TS val 1914913410 ecr 4133407660], length 0
11:09:40.200991 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [P.], seq 1645009871:1645009946, ack 4035228216, win 502, options [nop,nop,TS val 1914913410 ecr 4133407660], length 75: HTTP: GET / HTTP/1.1
11:09:40.201014 IP 172.16.1.124.80 > 192.168.1.220.59596: Flags [.], ack 1645009946, win 509, options [nop,nop,TS val 4133407670 ecr 1914913410], length 0
11:09:40.201268 IP 172.16.1.124.80 > 192.168.1.220.59596: Flags [P.], seq 4035228216:4035229078, ack 1645009946, win 509, options [nop,nop,TS val 4133407670 ecr 1914913410], length 862: HTTP: HTTP/1.1 200 OK
11:09:40.211256 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [.], ack 4035229078, win 496, options [nop,nop,TS val 1914913420 ecr 4133407670], length 0
11:09:40.211461 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [F.], seq 1645009946, ack 4035229078, win 496, options [nop,nop,TS val 1914913420 ecr 4133407670], length 0
11:09:40.211498 IP 172.16.1.124.80 > 192.168.1.220.59596: Flags [F.], seq 4035229078, ack 1645009947, win 509, options [nop,nop,TS val 4133407680 ecr 1914913420], length 0
11:09:40.221479 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [.], ack 4035229079, win 496, options [nop,nop,TS val 1914913430 ecr 4133407680], length 0
第一阶段:TCP 三次握手(建立连接)
第 1 行:客户端发起请求 (SYN)
11:09:40.190804 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [S], seq 1645009870, win 64240, options [...], length 0
11:09:40.190804: 时间点 A。192.168.1.220.59596 > 172.16.1.124.80: 客户端 (220) 的随机端口 59596 发给服务器 (124) 的 80 端口。Flags [S]: SYN。意思是“你好,我想建立连接”。seq 1645009870: 初始序列号。这是客户端说的第一句话的编号。length 0: 没有实际数据,只是打个招呼。
第 2 行:服务器同意并回应 (SYN-ACK)
11:09:40.190833 IP 172.16.1.124.80 > 192.168.1.220.59596: Flags [S.], seq 4035228215, ack 1645009871, win 65160, options [...], length 0
11:09:40.190833: 时间点 B。- 计算: B – A = 29 微秒。服务器反应极快。
172.16.1.124.80 > 192.168.1.220.59596: 服务器回给客户端。Flags [S.]: SYN + ACK。意思是“收到你的请求了,我也同意建立连接”。ack 1645009871: 确认号。注意它是seq + 1。表示“我期待你下一个包的编号是 1645009871”。length 0: 依然没有业务数据。
第 3 行:客户端最终确认 (ACK)
11:09:40.200955 IP 192.168.1.220.59596 > 172.16.1.124.80: Flags [.], ack 4035228216, win 502, options [...], length 0
11:09:40.200955: 时间点 C。- 计算: C – B = 约 10ms。这通常是网络往返延迟。
Flags [.]: ACK。意思是“好的,连接建立了”。ack 4035228216: 确认服务器的序列号 (4035228215 + 1)。length 0: 纯确认包。- 此时,TCP 连接正式打通。
第二阶段:HTTP 业务交互(传输数据)
第 4 行:客户端发送 HTTP 请求 (PUSH)
发布者:LJH,转发请注明出处:https://www.ljh.cool/4999.html