При диагностике сетей очень важно убедиться в том, что нужные пакеты приходят на нужный узел и не просто приходят, а соответствуют критериям, которые вы указали в правилах фильтрации.
Иначе можно долго гадать, что происходит и почему не работает то, что «по идее» должно работать. Поэтому не будем гадать, а просто посмотрим трафик своими глазами, в этом нам поможет утилита
tcpdump. Для ее установки выполните:
apt install tcpdump
После чего запустите ее с ключом -D, чтобы посмотреть какие интерфейсы в системе она видит и откуда может слушать трафик.
tcpdump -D
Далее мы можем просто запустить:
tcpdump -i enp3s0
И сразу утонем в количестве информации, разобраться в которой будет решительно невозможно, поэтому, чтобы получить выжимку мы будем использовать фильтры, самые популярные из них:
▫️port
▫️host
▫️src
▫️dst
▫️tcp
▫️udp
▫️icmp
Например, мы хотим посмотреть все пакеты с портом назначения
UDP 34567:tcpdump -i enp3s0 udp dst port 34567
Указанную нами конструкцию следует читать как: протокол UDP - порт назначения 34567.
Теперь утилита нам покажет все пакеты, которые соответствую данному критерию: у которых транспортный протокол UDP и в поле порт назначения стоит 34567.
А если мы хотим посмотреть пакеты только от определенного узла, чтобы понять доходит к нам на сервер он него что-нибудь или нет. Усложним фильтр и добавим в него две группы условий. Для их соединения можно использовать логические выражения:
▫️AND
▫️OR
Отдельно для отрицания условия можно использовать
▫️NOT
Например:
tcpdump -i enp3s0 src host 203.0.113.11 and udp dst port 34567
Здесь мы фильтруем по двум условиям: хост источник и протокол - порт назначения пакета.
Вот здесь может возникнуть вопрос, а почему нельзя написать так:
tcpdump -i enp3s0 src host 203.0.113.11 udp dst port 34567
Вроде бы как пол логике вещей условия все равно соединяются как-бы по логическому И, однако это неверно. tcpdump требует явного указания условии соединения различных примитивов.
В нашем условии два примитива: хост и порт. Общий синтаксис примитива можно описать выражением:
[протокол] [направление] {host|net|port|portrange} значениеВ нашем случае примитивы взяты в фигурные скобки, каждый примитив должен явно соединяться через логический оператор. Например, наоборот, все пакеты, кроме определенного узла:
tcpdump -i enp3s0 udp dst port 34567 and not src host 203.0.113.11
Если мы хотим захватить определенное количество пакетов, то используйте ключ
-с:tcpdump -i enp3s0 -с 50 src host 203.0.113.11 and udp dst port 34567
Данная команда захватит строго 50 пакетов, соответствующих условию.
Чтобы увеличить количество выводимой информации добавьте ключ
-v[v], чем больше v вы указали, тем на более глубокий уровень будет разбираться информация пакета, но не обольщайтесь, если пакет не содержит дополнительных подробностей, но ничего нового вы не увидите.При работе tcpdump пытается разрешать адреса в DNS-имена, а порты в имена служб, чтобы предотвратить такое поведение используйте ключ
-n:tcpdump -i enp3s0 -n src host 203.0.113.11 and tcp dst port 22
Но все это диагностика в реальном времени, а как быть, если мы хотим изучить полученный дамп подробно, в спокойной обстановке? Все просто, нужно записать его в файл, для этого предназначена опция
-w:tcpdump -i enp3s0 -c 50 src host 203.0.113.11 and tcp dst port 22 -w mydump.pcap
Теперь 50 пакетов, попадающих под фильтр, будут записаны в файл mydump.pcap, если вы не указали количество, то в файл запишется все, что tcpdump успел захватить, пока вы не прервали его работу через Ctrl+C.
Записанный файл можно открыть любым подходящим ПО, наиболее популярным является открытый анализатор пакетов Wireshark.
