Linux 网络调试神器:tcpdump 和 Wireshark 抓包分析实战

1. 工具介绍与准备工作

1.1 tcpdump 简介

tcpdump 是 Linux 系统中最强大的命令行网络抓包工具,它能够捕获网络接口上的数据包,并以可读的形式显示出来,或者保存到文件中供后续分析。

1.2 Wireshark 简介

Wireshark 是一个图形化的网络协议分析器,可以深入检查数百种协议的数据包,具有强大的过滤器和统计分析功能。

1.3 系统环境要求

  • Linux 操作系统(本教程以 Ubuntu 22.04 为例)
  • root 或 sudo 权限
  • 至少 100MB 可用磁盘空间

1.4 安装必要的工具

创建安装脚本文件:install_tools.sh

bash 复制代码
#!/bin/bash

# 更新系统包列表
sudo apt update

# 安装 tcpdump
sudo apt install -y tcpdump

# 安装 Wireshark(非交互模式,避免弹窗)
sudo DEBIAN_FRONTEND=noninteractive apt install -y wireshark

# 将当前用户添加到 wireshark 组,避免需要 root 权限
sudo usermod -a -G wireshark $USER

# 安装辅助工具
sudo apt install -y curl net-tools

# 显示安装版本
echo "tcpdump 版本:"
tcpdump --version | head -n 1
echo "Wireshark 版本:"
wireshark --version | head -n 1

echo "安装完成!请重新登录以使组权限生效"

给脚本执行权限并运行:

bash 复制代码
chmod +x install_tools.sh
./install_tools.sh

2. 网络接口识别与基础配置

2.1 查看网络接口

创建查看接口脚本:list_interfaces.sh

bash 复制代码
#!/bin/bash

echo "=== 系统网络接口列表 ==="
echo "1. 使用 ip 命令查看:"
ip addr show | grep -E "^[0-9]+:" | awk '{print $2}' | tr -d ':'

echo -e "\n2. 使用 ifconfig 命令查看:"
ifconfig -a | grep -E "^[a-zA-Z0-9]+:" | awk '{print $1}' | tr -d ':'

echo -e "\n3. 使用 tcpdump 查看可用接口:"
tcpdump -D

echo -e "\n4. 详细的接口信息:"
for interface in $(ip link show | grep -E "^[0-9]+:" | awk -F: '{print $2}' | tr -d ' '); do
    echo "接口: $interface"
    ip addr show $interface | grep -E "inet|state" | sed 's/^/    /'
done

运行脚本:

bash 复制代码
chmod +x list_interfaces.sh
./list_interfaces.sh

2.2 测试网络连接

创建网络测试脚本:network_test.sh

bash 复制代码
#!/bin/bash

# 测试目标(Google DNS)
TARGET="8.8.8.8"
WEBSITE="www.google.com"

echo "=== 网络连接测试 ==="

echo "1. 测试本地网络接口:"
ip route show default

echo -e "\n2. Ping 测试:"
ping -c 3 $TARGET

echo -e "\n3. DNS 解析测试:"
nslookup $WEBSITE

echo -e "\n4. HTTP 连接测试:"
curl -I --connect-timeout 5 http://$WEBSITE 2>/dev/null | head -n 1

echo -e "\n5. 端口连接测试:"
nc -zv $WEBSITE 80 2>&1
nc -zv $WEBSITE 443 2>&1

3. tcpdump 基础抓包技术

3.1 基础抓包命令

创建基础抓包示例:basic_capture.sh

bash 复制代码
#!/bin/bash

# 设置默认接口
INTERFACE="${1:-eth0}"
OUTPUT_FILE="basic_capture_$(date +%Y%m%d_%H%M%S).pcap"

echo "开始在接口 $INTERFACE 上抓包,输出文件: $OUTPUT_FILE"
echo "按 Ctrl+C 停止抓包"

# 基础抓包命令
sudo tcpdump -i $INTERFACE -w $OUTPUT_FILE

echo "抓包完成!文件保存为: $OUTPUT_FILE"
echo "文件大小: $(du -h $OUTPUT_FILE | cut -f1)"

3.2 高级抓包选项

创建高级抓包脚本:advanced_capture.sh

bash 复制代码
#!/bin/bash

INTERFACE="${1:-eth0}"
DURATION="${2:-60}"  # 默认抓包60秒
SNAPLEN="${3:-1514}" # 快照长度
BUFFER_SIZE="${4:-128}" # 缓冲区大小(MB)
OUTPUT_FILE="advanced_capture_$(date +%Y%m%d_%H%M%S).pcap"

echo "=== 高级抓包配置 ==="
echo "接口: $INTERFACE"
echo "持续时间: $DURATION 秒"
echo "快照长度: $SNAPLEN 字节"
echo "缓冲区: $BUFFER_SIZE MB"
echo "输出文件: $OUTPUT_FILE"

# 高级抓包命令
sudo tcpdump \
  -i $INTERFACE \
  -w $OUTPUT_FILE \
  -s $SNAPLEN \
  -B $BUFFER_SIZE \
  -G $DURATION \
  -W 1 \
  -v

echo "高级抓包完成!"
echo "统计信息:"
tcpdump -r $OUTPUT_FILE -q -n 2>/dev/null | wc -l | awk '{print "捕获数据包数量: " $1}'

3.3 实时数据包分析

创建实时分析脚本:realtime_analysis.sh

bash 复制代码
#!/bin/bash

INTERFACE="${1:-eth0}"
HOST="$(hostname -I | awk '{print $1}')"

echo "=== 实时网络分析 ==="
echo "监控接口: $INTERFACE"
echo "本机IP: $HOST"
echo "按 Ctrl+C 停止监控"

# 实时显示 TCP 连接
echo -e "\n1. TCP 连接监控:"
sudo tcpdump -i $INTERFACE -n "tcp" 2>/dev/null | \
  awk '
  {
    if ($1 ~ /[0-9]+:/) {
      timestamp = $1;
      src = $3;
      dst = $5;
      flags = $7;
      if (src ~ /\./) {
        split(src, s, ".");
        src_ip = s[1]"."s[2]"."s[3]"."s[4];
        src_port = s[5];
      }
      if (dst ~ /\./) {
        split(dst, d, ".");
        dst_ip = d[1]"."d[2]"."d[3]"."d[4];
        dst_port = d[5];
      }
      printf "时间: %s | 源: %s:%s -> 目标: %s:%s | 标志: %s\n", 
             timestamp, src_ip, src_port, dst_ip, dst_port, flags;
    }
  }'

4. tcpdump 过滤器详解

4.1 常用过滤器示例

创建过滤器示例文件:filter_examples.sh

bash 复制代码
#!/bin/bash

INTERFACE="${1:-eth0}"
DURATION=30

echo "=== tcpdump 过滤器示例 ==="

# 1. 按协议过滤
echo "1. 只捕获 HTTP 流量 (端口 80):"
sudo timeout $DURATION tcpdump -i $INTERFACE -A "port 80"

echo -e "\n2. 捕获 HTTPS 流量 (端口 443):"
sudo timeout $DURATION tcpdump -i $INTERFACE -A "port 443"

echo -e "\n3. 捕获 DNS 查询:"
sudo timeout $DURATION tcpdump -i $INTERFACE -v "port 53"

# 4. 按IP地址过滤
echo -e "\n4. 捕获特定主机的流量:"
read -p "输入要监控的IP地址: " TARGET_IP
if [ ! -z "$TARGET_IP" ]; then
    sudo timeout $DURATION tcpdump -i $INTERFACE -v "host $TARGET_IP"
fi

# 5. 按网络段过滤
echo -e "\n5. 捕获网络段流量:"
sudo timeout $DURATION tcpdump -i $INTERFACE -v "net 192.168.1.0/24"

# 6. 复杂条件过滤
echo -e "\n6. 捕获来自特定源到特定目标的HTTP流量:"
sudo timeout $DURATION tcpdump -i $INTERFACE "tcp and port 80 and (src host 192.168.1.100 or dst host 192.168.1.100)"

4.2 高级过滤技巧

创建高级过滤器文件:advanced_filters.sh

bash 复制代码
#!/bin/bash

INTERFACE="${1:-eth0}"
OUTPUT_FILE="filtered_capture_$(date +%Y%m%d_%H%M%S).pcap"

echo "=== 高级过滤器示例 ==="

# 组合过滤器示例
FILTERS=(
    "捕获 TCP SYN 包:tcp[13] & 2 != 0"
    "捕获 TCP FIN 包:tcp[13] & 1 != 0"
    "捕获带有数据的 TCP 包:tcp and greater 60"
    "捕获 ICMP 包:icmp"
    "捕获广播/多播流量:ether broadcast or ether multicast"
    "捕获特定大小的包:greater 1024"
)

for filter in "${FILTERS[@]}"; do
    name="${filter%%:*}"
    condition="${filter##*:}"
    echo -e "\n执行: $name"
    echo "条件: $condition"
    sudo timeout 10 tcpdump -i $INTERFACE -c 5 "$condition" 2>/dev/null
done

# 保存过滤结果到文件
echo -e "\n保存综合过滤结果到: $OUTPUT_FILE"
sudo timeout 30 tcpdump -i $INTERFACE -w $OUTPUT_FILE \
    "(tcp port 80 or tcp port 443 or tcp port 22 or udp port 53)" 

echo "过滤抓包完成!"

5. 数据包分析流程

以下是完整的网络数据包分析流程:

graph TD A[开始抓包分析] --> B{确定分析目标} B --> C[性能问题分析] B --> D[连接问题分析] B --> E[安全威胁分析] C --> F[使用tcpdump捕获数据] D --> F E --> F F --> G[保存为pcap文件] G --> H[Wireshark导入分析] H --> I{问题类型} I --> J[TCP重传/重复ACK] I --> K[DNS解析问题] I --> L[HTTP错误] I --> M[异常连接] J --> N[网络延迟/拥塞] K --> O[DNS服务器问题] L --> P[应用层问题] M --> Q[安全威胁] N --> R[优化网络路径] O --> S[更换DNS服务器] P --> T[修复应用代码] Q --> U[安全加固] R --> V[验证修复效果] S --> V T --> V U --> V V --> W[分析完成] style A fill:#2E8B57,color:white style W fill:#2E8B57,color:white style F fill:#4169E1,color:white style H fill:#4169E1,color:white style N fill:#FF6347,color:white style O fill:#FF6347,color:white style P fill:#FF6347,color:white style Q fill:#FF6347,color:white

6. 实战案例:HTTP 流量分析

6.1 HTTP 请求捕获分析

创建 HTTP 分析脚本:http_analysis.sh

bash 复制代码
#!/bin/bash

INTERFACE="${1:-eth0}"
OUTPUT_FILE="http_analysis_$(date +%Y%m%d_%H%M%S).pcap"
DURATION=120

echo "=== HTTP 流量分析实战 ==="
echo "开始捕获 HTTP 流量,持续时间: $DURATION 秒"
echo "输出文件: $OUTPUT_FILE"

# 生成一些 HTTP 流量(可选)
echo "生成测试 HTTP 流量..."
curl -s http://httpbin.org/get > /dev/null &
curl -s http://httpbin.org/post -X POST -d "test=data" > /dev/null &

# 捕获 HTTP 流量
sudo timeout $DURATION tcpdump -i $INTERFACE -w $OUTPUT_FILE -s 0 "tcp port 80"

echo "捕获完成!开始分析..."

# 基本分析
echo -e "\n=== 基本统计 ==="
echo "总数据包数: $(tcpdump -r $OUTPUT_FILE 2>/dev/null | wc -l)"

echo -e "\n=== HTTP 请求统计 ==="
tcpdump -r $OUTPUT_FILE -A 2>/dev/null | grep -E "(GET|POST|PUT|DELETE|HEAD) " | \
  awk '
  {
    method = $2;
    if (method ~ /^HTTP/) next;
    methods[method]++;
    total++;
  }
  END {
    for (m in methods) {
      printf "方法: %-8s 数量: %d 占比: %.2f%%\n", m, methods[m], (methods[m]/total)*100;
    }
    printf "总HTTP请求: %d\n", total;
  }'

echo -e "\n=== 主机通信统计 ==="
tcpdump -r $OUTPUT_FILE -n 2>/dev/null | awk '
  {
    if ($1 ~ /IP/) {
      src = $3;
      dst = $5;
      split(src, s, ".");
      split(dst, d, ".");
      src_host = s[1]"."s[2]"."s[3]"."s[4];
      dst_host = d[1]"."d[2]"."d[3]"."d[4];
      hosts[src_host]++;
      hosts[dst_host]++;
    }
  }
  END {
    print "主机通信统计:";
    for (h in hosts) {
      if (hosts[h] > 1) {
        printf "主机: %-15s 数据包数: %d\n", h, hosts[h];
      }
    }
  }' | sort -k4 -nr | head -10

6.2 深入 HTTP 分析

创建详细 HTTP 分析脚本:detailed_http_analysis.sh

bash 复制代码
#!/bin/bash

PCAP_FILE="${1}"

if [ -z "$PCAP_FILE" ]; then
    echo "用法: $0 <pcap文件>"
    exit 1
fi

echo "=== 深入 HTTP 分析: $PCAP_FILE ==="

# 提取 HTTP 请求头
echo -e "\n1. HTTP 请求头:"
tcpdump -r $PCAP_FILE -A 2>/dev/null | grep -A 10 -E "(GET|POST|PUT|DELETE) " | \
  head -30

# 提取 HTTP 响应
echo -e "\n2. HTTP 响应:"
tcpdump -r $PCAP_FILE -A 2>/dev/null | grep -A 10 "HTTP/1.[01] [23].." | \
  head -30

# 用户代理分析
echo -e "\n3. 用户代理统计:"
tcpdump -r $PCAP_FILE -A 2>/dev/null | grep -i "user-agent:" | \
  sed 's/.*User-Agent: //i' | sort | uniq -c | sort -nr

# Cookie 分析
echo -e "\n4. Cookie 信息:"
tcpdump -r $PCAP_FILE -A 2>/dev/null | grep -i "cookie:" | \
  head -5

# 响应时间分析(简化版)
echo -e "\n5. 请求-响应时间分析:"
tcpdump -r $PCAP_FILE -ttt 2>/dev/null | grep -E "HTTP" | \
  head -10

7. Wireshark 图形化分析

7.1 pcap 文件导入分析

创建 Wireshark 分析脚本:wireshark_analysis.sh

bash 复制代码
#!/bin/bash

PCAP_FILE="${1}"

if [ -z "$PCAP_FILE" ]; then
    echo "用法: $0 <pcap文件>"
    echo "可用 pcap 文件:"
    ls -la *.pcap 2>/dev/null || echo "未找到 pcap 文件"
    exit 1
fi

echo "=== Wireshark 分析: $PCAP_FILE ==="

# 检查文件基本信息
echo "1. 文件基本信息:"
capinfos $PCAP_FILE 2>/dev/null || {
    echo "安装 capinfos 工具:"
    sudo apt install -y wireshark-common
    capinfos $PCAP_FILE
}

# 生成统计信息
echo -e "\n2. 生成协议统计:"
tshark -r $PCAP_FILE -q -z io,phs 2>/dev/null | head -20

echo -e "\n3. 会话统计:"
tshark -r $PCAP_FILE -q -z conv,tcp 2>/dev/null | head -15

echo -e "\n4. HTTP 统计:"
tshark -r $PCAP_FILE -q -z http,tree 2>/dev/null | head -20

# 自动打开 Wireshark(如果有图形界面)
if [ -n "$DISPLAY" ]; then
    echo -e "\n5. 在 Wireshark 中打开文件..."
    wireshark "$PCAP_FILE" 2>/dev/null &
else
    echo -e "\n5. 无图形界面,使用 tshark 继续分析"
    echo -e "\nTCP 流统计:"
    tshark -r $PCAP_FILE -q -z tcp,streams 2>/dev/null
fi

7.2 高级 Wireshark 分析技巧

创建 Wireshark 高级分析指南:wireshark_advanced.md

markdown 复制代码
# Wireshark 高级分析技巧

## 1. 显示过滤器常用语法

### 协议过滤
- `http` - 显示所有 HTTP 流量
- `dns` - 显示所有 DNS 流量
- `tcp.port == 443` - 显示 HTTPS 流量
- `udp` - 显示所有 UDP 流量

### IP 地址过滤
- `ip.addr == 192.168.1.100` - 显示涉及该 IP 的所有流量
- `ip.src == 192.168.1.100` - 显示该源 IP 的流量
- `ip.dst == 192.168.1.1` - 显示该目标 IP 的流量

### 协议特定字段过滤
- `http.request.method == "GET"` - 显示 GET 请求
- `http.response.code == 404` - 显示 404 响应
- `tcp.flags.syn == 1` - 显示 TCP SYN 包
- `tcp.analysis.retransmission` - 显示重传包

## 2. 统计功能

### 会话统计
- 菜单: Statistics → Conversations
- 查看 TCP、UDP、IP 等会话统计

### 协议层级统计
- 菜单: Statistics → Protocol Hierarchy
- 查看各协议流量占比

### HTTP 统计
- 菜单: Statistics → HTTP → Packet Counter
- 查看请求方法、响应代码统计

## 3. 流量图分析

### IO 图表
- 菜单: Statistics → IO Graph
- 查看流量随时间变化

### 流量序列图
- 菜单: Statistics → TCP Stream Graphs → Time-Sequence Graph
- 分析 TCP 序列号变化

## 4. 专家信息
- 菜单: Analyze → Expert Information
- 查看错误、警告、注意等信息

8. 性能问题诊断实战

8.1 网络延迟分析

创建延迟分析脚本:latency_analysis.sh

bash 复制代码
#!/bin/bash

INTERFACE="${1:-eth0}"
OUTPUT_FILE="latency_analysis_$(date +%Y%m%d_%H%M%S).pcap"
DURATION=300

echo "=== 网络延迟分析 ==="
echo "开始捕获数据包分析网络延迟,持续时间: $DURATION 秒"

sudo timeout $DURATION tcpdump -i $INTERFACE -w $OUTPUT_FILE -s 0

echo "捕获完成,开始分析..."

# 使用 tshark 分析 TCP 问题
echo -e "\n=== TCP 问题分析 ==="

# 重传分析
RETRANS=$(tshark -r $OUTPUT_FILE -q -z io,stat,0,"tcp.analysis.retransmission" 2>/dev/null | grep "<>" | awk '{print $2}')
echo "TCP 重传包数量: $RETRANS"

# 重复ACK分析
DUP_ACK=$(tshark -r $OUTPUT_FILE -q -z io,stat,0,"tcp.analysis.duplicate_ack" 2>/dev/null | grep "<>" | awk '{print $2}')
echo "重复ACK数量: $DUP_ACK"

# 零窗口分析
ZERO_WINDOW=$(tshark -r $OUTPUT_FILE -q -z io,stat,0,"tcp.analysis.zero_window" 2>/dev/null | grep "<>" | awk '{print $2}')
echo "零窗口包数量: $ZERO_WINDOW"

# RTT 统计
echo -e "\n=== TCP 往返时间统计 ==="
tshark -r $OUTPUT_FILE -q -z rtt,tcp 2>/dev/null | head -10

# 连接建立时间
echo -e "\n=== TCP 握手时间 ==="
tshark -r $OUTPUT_FILE -Y "tcp.flags.syn==1 && tcp.flags.ack==0" -T fields -e frame.time_epoch -e ip.src -e ip.dst 2>/dev/null | \
  head -5

8.2 带宽使用分析

创建带宽分析脚本:bandwidth_analysis.sh

bash 复制代码
#!/bin/bash

PCAP_FILE="${1}"
INTERVAL=1  # 统计间隔(秒)

if [ -z "$PCAP_FILE" ]; then
    echo "用法: $0 <pcap文件> [间隔秒数]"
    exit 1
fi

INTERVAL=${2:-1}

echo "=== 带宽使用分析: $PCAP_FILE ==="
echo "统计间隔: $INTERVAL 秒"

# 生成带宽使用图表数据
tshark -r $PCAP_FILE -q -z io,stat,$INTERVAL 2>/dev/null | \
  grep -E "^[0-9]+\|" | \
  awk -F'|' '
  BEGIN {
    print "时间段 | 包数量 | 字节数 | 带宽(kbps)"
    print "------|--------|--------|-----------"
  }
  {
    time = $1;
    packets = $2;
    bytes = $3;
    kbps = (bytes * 8) / (1000 * '$INTERVAL');
    printf "%s | %d | %d | %.2f\n", time, packets, bytes, kbps;
  }'

# Top 会话带宽使用
echo -e "\n=== 带宽使用最高的TCP会话 ==="
tshark -r $PCAP_FILE -q -z conv,tcp 2>/dev/null | grep -E "^[0-9]" | \
  sort -k5 -nr | head -10 | \
  awk 'BEGIN {printf "%-30s %-30s %10s %10s %12s\n", "源地址", "目标地址", "包数量", "字节数", "带宽(kbps)"}
       {printf "%-30s %-30s %10d %10d %12.2f\n", $1, $2, $4, $5, ($5*8)/(1000*'$DURATION')}'

9. 安全威胁分析

9.1 异常流量检测

创建安全分析脚本:security_analysis.sh

bash 复制代码
#!/bin/bash

PCAP_FILE="${1}"

if [ -z "$PCAP_FILE" ]; then
    echo "用法: $0 <pcap文件>"
    exit 1
fi

echo "=== 安全威胁分析: $PCAP_FILE ==="

# 端口扫描检测
echo "1. 端口扫描检测:"
tshark -r $PCAP_FILE -Y "tcp.flags.syn==1 && tcp.flags.ack==0" -T fields -e ip.src 2>/dev/null | \
  sort | uniq -c | sort -nr | head -10 | \
  awk 'BEGIN {print "源IP | SYN包数量"; print "------|-----------"} 
       {printf "%-15s | %d\n", $2, $1}'

# 异常协议检测
echo -e "\n2. 非常用端口检测:"
tshark -r $PCAP_FILE -T fields -e tcp.dstport -e udp.dstport 2>/dev/null | \
  tr '\n' ',' | sed 's/,/\n/g' | grep -E "^[0-9]+$" | \
  grep -v -E "^(80|443|53|22|23|25|110|143|993|995|21|20|67|68|69|161|162|389|636|3389)$" | \
  sort -n | uniq -c | sort -nr | head -10

# 大流量传输检测
echo -e "\n3. 大文件传输检测:"
tshark -r $PCAP_FILE -Y "tcp.len > 1000" -T fields -e ip.src -e ip.dst -e tcp.len 2>/dev/null | \
  awk '{sum[$1" -> "$2] += $3} END {for (i in sum) if (sum[i] > 1000000) print i " 传输数据: " sum[i] " 字节"}' | \
  sort -k5 -nr

# DNS 异常查询
echo -e "\n4. DNS 异常查询检测:"
tshark -r $PCAP_FILE -Y "dns" -T fields -e dns.qry.name 2>/dev/null | \
  sort | uniq -c | sort -nr | head -10

10. 自动化监控脚本

10.1 长期网络监控

创建监控脚本:network_monitor.sh

bash 复制代码
#!/bin/bash

# 配置参数
INTERFACE="eth0"
CAPTURE_DURATION=300  # 每次捕获时长(秒)
ROTATION_COUNT=24     # 保留文件数量
OUTPUT_DIR="/tmp/network_captures"
LOG_FILE="/var/log/network_monitor.log"

# 创建输出目录
mkdir -p $OUTPUT_DIR

# 日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

# 清理旧文件
cleanup_old_files() {
    ls -t $OUTPUT_DIR/*.pcap 2>/dev/null | tail -n +$(($ROTATION_COUNT+1)) | xargs -r rm
}

# 主监控循环
monitor_network() {
    while true; do
        TIMESTAMP=$(date +%Y%m%d_%H%M%S)
        OUTPUT_FILE="$OUTPUT_DIR/capture_$TIMESTAMP.pcap"
        
        log "开始捕获网络流量: $OUTPUT_FILE"
        
        # 捕获网络流量
        timeout $CAPTURE_DURATION sudo tcpdump -i $INTERFACE -w $OUTPUT_FILE -s 0 -B 256
        
        # 基本分析
        PACKET_COUNT=$(tcpdump -r $OUTPUT_FILE 2>/dev/null | wc -l)
        log "捕获完成: $OUTPUT_FILE, 数据包数: $PACKET_COUNT"
        
        # 检查异常
        check_anomalies $OUTPUT_FILE
        
        # 清理旧文件
        cleanup_old_files
        
        # 等待下一轮
        sleep 60
    done
}

# 异常检测
check_anomalies() {
    local pcap_file=$1
    
    # 检测高重传率
    local total_packets=$(tshark -r $pcap_file -q -z io,stat,0,"frame" 2>/dev/null | grep "<>" | awk '{print $2}')
    local retrans_packets=$(tshark -r $pcap_file -q -z io,stat,0,"tcp.analysis.retransmission" 2>/dev/null | grep "<>" | awk '{print $2}')
    
    if [ "$total_packets" -gt 0 ] && [ "$retrans_packets" -gt 0 ]; then
        local retrans_rate=$((retrans_packets * 100 / total_packets))
        if [ $retrans_rate -gt 5 ]; then
            log "警告: 高TCP重传率 detected: $retrans_rate%"
        fi
    fi
    
    # 检测端口扫描
    local syn_packets=$(tshark -r $pcap_file -Y "tcp.flags.syn==1 && tcp.flags.ack==0" 2>/dev/null | wc -l)
    local unique_dest_ports=$(tshark -r $pcap_file -Y "tcp.flags.syn==1 && tcp.flags.ack==0" -T fields -e tcp.dstport 2>/dev/null | sort -u | wc -l)
    
    if [ $syn_packets -gt 100 ] && [ $unique_dest_ports -gt 50 ]; then
        log "警告: 可能的端口扫描 detected - SYN包: $syn_packets, 唯一端口: $unique_dest_ports"
    fi
}

# 信号处理
trap "log '监控停止'; exit 0" SIGINT SIGTERM

# 启动监控
log "网络监控启动 - 接口: $INTERFACE, 时长: $CAPTURE_DURATION秒"
monitor_network

11. 总结与最佳实践

11.1 工具使用总结

创建总结文档:tcpdump_wireshark_summary.md

markdown 复制代码
# tcpdump 和 Wireshark 使用总结

## tcpdump 常用命令速查

### 基础捕获
- `tcpdump -i eth0` - 在指定接口捕获
- `tcpdump -w file.pcap` - 保存到文件
- `tcpdump -r file.pcap` - 读取文件

### 过滤表达式
- `host 192.168.1.1` - 按主机过滤
- `net 192.168.0.0/24` - 按网络过滤
- `port 80` - 按端口过滤
- `tcp, udp, icmp` - 按协议过滤

### 输出控制
- `-v, -vv, -vvv` - 详细程度
- `-c 100` - 捕获包数量
- `-s 0` - 完整数据包捕获
- `-A` - ASCII 输出
- `-X` - 十六进制输出

## Wireshark 分析技巧

### 显示过滤器
- 协议级过滤: `http`, `dns`, `tcp`
- 字段过滤: `http.request.uri contains "login"`
- 比较过滤: `frame.len > 1000`

### 统计功能
- 会话统计: Conversations
- 协议分级: Protocol Hierarchy
- 流量图: IO Graphs

## 性能优化建议

### tcpdump 优化
- 使用足够大的缓冲区 (`-B` 选项)
- 适当设置快照长度 (`-s` 选项)
- 在繁忙网络中使用 BPF 过滤器

### 分析优化
- 对大文件使用导出对象功能
- 使用着色规则快速识别问题
- 配置首选项优化显示性能

11.2 故障排查流程

创建故障排查指南:troubleshooting_guide.md

markdown 复制代码
# 网络问题排查流程指南

## 1. 连接问题
1. 使用 `tcpdump -i eth0 host 目标IP` 确认数据包是否发出
2. 检查 TCP 握手是否完成
3. 分析是否有 RST 包或超时

## 2. 性能问题
1. 检查 TCP 重传和重复ACK
2. 分析往返时间 (RTT)
3. 查看窗口大小变化

## 3. 应用层问题
1. 检查 HTTP 状态码
2. 分析 DNS 响应时间
3. 查看 SSL/TLS 握手

## 4. 安全相关问题
1. 检测异常连接模式
2. 分析端口扫描行为
3. 检查数据泄露迹象

通过本教程,已经掌握了从基础的 tcpdump 抓包到高级的 Wireshark 分析的完整技能栈。这些工具和技巧将帮助您有效地诊断和解决各种网络问题。

相关推荐
6极地诈唬10 小时前
【PG漫步】DELETE不会改变本地文件的大小,VACUUM也不会
linux·服务器·数据库
ArrebolJiuZhou10 小时前
00 arm开发环境的搭建
linux·arm开发·单片机·嵌入式硬件
谷雨不太卷10 小时前
Linux_文件权限
linux·运维·服务器
无泪无花月隐星沉11 小时前
uos server 1070e lvm格式磁盘扩容分区
linux·运维·uos
食咗未11 小时前
Linux USB HOST EXTERNAL STORAGE
linux·驱动开发
食咗未11 小时前
Linux USB HOST HID
linux·驱动开发·人机交互
Xの哲學11 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
齐鲁大虾12 小时前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
虾..13 小时前
Linux 简单日志程序
linux·运维·算法
huoxingwen14 小时前
Ubuntu 22.04 上 VMware Workstation 点击虚拟机窗口就消失的解决历程
linux·运维·ubuntu