跳到主要内容

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
  1. 时分秒毫秒
  2. 网络协议
  3. 源 IP + 端口
  4. 数据流向 >
  5. 目标 IP + 端口
  6. 数据包内容

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 -