Как перехватывать пакеты TCP SYN, ACK и FIN с помощью tcpdump
Вопрос: я хочу отслеживать динамику TCP-соединения (например, трехстороннее рукопожатие для установления соединения и четырехстороннее рукопожатие для разрыва соединения). Для этого мне нужно захватить только контрольные пакеты TCP, такие как пакеты с установленным флагом
SYN
,ACK
илиFIN
. Как я могу использоватьtcpdump
для захвата пакетов TCPSYN
,ACK
и/илиFYN
?
Как де-факто инструмент захвата пакетов, tcpdump
предоставляет мощные и гибкие возможности фильтрации пакетов. Механизм захвата пакетов libpcap
, на котором основан tcpdump
, поддерживает стандартные правила фильтрации пакетов, такие как фильтрация на основе заголовка пакета из 5 кортежей (т. е. на основе IP-адресов/портов источника/получателя). и тип IP-протокола).
Правила фильтрации пакетов tcpdump
/libpcap
также поддерживают более общие выражения для пакетов, в которых произвольные диапазоны байтов в пакете проверяются с помощью операций отношения или бинарных операторов. Для представления диапазона байтов вы можете использовать следующий формат:
proto [ expr : size ]
proto
может быть одним из известных протоколов (например, ip, arp, tcp, udp, icmp, ipv6). expr
представляет смещение в байтах относительно начала указанного заголовка протокола. Существуют общеизвестные смещения байтов, такие как tcpflags
, или константы значений, такие как tcp-syn
, tcp-ack
или tcp- плавник
. size
является необязательным и указывает количество байтов для проверки, начиная со смещения в байтах.
Используя этот формат, вы можете фильтровать пакеты TCP SYN
, ACK
или FIN
следующим образом.
Чтобы захватить только пакеты TCP SYN
:
# tcpdump -i <interface> "tcp[tcpflags] & (tcp-syn) != 0"
Чтобы захватить только пакеты TCP ACK
:
# tcpdump -i <interface> "tcp[tcpflags] & (tcp-ack) != 0"
Чтобы захватить только TCP-пакеты FIN
:
# tcpdump -i <interface> "tcp[tcpflags] & (tcp-fin) != 0"
Чтобы захватить только пакеты TCP SYN
или ACK
:
# tcpdump -r <interface> "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"