tcpdump抓包
1.基本使用
tcpdump [option] [proto] [direction] [type]
- option:-c(数量), -i(网卡), -P(方向), -e(链路层头), -v(详细), -w(输出文件)
- proto:tcp, udp, icmp, ip, ip6, arp, ether
- direction:src, dst, src or dst
- type:host, net, port, portrange
2. tcpdump 输出内容
2.1 输出结构
21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
- 时分秒毫秒
- 网络协议
- 源 IP + 端口
- 数据流向
> - 目标 IP + 端口
- 数据包内容
2.2 Flags 标识符
[S]: SYN(开始连接)[P]: PSH(推送数据)[F]: FIN(结束连接)[R]: RST(重置连接)[.]: 无 Flag(ACK 或 URG)
3. 常规过滤规则
基于IP:host
tcpdump host 192.168.10.100
tcpdump src 192.168.10.100
tcpdump dst 192.168.10.200
基于网段:net
tcpdump net 192.168.10.0/24
tcpdump src net 192.168
基于端口:port
tcpdump port 8088
tcpdump port 80 or 8088
tcpdump portrange 8000-8080
基于协议:proto
tcpdump icmp
tcpdump tcp
tcpdump 'ip proto tcp'
4. 可选参数
-n/-nn:不解析域名/端口名,提升速度-w file.pcap:输出到文件-r file.pcap:从文件读取-v/-vv/-vvv:控制详细输出-t/-tt/-ttt/-tttt:控制时间显示-x/-xx/-X/-XX:16进制/ASCII 输出-c N:抓取 N 个包后退出-s 0:抓取完整包(默认仅96字节)-i any:所有网卡
5. 逻辑组合
# and / or / not
tcpdump src 10.5.2.3 and dst port 3389
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'
6. 实战案例
# 提取 HTTP User-Agent
tcpdump -nn -A -s1500 -l | grep "User-Agent:"
# 抓取 HTTP GET 请求
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
# 找出发包最多的 IP
tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -20
# 抓取 DNS 请求
tcpdump -i any -s0 port 53
# 结合 Wireshark 分析
ssh root@remote 'tcpdump -s0 -c 1000 -nn -w - not port 22' | wireshark -k -i -