Библиотека сайта rus-linux.net
Администрирование систем Linux. Перехват сетевого трафика
Оригинал: Network sniffingАвтор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 1 апреля 2015 г.
Глава 23. Перехват сетевого трафика
Администратор сети должен уметь работать со сниффером, таким, как wireshark
или tcpdump
, для диагностирования проблем сети.
Студенту также придется нередко прибегать к использованию сниффера для того, чтобы разобраться в принципах функционирования сетей. В данной главе описываются соответствующие методики перехвата сетевого трафика
.
23.1. Приложение wireshark
23.1.1. Установка wireshark
В данном примере приведена команда для установки приложения wireshark
в дистрибутивах, использующих пакеты программного обеспечения с расширением .deb
(включая Debian, Mint, Xubuntu и другие дистрибутивы).
root@debian8:~# Чтение списков пакетов Готово Построение дерева зависимостей Чтение информации о состоянии Готово ... (вывод сокращен)
В дистрибутивах, использующих пакеты программного обеспечения с расширением .rpm
, таких, как CentOS, RHEL и Fedora, для установки приложения wireshark
может использоваться утилита yum
.
[root@centos7 ~]# yum install wireshark Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile ... (вывод сокращен)
23.1.2. Выбор сетевого интерфейса
При запуске приложения wireshark
в первый раз вам придется выбрать сетевой интерфейс. Вы увидите диалог, который выглядит аналогично приведенному на иллюстрации ниже.
Вероятна ситуация, при которой доступных сетевых интерфейсов попросту не окажется, ведь в некоторых дистрибутивах перехват сетевого трафика может осуществляться исключительно пользователем root. В этом случае вам придется запустить приложение wireshark от лица пользователя root с помощью команды sudo wireshark
.
Или же вы можете последовать общим рекомендациям и использовать утилиту tcpdump
или какой-либо другой инструмент для перехвата трафика и записи данных в файл. Любые перехваченные данные могут быть проанализированы позднее с помощью приложения wireshark
.
23.1.3. Минимизация трафика
В процессе перехвата сетевого трафика в течение очень коротких промежутков времени могут генерироваться тысячи пакетов. Очевидно, что такой объем данных затруднит анализ трафика. Попытайтесь выйти из этого положения, изолировав ваш сниффер в рамках сети. Предпочтительным вариантом является перехват трафика, проходящего через сетевой интерфейс изолированной виртуальной сети, находящейся под вашим полным контролем.
Если вы изучаете инструменты для перехвата сетевого трафика в домашних условиях, для минимизации трафика будет полезно завершить работу всех приложений для работы с сетью, запущенных на вашем компьютере, а также отсоединить компьютер от других компьютеров и от таких устройств, как смартфоны и планшеты.
И все же более важным инструментом для минимизации трафика являются фильтры
, которые будут обсуждаться в следующем разделе.
23.1.4. Перехват трафика, генерируемого утилитой ping
Я запустил сниффер и захватил все пакеты, переданные по сети в результате исполнения трех команд ping
(не имеет смысла выполнять эти команды от лица пользователя root):
root@debian7:~# ping -c2 ns1.paul.local PING ns1.paul.local (10.104.33.30) 56(84) bytes of data. 64 bytes from 10.104.33.30: icmp_req=1 ttl=64 time=0.010 ms 64 bytes from 10.104.33.30: icmp_req=2 ttl=64 time=0.023 ms --- ns1.paul.local ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.010/0.016/0.023/0.007 ms root@debian7:~# ping -c3 linux-training.be PING linux-training.be (188.93.155.87) 56(84) bytes of data. 64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=1 ttl=56 time=15.6 ms 64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=2 ttl=56 time=17.8 ms 64 bytes from antares.ginsys.net (188.93.155.87): icmp_req=3 ttl=56 time=14.7 ms --- linux-training.be ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 14.756/16.110/17.881/1.309 ms root@debian7:~# ping -c1 centos7.paul.local PING centos7.paul.local (10.104.33.31) 56(84) bytes of data. 64 bytes from 10.104.33.31: icmp_req=1 ttl=64 time=0.590 ms --- centos7.paul.local ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.590/0.590/0.590/0.000 ms
В общей сложности из сети было захвачено более чем 200 пакетов. Все станет гораздо очевиднее в том случае, если введете строку icmp
в поле фильтра и нажмете кнопку "Применить"
("Apply").
23.1.5. Перехват трафика, генерируемого утилитой ping и клиентом dns
Работая с той же сессией захвата данных, применим отличный фильтр
. Мы хотим отслеживать трафик, относящийся как к протоколу dns
, так и к протоколу icmp
, поэтому нам придется ввести названия двух упомянутых протоколов в поле фильтра.
Для захвата данных, относящихся к двум рассматриваемым протоколам, в поле фильтра должна быть введена строка "dns or icmp"
. В случае ввода строки "dns and icmp"
не будет выведено информации о каких-либо пакетах, так как не существует пакетов, относящихся к обоим упомянутыми протоколам.
При рассмотрении приведенной выше иллюстрации можно заметить, что пакеты 25 и 26 имеют исходные
и целевые
IP-адреса 10.104.33.30. Это объясняется тем, что клиент DNS работает на том же компьютере, что и сервер DNS.
Аналогичная ситуация наблюдается и в случае пакетов 31 и 32, ведь с помощью утилиты ping осуществляется отправка пакетов рабочей системе, на которой запущена данная утилита.
23.1.6. Определенный IP-адрес
В данном случае осуществляется фильтрация пакетов, относящихся к протоколу DNS
и содержащих определенный IP-адрес
. В качестве фильтра используется строка "ip.addr==10.104.33.30 and dns"
. Директива and
сообщает приложению о том, что следует выводить информацию о каждом пакете, соответствующем двум условиям.
Пакет 93 содержит запрос DNS
, направленный на получение записи типа A домена linux-training.be. Пакет 98 содержит ответ от сервера DNS
. Как вы думаете, что происходило после отправки пакета 93 и до приема пакета 98? Попытайтесь ответить на этот вопрос перед чтением следующего раздела (при работе с различными системами всегда полезно пытаться предсказывать наступающие события и проверять корректность своих предсказаний).
23.1.7. Фильтрация на основе фреймов
Корректным термином, используемым для обозначения перехваченного пакета
, является термин фрейм
(из-за того, что мы осуществляем перехват пакетов на уровне 2 сетевой модели OSI). Таким образом, для вывода информации о пакетах с определенными номерами, следует использовать директиву frame.number
в поле фильтра.
23.1.8. Исследование содержимого пакетов
Средняя панель окна сниффера может быть раскрыта. При выборе строки в рамках данной панели вы можете увидеть соответствующие значения байт в поле нижней панели.
На иллюстрации ниже показана средняя панель окна сниффера с выбранным адресом моего ноутбука.
Учтите, что описанная выше техника отлично работает при перехвате трафика, передаваемого через один сетевой интерфейс. Если же вы перехватываете трафик, к примеру, с помощью команды tcpdump -i any
, вы столкнетесь с методом перехвата пакетов "Linux cooked capture"
.
23.1.9. Другие примеры фильтров
Вы можете комбинировать два описания протоколов с помощью директивы логической операции or
("ИЛИ"), расположенной между ними. На иллюстрации ниже показан способ захвата исключительно пакетов, относящихся к протоколам ARP
и BOOTP
(или DHCP
).
А на следующей иллюстрации показан способ перехвата пакетов, относящихся к протоколу DNS
и содержащих определенный IP-адрес
.
23.2. Утилита tcpdump
В случае работы с интерфейсом командной строки системы перехват пакетов может осуществляться с помощью утилиты tcpdump
. Ниже приведены некоторые примеры ее использования.
При использовании команды tcpdump host $ip
будет выводиться информация обо всем трафике, относящимся к определенному узлу (в данном случае с IP-адресом 192.168.1.38).
root@ubuntu910:~# tcpdump host 192.168.1.38 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
Перехват трафика, относящегося исключительно к протоколу ssh (протокол TCP, порт 22), может осуществляться с помощью команды tcpdump tcp port $порт
. Длина строк вывода урезана до 76 символов для более удобного чтения.
root@deb503:~# tcpdump tcp port 22 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes 14:22:20.716313 IP deb503.local.37973 > rhel53.local.ssh: P 666050963:66605 14:22:20.719936 IP rhel53.local.ssh > deb503.local.37973: P 1:49(48) ack 48 14:22:20.720922 IP rhel53.local.ssh > deb503.local.37973: P 49:113(64) ack 14:22:20.721321 IP rhel53.local.ssh > deb503.local.37973: P 113:161(48) ack 14:22:20.721820 IP deb503.local.37973 > rhel53.local.ssh: . ack 161 win 200 14:22:20.722492 IP rhel53.local.ssh > deb503.local.37973: P 161:225(64) ack 14:22:20.760602 IP deb503.local.37973 > rhel53.local.ssh: . ack 225 win 200 14:22:23.108106 IP deb503.local.54424 > ubuntu910.local.ssh: P 467252637:46 14:22:23.116804 IP ubuntu910.local.ssh > deb503.local.54424: P 1:81(80) ack 14:22:23.116844 IP deb503.local.54424 > ubuntu910.local.ssh: . ack 81 win 2 ^C 10 packets captured 10 packets received by filter 0 packets dropped by kernel
Та же операция, но с записью захваченных данных в файл, может осуществляться с помощью команды tcpdump -w $имя_файла
.
root@ubuntu910:~# tcpdump -w sshdump.tcpdump tcp port 22 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes ^C 17 packets captured 17 packets received by filter 0 packets dropped by kernel
С помощью команды tcpdump -r $имя_файла
может быть выведено содержимое файла, созданного в предыдущем примере.
root@ubuntu910:~# tcpdump -r sshdump.tcpdump
Множество других примеров использования рассматриваемой утилиты может быть найдено на странице руководства man tcpdump
.
23.3. Практическое задание: перехват сетевого трафика
-
1. Установите приложение wireshark в вашу систему (работающую не в виртуальной машине).
-
2. Используйте утилиту ping генерации трафика между вашим и каким-либо другим компьютером.
-
3. Начните перехват сетевого трафика.
-
4. С помощью фильтра осуществите вывод информации исключительно о тех пакетах, которые содержат ответы на запросы от утилиты ping.
-
5. Теперь передайте утилите ping имя домена (такое, как www.linux-training.be) и попытайтесь перехватить пакеты с запросом и ответом DNS. Какой DNS-сервер был использован? Был ли использован протокол TCP или UDP для передачи запроса и ответа?
-
6. Найдите закрытый вебсайт, имеющий форму запроса пароля. Попытайтесь войти на него, использовав имя пользователя 'paul' и пароль 'hunter2' в процессе работы сниффера. Теперь попытайтесь найти введенные имя пользователя и пароль в захваченных с помощью сниффера данных.
23.4. Корректная процедура выполнения практического задания: перехват сетевого трафика
-
1. Установите приложение wireshark в вашу систему (работающую не в виртуальной машине).
-
В дистрибутивах Debain/Ubuntu:
aptitude install wireshark
В дистрибутивах Red Hat/Mandriva/Fedora:
yum install wireshark
-
2. Используйте утилиту ping генерации трафика между вашим и каким-либо другим компьютером.
-
ping $ip_адрес
-
3. Начните перехват сетевого трафика.
-
(sudo) wireshark
Выберите сетевой интерфейс (вероятно, eth0)
-
4. С помощью фильтра осуществите вывод информации исключительно о тех пакетах, которые содержат ответы на запросы от утилиты ping.
-
Введите
'icmp'
(без кавычек) в поле фильтра и нажмите кнопку"Применить"
("Apply"). -
5. Теперь передайте утилите ping имя домена (такое, как www.linux-training.be) и попытайтесь перехватить пакеты с запросом и ответом DNS. Какой DNS-сервер был использован? Был ли использован протокол TCP или UDP для передачи запроса и ответа?
-
В первую очередь запустите сниффер.
Введите
'dns'
в поле фильтра и нажмите кнопку"Применить"
("Apply").root@ubuntu910:~# ping www.linux-training.be PING www.linux-training.be (88.151.243.8) 56(84) bytes of data. 64 bytes from fosfor.openminds.be (88.151.243.8): icmp_seq=1 ttl=58 time=14.9 ms 64 bytes from fosfor.openminds.be (88.151.243.8): icmp_seq=2 ttl=58 time=16.0 ms ^C --- www.linux-training.be ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 14.984/15.539/16.095/0.569 ms
Окно приложения wireshark должно выглядеть аналогичным образом.
На основе информация из окна приложения wireshark можно сделать вывод о том, что запрос DNS передавался с помощью пакета UDP, после чего несложно дать ответы на поставленные вопросы.
-
6. Найдите закрытый вебсайт, имеющий форму запроса пароля. Попытайтесь войти на него, использовав имя пользователя 'paul' и пароль 'hunter2' в процессе работы сниффера. Теперь попытайтесь найти введенные имя пользователя и пароль в захваченных с помощью сниффера данных.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Глава 22. Настройка сетевых интерфейсов | Глава 24. Добавление IP-адресов и связывание сетевых интерфейсов |