tcpdump
linux下的网络抓包(tcpdump)介绍
1. 基础捕获
# 捕获第一个网络接口(通常为eth0)上的所有数据包
sudo tcpdump
# 捕获指定接口(如eth1)上的所有数据包
sudo tcpdump -i eth1
# 捕获所有接口上的数据包
sudo tcpdump -i any
# 捕获10个包后停止
sudo tcpdump -c 10
# 捕获时禁用名称解析,直接显示IP和端口号
sudo tcpdump -nn
2. 基于主机和网络的过滤
# 捕获与特定主机(主机名或IP)相关的所有流量
sudo tcpdump host www.example.com
sudo tcpdump host 192.168.1.100
# 仅捕获源地址(src)或目标地址(dst)为某主机的流量
sudo tcpdump src 192.168.1.100
sudo tcpdump dst 192.168.1.1
# 捕获来自或去往特定网络(CIDR表示法)的流量
sudo tcpdump net 192.168.1.0/24
sudo tcpdump src net 192.168.1.0/24
3. 基于端口和协议的过滤
# 捕获特定端口(如HTTP 80)的所有流量
sudo tcpdump port 80
sudo tcpdump port 443
# 捕获源端口或目标端口为某端口的流量
sudo tcpdump src port 12345
sudo tcpdump dst port 53
# 捕获端口范围(如所有常用HTTP/HTTPS端口)
sudo tcpdump portrange 80-443
# 捕获特定协议(如ICMP/ping, UDP, TCP)的流量
sudo tcpdump icmp
sudo tcpdump udp
sudo tcpdump tcp
4. 复杂表达式组合
# 捕获两台主机之间且端口为80的流量
sudo tcpdump 'host 192.168.1.100 and host 192.168.1.1 and port 80'
# 捕获来自某主机且目标端口不是22的流量
sudo tcpdump 'src 192.168.1.100 and not dst port 22'
# 捕获目标主机的HTTP/HTTPS流量
sudo tcpdump 'dst host 192.168.1.1 and (port 80 or port 443)'
5. 数据包内容检查与文件操作
# 以ASCII格式查看HTTP流量
sudo tcpdump -i any port 80 -A
# 以十六进制+ASCII查看完整数据包
sudo tcpdump -i any port 80 -XX
# 将抓包结果保存为pcap文件
sudo tcpdump -i any -w capture.pcap
# 从pcap文件读取并分析
tcpdump -r capture.pcap
tcpdump -r capture.pcap -nn 'port 80'
快速上手
1.安装工具:多数 Linux 系统已预装,若没有可使用包管理器安装 。
Debian/Ubuntu: sudo apt-get install tcpdump
CentOS/RHEL: sudo yum install tcpdump
2.基础抓包命令:直接运行 sudo tcpdump 会捕获默认网卡的数据包,按 Ctrl+C 停止 。
指定网卡:sudo tcpdump -i eth0(抓取 eth0 网卡)。
指定数量:sudo tcpdump -c 10(抓取 10 个包后停止)。
不解析主机名:sudo tcpdump -n(直接显示 IP,速度更快)。
不解析端口名:sudo tcpdump -nn(显示端口号而非服务名)。
3.保存数据包:使用 -w 选项将数据保存到文件,方便后续用 Wireshark 分析 。
命令:sudo tcpdump -i eth0 -w capture.pcap
读取文件:tcpdump -r capture.pcap
怎么过滤想要的流量
1.按主机过滤:host 关键字指定 IP 或主机名 。
抓取特定主机:tcpdump host 192.168.1.1
抓取源地址:tcpdump src host 192.168.1.1
抓取目的地址:tcpdump dst host 192.168.1.1
2.按端口过滤:port 关键字指定端口号 。
抓取 80 端口:tcpdump port 80
抓取端口范围:tcpdump portrange 1000-2000
抓取源或目的端口:tcpdump src or dst port 22
3.按协议过滤:直接指定协议名称 。
抓取 TCP 包:tcpdump tcp
抓取 ICMP 包:tcpdump icmp
抓取 HTTP 流量:tcpdump -i eth0 -nntvv port 80
4.组合逻辑表达式:使用 and、or、not 组合条件,复杂表达式建议用单引号包裹 。
示例:tcpdump 'tcp and port 80 and dst host 192.168.1.1'
怎么看懂抓到的数据
1.时间戳:每行开头显示数据包到达时间,精确到微秒 。百科
2.接口信息:显示数据包经过的网卡名称,如 eth0、any(所有网卡)。
3.协议信息:显示网络层和传输层协议,如 IP、TCP、UDP 及源/目的 IP 和端口 。
4.数据内容:使用 -X 或 -XX 选项可显示数据包内容的十六进制和 ASCII 格式 。
-X:显示 IP 和传输层头部及数据内容。
-XX:显示以太网帧头部及数据内容。
-A:仅以 ASCII 格式显示数据内容(适合查看 HTTP 请求)。
5.截断标记:若输出中出现 [|proto] 标志,表示数据包被截断,可使用 -s 0 抓取完整包
参数说明:
-c 设置指定的数据包收取数;
-e 显示数据链路层信息;
-n 直接显示IP地址,不显示成域名;
-nn 显示查看 IP 和端口号,而且在抓取大量数据时非常高效
-s tcpdump 默认只会截获前96字节的内容,要想截取指定字节的报文内容,可以使用-s number,number表示要截取的报文字节数,如果是 0 的话,表示截取报文全部内容;
-t 在输出的每一行不打印时间戳;
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv 输出详细的报文信息;
-w 将抓获数据写入指定文件;
-i 选择要捕获的接口,通常是以太网卡或无线网卡;
proto 过滤指定协议协议的数据报文;
port 过滤指定端口的数据包报文;
host 过滤包含指定主机ip的数据报文;