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 分析的完整技能栈。这些工具和技巧将帮助您有效地诊断和解决各种网络问题。

相关推荐
QT 小鲜肉2 小时前
【C++基础与提高】第十一章:面向对象编程进阶——继承与多态
java·linux·开发语言·c++·笔记·qt
序属秋秋秋3 小时前
《Linux系统编程之进程基础》【进程入门】
linux·运维·c语言·c++·进程·系统编程·fork
橘子真甜~3 小时前
C/C++ Linux网络编程4 - 解决TCP服务器并发的方式
linux·运维·服务器
last demo3 小时前
Linux 逻辑卷管理
linux·运维·服务器
ll_god4 小时前
ubuntu:beyond compare 4 This license key has been revoked 解决办法
linux·运维·ubuntu
网硕互联的小客服4 小时前
如何解决 Linux 文件系统挂载失败的问题?
linux·服务器·前端·网络·chrome
大聪明-PLUS10 小时前
如何使用 Docker 打包一个简单的应用程序:简易指南
linux·嵌入式·arm·smarc
serve the people11 小时前
Prompts for Chat Models in LangChain
java·linux·langchain
李昊哲小课12 小时前
Ubuntu 24.04 MariaDB 完整安装与配置文档
linux·ubuntu·mariadb