# tcpdump - захват пакетов _Команды · LinuxLab Knowledge Base_ **TL;DR:** tcpdump читает пакеты с интерфейса по BPF-фильтру. Поддерживает запись pcap для последующего анализа в Wireshark. ## Базовый синтаксис ``` 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](/kb/tcp-handshake.md) на 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 файла = час непрерывной записи без переполнения ## Команды ```bash sudo tcpdump -i any -nn 'tcp port 80' -c 20 ``` 20 первых HTTP-пакетов на любом интерфейсе ```bash sudo tcpdump -i any -w trace.pcap 'host 1.2.3.4' ``` Записать в pcap всё связанное с хостом 1.2.3.4 (Ctrl+C чтобы остановить) ```bash sudo tcpdump -i any -nn 'icmp' ``` Только ICMP - посмотреть пинги (см. [[icmp]]) ```bash sudo tcpdump -nei eth0 -c 5 'arp' ``` ARP-пакеты с L2-header'ом (-e) - кто кого ищет ```bash sudo tcpdump -i any -A 'tcp port 80' -c 5 ``` ASCII-payload - на HTTP видишь GET и Host header прямо в выводе ## См. также - [Ethernet frame](/kb/ethernet-frame.md) - [TCP three-way handshake](/kb/tcp-handshake.md) - [ICMP](/kb/icmp.md)