性能·网络 / 命令文档
tcpdump
概述
Linux网络包分析的瑞士军刀
简介 基础用法 过滤器 高级用法 实战示例 运维注意事项 故障排查
tcpdump简介
tcpdump是Linux/Unix系统中最强大的网络包分析工具之一,它可以捕获和分析网络接口上的数据包。作为网络管理员和系统运维人员的必备工具,tcpdump能够帮助我们诊断网络问题、监控网络流量、分析网络安全事件。
主要功能特点
实时包捕获:捕获网络接口上的实时数据包
强大的过滤器:支持BPF(Berkeley Packet Filter)语法
多种输出格式:支持文本、十六进制、ASCII等多种显示格式
文件保存:可将捕获的包保存为pcap格式文件
协议解析:自动解析各种网络协议头部信息
安装tcpdump
# CentOS/RHEL/Fedora yum install tcpdump # 或 dnf install tcpdump # Ubuntu/Debian apt-get update apt-get install tcpdump # 验证安装 tcpdump --version
tcpdump需要root权限或CAP_NET_RAW和CAP_NET_ADMIN权限才能正常工作。
基本语法
tcpdump [选项] [过滤表达式]
常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
| -i interface | 指定网络接口 | -i eth0 |
| -c count | 捕获指定数量的包后退出 | -c 100 |
| -w file | 将包写入文件 | -w capture.pcap |
| -r file | 从文件读取包 | -r capture.pcap |
| -n | 不解析主机名 | -n |
| -v/-vv/-vvv | 详细输出(增加v数量提高详细程度) | -vv |
| -X | 以十六进制和ASCII显示包内容 | -X |
| -s snaplen | 设置包截取长度(默认262144字节) | -s 0 |
基本命令示例
tcpdump -i any
tcpdump -i eth0 -c 100
tcpdump -i eth0 -vv -n
使用 -s 0 可以捕获完整的包,这对于深入分析很重要。默认情况下,tcpdump只捕获每个包的前面部分。
过滤器表达式
tcpdump使用BPF(Berkeley Packet Filter)语法来过滤数据包,这是其最强大的功能之一。
基本过滤类型
1. 主机过滤
# 捕获与特定主机相关的包 tcpdump host 192.168.1.100 # 捕获源主机 tcpdump src host 192.168.1.100 # 捕获目标主机 tcpdump dst host 192.168.1.100
2. 端口过滤
# 捕获特定端口 tcpdump port 80 # 捕获源端口 tcpdump src port 80 # 捕获目标端口 tcpdump dst port 80 # 捕获端口范围 tcpdump portrange 1000-2000
3. 协议过滤
# 捕获TCP包 tcpdump tcp # 捕获UDP包 tcpdump udp # 捕获ICMP包 tcpdump icmp # 捕获ARP包 tcpdump arp
4. 网络过滤
# 捕获特定网络 tcpdump net 192.168.1.0/24 # 捕获源网络 tcpdump src net 192.168.1.0/24 # 捕获目标网络 tcpdump dst net 192.168.1.0/24
逻辑运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| and (&&) | 逻辑与 | host 192.168.1.1 and port 80 |
| or (||) | 逻辑或 | port 80 or port 443 |
| not (!) | 逻辑非 | not port 22 |
复杂过滤示例
# 捕获HTTP流量(80和8080端口) tcpdump 'port 80 or port 8080' # 捕获来自特定主机的SSH流量 tcpdump 'src host 192.168.1.100 and port 22' # 捕获除SSH外的所有TCP流量 tcpdump 'tcp and not port 22' # 捕获web服务器流量(HTTP和HTTPS) tcpdump 'host 192.168.1.10 and (port 80 or port 443)' # 捕获DNS查询 tcpdump 'udp and port 53'
使用单引号包围复杂的过滤表达式,避免shell解释特殊字符。
包内容分析
1. TCP标志位过滤
# 捕获SYN包(TCP连接建立) tcpdump 'tcp[tcpflags] & tcp-syn != 0' # 捕获RST包(连接重置) tcpdump 'tcp[tcpflags] & tcp-rst != 0' # 捕获FIN包(连接关闭) tcpdump 'tcp[tcpflags] & tcp-fin != 0' # 捕获PSH ACK包(数据传输) tcpdump 'tcp[tcpflags] & (tcp-psh|tcp-ack) != 0'
2. HTTP请求分析
# 捕获HTTP GET请求 tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | grep -i get # 捕获HTTP POST请求 tcpdump -A -s 0 'tcp port 80' | grep -i post # 更简单的HTTP流量捕获 tcpdump -A -s 0 port 80 | grep -i 'GET\|POST\|HTTP'
3. 包大小过滤
# 捕获大于1000字节的包 tcpdump 'greater 1000' # 捕获小于100字节的包 tcpdump 'less 100' # 捕获指定大小范围的包 tcpdump 'greater 100 and less 500'
时间戳和格式化输出
# 显示绝对时间戳 tcpdump -t # 显示相对时间戳 tcpdump -tt # 可读的时间戳 tcpdump -tttt # 不显示时间戳 tcpdump -t
保存和读取pcap文件
# 保存到文件 tcpdump -i eth0 -w /tmp/capture.pcap # 从文件读取 tcpdump -r /tmp/capture.pcap # 保存时添加时间戳到文件名 tcpdump -i eth0 -w capture_$(date +%Y%m%d_%H%M%S).pcap # 分析pcap文件中的特定协议 tcpdump -r capture.pcap icmp
pcap文件可以在Wireshark等图形化工具中打开进行更详细的分析。
1. 网络连接监控
tcpdump -i any -n 'port 22 and tcp[tcpflags] & tcp-syn != 0'
这个命令捕获所有到22端口的TCP SYN包,帮助监控SSH登录尝试。
2. Web服务器流量分析
tcpdump -A -s 0 -i eth0 'tcp port 80 and host 192.168.1.10' | grep -E 'GET|POST|User-Agent|Host:'
捕获并显示向特定web服务器的HTTP请求详情。
3. 数据库连接监控
tcpdump -i any -n 'port 3306'
监控所有MySQL数据库连接。
4. DNS查询分析
tcpdump -i any -n 'udp port 53'
监控系统的DNS查询活动。
5. 网络扫描检测
tcpdump -i any -n 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack = 0' | awk '{print $3}' | sort | uniq -c | sort -nr检测可能的端口扫描活动,显示SYN包最多的源IP。
6. 网络延迟测试
tcpdump -i any icmp
监控ping命令的ICMP包,用于网络延迟分析。
权限和安全
Root权限要求:tcpdump需要root权限或特殊的网络权限才能工作。在生产环境中要谨慎使用。
权限配置建议:
# 为特定用户组添加tcpdump权限
sudo groupadd pcap
sudo usermod -a -G pcap username
sudo chgrp pcap /usr/sbin/tcpdump
sudo chmod 750 /usr/sbin/tcpdump
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump性能和存储考虑
1. CPU和内存使用
高流量环境:tcpdump在高流量网络中会消耗大量CPU和内存
过滤器优化:使用精确的过滤器减少处理的包数量
缓冲区设置:调整缓冲区大小避免丢包
# 设置缓冲区大小(单位:KB) tcpdump -B 4096 -i eth0 # 限制处理包数量 tcpdump -c 10000 -i eth0
2. 磁盘空间管理
文件大小控制: # 限制输出文件大小为100MB,创建多个文件 tcpdump -i eth0 -C 100 -W 5 -w /tmp/capture # 按时间轮转日志(需要配合cron) tcpdump -i eth0 -w /tmp/capture_$(date +%Y%m%d_%H%M).pcap &
监控和日志
生产环境使用建议
监控tcpdump进程:确保长时间运行的tcpdump不会耗尽系统资源
日志轮转:定期清理old capture文件
性能监控:监控系统负载和网络接口统计
# 监控tcpdump资源使用 ps aux | grep tcpdump top -p $(pgrep tcpdump) # 检查网络接口统计 cat /proc/net/dev ifconfig eth0
生产环境最佳实践
生产环境注意事项: 在高负载系统上运行tcpdump前要评估性能影响 使用精确的过滤器,避免捕获不必要的流量 设置合适的包捕获限制(-c参数) 监控磁盘空间,避免填满分区 考虑在业务低峰期进行包捕获
自动化脚本示例
#!/bin/bash
# 生产环境tcpdump监控脚本
INTERFACE="eth0"
CAPTURE_DIR="/var/log/tcpdump"
MAX_FILES=10
FILE_SIZE_MB=100
# 创建目录
mkdir -p $CAPTURE_DIR
# 启动tcpdump with rotation
tcpdump -i $INTERFACE \
-C $FILE_SIZE_MB \
-W $MAX_FILES \
-w $CAPTURE_DIR/capture_$(hostname)_ \
-Z root \
-n \
'not port 22' &
# 记录PID
echo $! > /var/run/tcpdump.pid
echo "tcpdump started with PID $!"