Иногда мне необходимо было залезть на 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



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



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



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

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



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



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



Сохраняем.

Собственно 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. Отвечаем на вопросы



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





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



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

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

Комментарии (21)


  1. NLO
    00.00.0000 00:00

    НЛО прилетело и опубликовало эту надпись здесь


    1. spacewalk Автор
      30.01.2018 18:37

      Спасибо!


  1. lemproix
    30.01.2018 19:54

    Откройте для себя tshark, он делает в принце тоже самое что и его win брат (Wireshark)


    1. spacewalk Автор
      30.01.2018 19:55

      так он консольный? т.е. надо логиниться непосредственно на сервер?


  1. SmirnoffA
    30.01.2018 22:16

    Не в тему. «нашев»?, кошмар какой-то… Да что же это такое? Ну неужели можно быть настолько «узким» специалистом?


    1. spacewalk Автор
      30.01.2018 23:06

      А как Вы считаете правильным написать?


      1. ilynxy
        31.01.2018 00:36

        Вышев из дома и не нашев смысла жизни Розенталь умер так и не пришев в сознание.


        1. spacewalk Автор
          31.01.2018 01:06

          )) поправил ошибку, спасибо за замечание


      1. sbr2004
        31.01.2018 01:04

        найдя возможность


      1. moyseuk
        31.01.2018 01:04

        Думаю НАЙДЯ. Хотя, ИМХО, тут просто предложение довольно сложное. Проще его переформулировать.


  1. spacewalk Автор
    30.01.2018 23:03

    А как Вы считаете правильным написать?


    1. devgor
      31.01.2018 01:04

      найдя


  1. DeeZ
    31.01.2018 08:23

    Вы изобрели велосипед )
    Я под винду брал враперы из пакета eve-ng немного правил их под свои нужны.

    На линуксе алиас:

    alias rshark='OIFS=$IFS;IFS=,;rshark=( $(zenity --forms --title="Remote Shark"  --text="tcpdump parameters" --separator="," --add-entry="host*" --add-entry="interface*" --add-entry="filter" --add-entry="extra options")); [[ -n ${rshark[0]} && -n ${rshark[1]} ]] && ssh root@${rshark[0]} ${rshark[3]} "/usr/sbin/tcpdump -U -i ${rshark[1]} -s 0 -w - ${rshark[2]}" | wireshark -k -i - ;IFS=$OIFS;'



    1. spacewalk Автор
      31.01.2018 10:50

      Я не изобретал, а сказал, что немного подпилил существующее решение. В частности добавил авторизацию на сервер по ключам, отдельного пользователя (чтобы не логиниться под рутом, обычно отключаю эту возможность в ssh) и хождение через socks-прокси из-под Windows


  1. throttle
    31.01.2018 15:29

    Как же это все сложно по виндой. Сам когда-то реализовывал нечто похожее, но забросил, т.к. было нестабильно.
    В linux это делается одной строкой.


    1. Tufed
      31.01.2018 16:55

      И эта строка (комментарием выше) пока что меня пугает.


      1. throttle
        31.01.2018 17:26

        Там просто алиас со свистелками. Можно так, например:

        ssh user@server sudo tcpdump -i eth0 'net 192.168.1.0/24 and not port 22' -s 0 -w - | wireshark -k -i -

        Для user на server должно быть разрешено запускать sudo tcpdump без пароля.


        1. cruxacrux
          31.01.2018 17:37

          tcpdump не нужно запускать от рута, чтобы открыть сетевое устройство для перехвата трафика. Выдайте /usr/sbin/tcpdump разрешения CAP_NET_RAW и CAP_NET_ADMIN:

          setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

          И прав рута не нужно будет для запуска


          1. throttle
            31.01.2018 17:48

            Да, так еще лучше. И еще проще, чем под виндой.
            И почему «все» думают, что linux — это сложно?.. :)


          1. ValdikSS
            02.02.2018 11:56

            …и его смогут запускать все пользователи.


            1. cruxacrux
              02.02.2018 16:16

              Это понятно. Как и с setuid программами, рекомендуется устанавливать файловые ограничения какой группе пользователей можно иметь доступ к исполнению такого файла. Просто в отличии от sudo программа получит более ограниченный набор прав.