Базовый синтаксис
tcpdump [-OPTIONS] [BPF-FILTER]
Минимально работающие команды:
bash
sudo tcpdump -i eth0 # снять всё на eth0
sudo tcpdump -i any # все интерфейсы
sudo tcpdump -i lo -nn -c 10 # 10 пакетов на loopback, без DNS-резолвинга
Главные флаги
-i IFACE- интерфейс (anyдля всех)-n- не резолвить адреса в имена-nn- не резолвить и порты в имена сервисов (80вместоhttp)-c N- снять N пакетов и выйти-w FILE.pcap- записать в файл (читается Wireshark'ом)-r FILE.pcap- прочитать из файла-s SNAP- snaplen (сколько байт от пакета сохранять; 0 = весь)-e- показать L2-header (MAC-адреса)-X- hex dump payload'а-A- ASCII payload (HTTP requests читаются прямо)-vvv- максимум details
BPF фильтры
Самое мощное в tcpdump - фильтр на чистом BPF:
bash
tcpdump -i any 'host 8.8.8.8'
tcpdump -i eth0 'port 443'
tcpdump -i any 'tcp port 80 and host example.com'
tcpdump -i any 'icmp'
tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn' # только SYN
tcpdump -i any 'net 10.0.0.0/8'
tcpdump -i any 'not arp'
Главные ключевые слова:
host,src,dst- IP-адресport,src port,dst port- портtcp,udp,icmp,arp- протоколnet- подсетьand,or,not- логика
Скобочки нужно экранировать или брать в '...':
bash
tcpdump -i any '(port 80 or port 443) and host google.com'
Запись в pcap
bash
sudo tcpdump -i any -w capture.pcap 'tcp port 443'
# ... сделать что-то ...
Ctrl+C
ls -lh capture.pcap # размер pcap
tcpdump -r capture.pcap -nn | head # прочитать обратно
Pcap-файл открывается в Wireshark - там graphical-парсер всех протоколов с цветной подсветкой полей.
TCP handshake глазами
Например посмотреть tcp-handshake на loopback:
bash
sudo tcpdump -i lo -nn 'tcp port 8080' -c 6
# Flags [S], seq 1000 ← SYN
# Flags [S.], seq 5000, ack 1001 ← SYN-ACK
# Flags [.], ack 5001 ← ACK
# Flags [P.], seq 1001:1041, ack 5001 ← данные с PUSH
Полезные оптимизации
-s 96- снять только заголовки (если интересен только flow), очень экономит размер pcap'а-G 60 -W 24 -w cap_%H%M.pcap- ротация: 60 секунд × 24 файла = час непрерывной записи без переполнения