“每一个优秀的工程师,都应该能在黑暗中(命令行下)仅凭字符跳动诊断问题。”
1 tcpdump简介
- tcpdump是一个基于命令行的网络抓包工具,支持捕获和分析网络接口上的数据包。它可以捕获TCP、UDP、ICMP等多种协议的数据包,并以文本形式显示出来。
- tcpdump是网络故障排查、协议分析和安全审计的重要工具。
2 tcpdump安装
yum install tcpdump -y[root@node3 ~]# yum install tcpdump -y
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Resolving Dependencies
There are unfinished transactions remaining. You might consider running yum-complete-transaction, or "yum-complete-transaction --cleanup-only" and "yum history redo last", first to finish them. If those don't work you'll have to try removing/installing packages by hand (maybe package-cleanup can help).
--> Running transaction check
---> Package tcpdump.x86_64 14:4.9.2-4.el7_7.1 will be installed
--> Finished Dependency ResolutionDependencies Resolved=================================================================================================================================================================================Package Arch Version Repository Size
=================================================================================================================================================================================
Installing:tcpdump x86_64 14:4.9.2-4.el7_7.1 local 422 kTransaction Summary
=================================================================================================================================================================================
Install 1 PackageTotal download size: 422 k
Installed size: 1.0 M
Downloading packages:
tcpdump-4.9.2-4.el7_7.1.x86_64.rpm | 422 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionInstalling : 14:tcpdump-4.9.2-4.el7_7.1.x86_64 1/1 Verifying : 14:tcpdump-4.9.2-4.el7_7.1.x86_64 1/1 Installed:tcpdump.x86_64 14:4.9.2-4.el7_7.1 Complete!
[root@node3 ~]# tcpdump --version
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
[root@node3 ~]#
3 基础语法
3.1 命令格式
命令格式:tcpdump [选项] [过滤表达式]
3.2 基本选项
选项 | 说明 |
-i | 指定监听的网络接口(如eth0),使用-i any可以监听所有接口 |
-n | 不解析主机名(直接显示IP地址) |
-nn | 不解析主机名和端口号(直接显示IP地址和端口号) |
-s | 设置捕获数据包的长度(默认 96 字节),使用-s 0捕获完整数据包 |
-c | 捕获指定数量的数据包后退出 |
-w | 将捕获的数据包写入文件(如-w test.cap) |
-r | 从文件中读取数据包(如-r test.cap) |
-v | 显示更详细的信息(如TTL、IP选项等) |
-vv | 显示更详细的信息(比-v更详细) |
-vvv | 显示最详细的信息 |
-q | 安静模式,减少输出信息 |
-t | 不显示时间戳 |
-tt | 显示时间戳(自1970年1月1日以来的秒数) |
-ttt | 显示当前包与上一个包的时间间隔(单位:秒) |
-tttt | 显示完整的时间戳(包括日期和时间) |
-X | 以十六进制和ASCII格式显示数据包内容 |
-XX | 以十六进制和ASCII格式显示数据包内容(包括链路层头部) |
-A | 以ASCII格式显示数据包内容 |
-e | 显示链路层头部信息(如MAC地址) |
-l | 将输出行缓冲(适合将输出通过管道传递给其他命令) |
-D | 列出所有可用的网络接口 |
3.3 过滤选项
过滤表达式 | 说明 |
host | 捕获与指定IP地址相关的流量(源或目标) |
src | 捕获源IP为指定地址的流量 |
dst | 捕获目标IP为指定地址的流量 |
net | 捕获与指定网络相关的流量(如192.168.10.0/24) |
port | 捕获与指定端口相关的流量 |
src port | 捕获源端口为指定端口的流量 |
dst port | 捕获目标端口为指定端口的流量 |
proto | 捕获指定协议的流量(如tcp、udp、icmp) |
tcp | 捕获TCP流量 |
udp | 捕获UDP流量 |
icmp | 捕获ICMP流量 |
arp | 捕获ARP流量 |
vlan | 捕获指定VLAN ID的流量 |
less | 捕获长度小于指定值的数据包 |
greater | 捕获长度大于指定值的数据包 |
3.4 高级过滤举例
过滤表达式 | 说明 |
tcp[tcpflags] & (tcp-syn) != 0 | 捕获TCP SYN包 |
tcp[tcpflags] & (tcp-ack) != 0 | 捕获TCP ACK包 |
tcp[tcpflags] & (tcp-rst) != 0 | 捕获TCP RST包 |
tcp[tcpflags] & (tcp-fin) != 0 | 捕获TCP FIN包 |
tcp[tcpflags] & (tcp-syn-tcp-ack) != 0 | 捕获TCP SYN-ACK包 |
icmp[icmptype] == icmp-echo | 捕获ICMP Echo请求(ping请求) |
icmp[icmptype] == icmp-echoreply | 捕获ICMP Echo响应(ping响应) |
3.5 组合过滤
使用逻辑运算符组合多个过滤条件:
- and(与):tcp and port 80
- or(或):port 80 or port 443
- not(非):not arp
4 BPF过滤器:网络分析的“SQL”语句
4.1 BPF过滤器简介
BPF是一种内核级别的数据包过滤机制,它允许用户定义过滤规则,内核会根据这些规则直接过滤数据包,从而减少用户空间和内核空间之间的数据传输,提高性能。BPF过滤器的核心特点:
- 高效:在内核层面过滤数据包,减少不必要的数据拷贝
- 灵活:支持复杂的过滤规则,可以基于协议、端口、IP地址、MAC地址等条件进行过滤
- 广泛应用:被 tcpdump、Wireshark等工具广泛使用
BPF过滤器语法:
- 比较操作符:==、!=、>、<、>=、<=
- 逻辑操作符:and(&&)、or(||)、not(!)
- 协议字段:可以直接访问协议头部的字段(如 IP地址、端口号、协议类型等)
4.2 过滤三要素
4.2.1 类型(type)
类型:用于指定过滤的目标,常见的类型包括:
- host:过滤特定IP地址
- port:过滤特定端口
- net:过滤特定网络段
# 抓取特定IP的流量
tcpdump host 192.168.10.30# 抓取端口范围1000-8080的流量
tcpdump portrange 1000-8080
4.2.2 方向(dir)
方向:用于指定流量的来源或目的地,常见的方向包括:
- src:源地址或源端口
- dst:目的地址或目的端口
# 抓取源地址在192.168.10.0/24网段的流量
tcpdump src net 192.168.10.0/24# 抓取目标地址为192.168.10.30端口为3306的流量
tcpdump dst 192.168.10.30 and port 3306# 协议proto:tcp/udp/icmp/arp
tcpdump udp port 53 # 抓DNS流量
tcpdump arp # 抓ARP广播
4.2.3 协议(proto)
协议:用于指定过滤的协议类型,常见的协议包括:
- tcp:TCP协议
- udp:UDP协议
- icmp:ICMP协议
- arp:ARP协议
# 抓取DNS流量(UDP端口53)
tcpdump udp port 53# 抓取ARP广播流量
tcpdump arp
4.3 逻辑组合过滤
# 抓取特定主机的HTTP流量
tcpdump tcp port 80 and host 192.168.10.32# 抓取源地址在192.168.10.0/24网段的DNS查询
tcpdump src net 192.168.10.0/24 and udp port 53# 抓取目标端口为443流量
tcpdump dst port 443
5 高级用法
5.1 捕获、保存、读取流量
# 捕获并保存流量
tcpdump -i eth0 -w test.cap# 读取保存的流量文件
tcpdump -r capture.pcap
5.2 捕获指定长度数据包
tcpdump -i eth0 -s 1500
5.3 捕获特定时间段的流量
# 在10秒后停止捕获
timeout 10 tcpdump -i eth0
5.4 过滤TCP重传数据包
tcpdump -i any -n -s 0 "tcp[tcpflags] & (tcp-rst|tcp-ack) != 0" -tttt
5.5 过滤TCP重复确认数据包
tcpdump -i any -n -s 0 "tcp[tcpflags] & tcp-ack != 0" -tttt
5.6 资源消耗控制
# 限制内存使用(避免OOM)
tcpdump -i any -w trace.pcap -W 10 -C 100
6 总结
tcpdump的魅力在于它不仅仅是抓包工具,更是网络协议的显微镜,广泛用于捕获和分析网络流量。它能够捕获网络接口上的数据包,并以可读的格式显示出来,帮助网络管理员和开发人员诊断网络问题、分析协议行为以及排查安全事件!