本页目录

tcpdump 与 Wireshark

网络排查的最前线工具——tcpdump 用 BPF filter 在内核态过滤(不匹配的包根本不拷贝到用户态,比 grep 快几个数量级),Wireshark 提供协议字段级的可视化分析。TLS 解密的关键是 SSLKEYLOGFILE。

概述

网络排查最重要的工具是抓包——tcpdump 在服务器端用 BPF filter 过滤流量,Wireshark 提供可视化分析。BPF filter 编译为内核级过滤程序,在 packet 被拷贝到用户态之前丢弃不匹配的流量——比用 grep 过滤高效数个数量级。Wireshark 的 display filter 在已抓取的包上工作,支持任意协议字段的深度过滤。TLS 解密的密钥是 SSLKEYLOGFILE。

BPF Filter

BPF (Berkeley Packet Filter) 编译为内核级过滤程序,在抓包前丢弃不匹配的包,避免拷贝到用户态:

host 192.168.1.1
net 192.168.0.0/24
port 443
portrange 8000-9000
tcp, udp, icmp, arp
and / or / not / && / || / !

TCP flags:
  'tcp[tcpflags] & tcp-syn != 0'       SYN
  'tcp[tcpflags] == tcp-syn'           only SYN (not SYN+ACK)
  'tcp[tcpflags] & tcp-rst != 0'       RST

组合:
  '(host 1.1.1.1 or host 8.8.8.8) and tcp port 443'

实战命令

# 抓包到文件:
tcpdump -i eth0 -w capture.pcap -s 0 'host 192.168.1.1 and port 443'

# DNS:
tcpdump -i any -nn 'port 53'

# TCP SYN (所有连接建立):
tcpdump -i any -nn 'tcp[tcpflags] & tcp-syn != 0'

# HTTP Host header:
tcpdump -A -s 0 'tcp port 80' | grep -i 'Host:'

# tshark (Wireshark CLI):
tshark -r capture.pcap -Y 'tcp.analysis.retransmission'
tshark -r capture.pcap -Y 'tcp.analysis.zero_window'
tshark -r capture.pcap -z conv,tcp               # 连接统计

# TLS 解密:
# Wireshark: Edit - Preferences - TLS - (Pre)-Master-Secret log filename = SSLKEYLOGFILE

参考

  • BPF syntax: tcpdump.org/manpages/pcap-filter.7
  • Wireshark: wiki.wireshark.org/DisplayFilters

Keywords: tcpdump, BPF filter, Wireshark, tshark, packet capture, retransmission