一、tcpdump是什么

tcpdump 是 Linux 上最强大的抓包工具之一,用于 实时监听网络流量、分析数据包,是运维 & 安全必备技能!

实时抓包:直接在终端运行,无需 GUI
精准过滤:支持 BPF 语法,快速筛选数据包
兼容 Wireshark:可保存 pcap 文件,后续深入分析

📌 安装 tcpdump

# CentOS / RHEL
yum install -y tcpdump  

# Ubuntu / Debian
apt install -y tcpdump

📌 查看版本

tcpdump --version

📌 查看可用网卡

tcpdump -D

二、快速抓包命令

📌 抓取所有数据包

tcpdump -i eth0

💡 默认监听 eth0 网卡,按 Ctrl + C 停止

📌 抓取特定端口

tcpdump -i eth0 port 80

📌 抓取特定 IP 的数据包

tcpdump -i eth0 host 192.168.1.100

📌 保存数据包(Wireshark 可用)

tcpdump -i eth0 -w capture.pcap

📌 读取 pcap 文件

tcpdump -r capture.pcap

📌 仅抓取 TCP SYN(新连接)

tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'

📌 抓取 HTTP 请求

tcpdump -i eth0 port 80 and 'tcp[tcpflags] & tcp-push != 0'

三、tcpdump抓包分析技巧

📌 3.1 关键 TCP 三次握手

三次握手流程
1️⃣ 客户端 → 服务器 SYN(请求建立连接)
2️⃣ 服务器 → 客户端 SYN + ACK(同意连接)
3️⃣ 客户端 → 服务器 ACK(确认)

💡 用 tcpdump 抓取三次握手

tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'

⚠️ 异常分析
SYN 发送但无 ACK → 服务器未响应,可能端口未开放
SYN+ACK 但无 ACK → 客户端未响应,可能网络不通


📌 3.2 TCP 四次挥手

四次挥手流程
1️⃣ 客户端 → 服务器 FIN(请求断开)
2️⃣ 服务器 → 客户端 ACK(收到断开请求)
3️⃣ 服务器 → 客户端 FIN(确认断开)
4️⃣ 客户端 → 服务器 ACK(最终确认)

💡 用 tcpdump 抓取断开连接

tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin|tcp-ack) != 0'

⚠️ 异常分析
连接迟迟不释放 → 可能是 CLOSE_WAIT 状态,应用未正确关闭连接


📌 3.3 服务器无法访问

💡 抓取 192.168.1.100 的流量

tcpdump -i eth0 host 192.168.1.100

⚠️ 异常分析
无数据包 → 可能是网络断开 / 防火墙拦截
仅 SYN 无 ACK → 目标服务器未响应,端口可能未开放


📌 3.4 分析 HTTP 请求

💡 抓取 HTTP 流量

tcpdump -i eth0 port 80 -A

📌 解析 HTTP GET 请求

GET /index.html HTTP/1.1
Host: example.com
User-Agent: curl/7.68.0

⚠️ 异常分析
HTTP 404 → 资源不存在
HTTP 500 → 服务器内部错误
HTTP 403 → 权限不足


📌 3.5 检测 DDOS 攻击

💡 抓取短时间大量 SYN

tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'

📌 查看 SYN 数量

tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0' | wc -l

⚠️ 异常分析
大量 SYN 但无 ACK → 可能是 SYN Flood 攻击
解决方案

iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

(限制每秒最大新建连接数)


📌 3.6 DNS 解析异常

💡 抓取 DNS 请求

tcpdump -i eth0 port 53 -vv

⚠️ 异常分析
无 DNS 响应 → 可能是 DNS 服务器故障
解析超时 → 可能是防火墙拦截

四、tcpdump高级技巧

只显示 IP,不解析域名

tcpdump -i eth0 -n

📌 只显示端口号,不解析服务名

tcpdump -i eth0 -nn

📌 显示数据包详细信息

tcpdump -i eth0 -vvv

📌 显示数据包内容(ASCII + HEX)

tcpdump -i eth0 -XX

📌 按数据包大小过滤

tcpdump greater 1000

📌 限制抓包数量

tcpdump -i eth0 -c 100