Wireshark для просмотра трафика в реальном времени

Иногда мне необходимо было залезть на linux-сервера и иметь возможность просматривать текущий трафик в реальном времени. Как я делал до этого? На целевом сервере устанавливался tcpdump, выхлоп которого писался в файлик. Далее файл через scp тянулся на локальный компьютер под Windows и открывался в Wireshark.

В определенный момент мне захотелось более удобного решения и я, нашев возможность запустить Wireshark на винде (локально) в связке с tcpdump-ом на сервере (удаленно) на просторах интернета, и немного подпилив эту реализацию, решил поделиться с Вами.

Работающая связка (которую проверил я) состоит из:

 tcpdump: version 4.9.2
     wireshark: version 2.4.4 (v2.4.4-0-g90a7be11a4)
     plink: release 0.67
     Windows 7 64 Bit Максимальная


И хотя, как мне кажется, эти программы будут работать на большинстве версий так же, как и сейчас, я думаю стоит упомянуть именно рабочую конфигурацию.

Установим необходимое ПО и настройки на сервере и десктопе с Windows.

Linux (у меня debian)


# установка необходимых программ
apt-get install sudo tcpdump -y
# добавление дополнительного пользователя в систему для взаимодействия через него по SSH
adduser trafficmonitor
# логинимся в него
su trafficmonitor
# создаем ключи ssh-keygen (по умолчанию создаст в домашней директории в каталоге .ssh)
ssh-keygen
# переименовываем открытый ключ и утягиваем закрытый к себе через scp/winscp
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
# права на каталог и файл
chmod 755 ~/.ssh && chmod 644 ~/.ssh/authorized_keys
# идем в sudoers...
nano /etc/sudoers
# ...и разрешаем пользователю trafficmonitor безпарольно выполнять от sudo две команды:
trafficmonitor ALL=NOPASSWD: /usr/sbin/tcpdump
trafficmonitor ALL=NOPASSWD: /sbin/ip addr show
# рестартуем ssh (тут стоит оговориться, что у вас настроена авторизация по ключам и конечно отключена авторизация по паролю, иначе вы получите еще одну слабую точку в виде подбора пароля к этому юзеру)
service ssh restart


На этом на стороне Linux закончили.

Windows


Далее для Windows необходимо установить putty (и с ним обязательно plink), а также само собой wireshark

Открываем putty

tdcejsj0czzf1getwsqu97jobcg.png

Создаем новую сессию trafficmonitor и оставляем пустым Hostname

cdj2_d1tblerloli5jv8jnchmug.png

Идем в настройки авторизации и добавляем ранее вытянутый ключ (который не забываем протянуть через puttygen, чтобы он подходил для putty)

ahb8iz-pylby1brzh7ri-e64mno.png

Сохраняем сессию в главном окне.

Хочу уточнить, что у меня также была потребность настройки этого функционала через socks5 прокси с авторизацией, поэтому я покажу как и это сделать, но для этого нам нужна еще одна сессия для putty (trafficmonitor_via_proxy):

yual4yux9m1astabyly_q7jv8m4.png

Также прописываем ключ

ahb8iz-pylby1brzh7ri-e64mno.png

И настраиваем прокси (в моем случае тип, IP-port, username-password)

rgoql82cflzdybz_paznvddltmq.png

Сохраняем.

Собственно Putty готово, а ведь из него мы и будем для plink дергать эти сохраненые сессии.

Теперь дело за cmd:

@echo off
:: ip/hostname целевого linux-сервера
set /P ip="Input IP or hostname: "
:: TCP-порт для службы SSH
set /P port="Input SSH port(default 22): "
IF "%port%"=="" (
SET port=22
echo "SSH port is TCP/22..."
) ELSE (echo "SSH port is TCP/%port%...")
:: в некоторых случаях необходимо видеть также SSH трафик, через который пойдет дамп, но в  обычных случаях я его отключаю
set /P ssh="Show SSH traffic?(y/N): "
IF "%ssh%"=="y" (echo "SSH will be showed...") ELSE (
	SET visible_ssh='not port 22' 
	echo "SSH won't be showed..."
	)
:: вопрос об использовании предварительно настроенной сессии через socks5
set /p socks="Use SOCKS5?(y/N): "
IF "%socks%"=="y" (
	echo "SOCKS5 will be used..."
	SET params=-load trafficmonitor_via_proxy
	) ELSE (
	echo "Direct connection will be used..."
	SET params=-load trafficmonitor
	)
:: данная команда вываливает список интерфейсов, если есть необходимость для выбора             определенного (хотя в данной версии надо его указывать в любом случае)
plink %params% trafficmonitor@%ip% -P %port% "sudo ip addr show"
@echo.

set /P int="Select interface(eth0,lo...) "

:: запускаем сайм wireshark и через pipe из tcpdump передаем в него наш трафик
plink %params% trafficmonitor@%ip% -P %port% "sudo tcpdump -i %int% -U -s0 -w - %visible_ssh%" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i - 


Вывод


Теперь после запуска этого cmd вы сможете непосредственно мониторить трафик на сервере, без лишней волокиты. Для удобства можно также подкорректировать cmd-файл, чтобы он брал из настроек putty уже существующие сессии.

Вот так, к примеру, выглядит работа этого скрипта:

1. Отвечаем на вопросы

j6lb4-kmmf9yo2jtgus4z73qzzi.png

2. Выбираем интерфейс

bie9glfnmosiuc1-y-a6c8gsufc.png

b-ya5rhcewwz0ul_wlrtkf9vbra.png

3. Наслаждаемся

e7ti35gtmvhw2xtsaugdgjgelkc.png

Стоит отметить что поток в Wireshark можно фильтровать, но нельзя остановить — он не возобновится. По итогу также удобно сохранить интересующий нас кусок трафика в pcap-файл.
На этом все и всем спасибо.

UPD1. Если серверов больше 1, то в каждом необходимо проделать процедуру добавления пользователя trafficmonitor и помещения в его домашнюю директорию раннее созданного нами открытого ключа id_rsa.pub (authorized_keys) по пути ~/.ssh/ с правами 755 на каталог и 644 на файл соотвественно. А также озаботиться наличием записей в sudoers

© Habrahabr.ru