性能·网络 / 命令文档

tcpdump

$ tcpdump 24 个章节 Linux 命令详解

概述

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 $!"

同分类 · 其他命令文档