Мониторинг трафика на коммутаторах при помощи Wireshark + Plink
Сразу отмечу, что способ не мой, а подсмотренный у EVE-NG. Никаких особых преимуществ он не даёт, обладает массой ограничений, но кому-то, просто, удобнее работать с Wireshark в режиме реального времени.
Суть метода проста: перенаправить вывод от утилиты Tcpdump в SSH сессию и передать его в Wireshark.
Ограничения метода в том, что нагружается линк, через который заходите на устройство, а при определённом рвении, можно попытаться его же прослушать (расскажите о последствиях в комментариях). Из этого же ограничения следует, что нужно стараться уменьшить трафик, максимально фильтруя вывод tcpdump.
Ну, и по традиции, вы всё делаете на свой страх и риск. Настоятельно рекомендую, сначала, подумать о последствиях своих действий.
Ну, вот теперь, когда всё бесполезное сказано, переходим к сути.
Утилита Plink.exe которая входит в пакет Putty умеет создавать SSH сессии и выполнять там заданные команды. Эту её особенность, будем использовать для запуска на целевой машине утилиту Tcpdump. В общем виде команда выглядит так:
plink.exe -ssh -batch -pw Password root@10.0.0.2 "tcpdump -U -i eth0 -w -" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
Plink поднимает SSH сессию до машины, от имени root, где запускает утилиту Tcpdump, которая отправляет вывод в SSH сессию, который "скармливаем" Wireshark.
Если вы никогда не заходили на машину используя Putty, то с первого раза у Вас не получится потому, что нужно обменяться ключами. То есть, сначала нужно запустить Putty, и разрешить прием ключа.
Если вам нужны полученные Wireshark данные, то не забудьте их сохранить перед закрытием сессии, иначе после нажатия ctrl+c все полученные данные превратятся в тыкву потеряются без предупреждения и объяснения причин.
Перейдём к практике:
Данная конструкция прекрасно работает на коммутаторах под управлением JunOS. Правда, нужно попасть не в cli, куда попадают простые пользователи, а разу в shell. Что, в свою очередь, возможно только от учётки root, которую нужно разрешить для сессии SSH. В режиме конфигурации добавляем:
user@switch# set system services ssh root-login allow
Коммитим, радуемся пользуемся.
Часто,на линуксовых машинах, бывает, что зайти непосредственно под root нельзя, но можно повыситься до него, тогда применяем следующую конструкцию:
plink.exe -ssh -batch -pw Password root@10.0.0.2 "echo -e 'SudoPass\r' | sudo -S tcpdump -U -i eth0 -w -" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
Отдельно следует анально покарать упомянуть, что у некоторых производителей, интерфейсы в cli, имеют иное наименование, чем в shell. К примеру, коммутаторы Dell под управлением OS10.
У данных коммутаторов, интерфейс, который в cli называется "ethernet1/1/23", в shell будет называться "e101-023-0", а интерфейс 23го влана - "br23". Весь список интерфейсов можно получить традиционно, введя команду "ip a" в режиме shell, в который можно попасть введя команду "system bash" в cli.
Чтобы попасть в shell минуя ввод команд в cli у OS10 есть специальный пользователь с правами root - "linuxadmin". Следует упомянуть, что если вы хотите получить доступ от этого пользователя по SSH, то пароль данному зверю, нужно задавать непосредственно в его учётке. Алгоритм следующий:
в cli задаем временный пароль на system-user linuxadmin;
переходим в shell;
переключаемся на linuxadmin через su используя временный пароль;
меняем пароль на необходимый;
плачемпользуемся привилегированным доступом.
Таким образом, строка для коммутаторов Dell будет следующей:
plink.exe -ssh -batch -pw Password linuxadmin@10.0.0.2 "echo -e 'Password\r' | sudo -S tcpdump -U -i e101-023-0 -w -" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
К сожалению, переходя к всё более производительным решениям, производители всё дальше и дальше отдаляют пути прохождения пакетов от процессора, контролирующего работу системы. И вот, уже, вырвать пакеты из цепких лап ASIC становится не банальной задачей. Но решаемой, благодаря предусмотрительности производителя.
Так например, у Mellanox есть механизм зеркалирования, подробно описанный на сайте техподдерки (https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-43/Monitoring-and-Troubleshooting/Network-Troubleshooting/SPAN-and-ERSPAN/##cpu-port-as-the-span-destination)
В крадце, суть в следующем: создается политика перенаправления входящего или исходящего трафика с нужного интерфейса на CPU, где его, в последствии ловит Tcpdump.
Итак, по пунктам, по рекомендации от производителя:
создаём файл span.rules, в директории /etc/cumulus/acl/policy.d/ в котором пропишем правила перенаправления, например:
[iptables]
-A FORWARD -i swp1 -s 10.10.1.1 -j SPAN --dport cpu
-A FORWARD -o swp1 -s 10.10.1.1 -j SPAN --dport cpu
применяем политики
user@switch$ sudo cl-acltool -i
проверяем
user@switch:~$ sudo iptables -L -v | grep SPAN
запускаем мониторинг трафика
plink.exe -ssh -batch -pw Password user@10.0.0.2 "echo -e 'SudoPass\r' | sudo -S tcpdump -U -i mirror -w -" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
К сожалению, у меня не получилось, таким способом, получить исходящий трайфик с интерфейсов bond. Производитель, в инструкции, ловко обошел вопрос: "Можно ли зеркалить на CPU интерфейсы bond?"
Возможно, кто-то решит, что у меня есть предрасположенность к Mellanox и антипатия к Dell, то он ошибается, я люблю любовно(нет) собранный у меня зоопарк одинаково.
Надеюсь, информация была полезна.