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