Салимóненко Дмитрий Александрович
ЗАДАНИЕ 1: Основы работы с сетью в LINUX при помощи утилит
СОДЕРЖАНИЕ
Введение
В этом задании Вы потренируетесь работать с сетью в Linux. А именно – сканировать сеть, т.е.:
- определять порты, открытые для прослушивания,
- определять протоколы, используемые компьютером (локальным или удаленным) в данный момент.
Обращаем внимание: при помощи некоторых из обсуждаемых ниже утилит возможно исследовать сетевые особенности не только своего локального (т.е. того, на котором работаете Вы), но и удаленного компьютера, т.е. сервера в сети интернет. Последний может быть задан либо по доменному имени, либо по IP-адресу.
Возможности утилит являются достаточно широкими. Например, вполне можно выявить несанкционированные соединения, установленные без Вашего ведома (или без ведома программы, которой Вы разрешили это сделать).
Примечание 1. Некоторые сетевые возможности в Linux приведены в Задании 2, Задании 3, которые реализованы в соответствующих программах. Однако, функционал тех программ является, конечно, достаточно ограниченным и будет реализован, в основном, лишь в учебных целях. Здесь же Вы увидите и попробуете «вживую» гораздо больше возможностей.
Примечание 2. Сетевые утилиты применительно к удаленным компьютерам (серверам) используйте ОЧЕНЬ аккуратно. Не секрет, что при помощи них можно реализовать так называемую DDoS-атаку. Собственно, примерно таким образом она и, нередко, реализуется на практике. НО: делать этого НЕ нужно. Во-первых, это нехорошо, как минимум. Во-вторых, Вас вполне могут вычислить по IP-адресу и/или местоположению (даже если Вы будете использовать прокси-серверы) и все дело может закончиться реальным уголовным сроком. Все-таки, университетские навыки, умения и познания должны приобретаться студентами отнюдь не для этого, не так ли?
Утилита nmap
↑ К содержанию ↑Это – пожалуй, наиболее широко известная утилита в мире профессионалов, обслуживающих серверы Linux. В стандартные дистрибутивы Linux она, как правило, не входит, потому устанавливать ее необходимо самостоятельно. Естественно, для этого необходимы права администратора (суперпользователя).
Примечание. Для Windows также есть аналогичная утилита.
Архивы с утилитами можно скачать с официального сайта nmap.org. Там приведен довольно большой список версий. Я сам, к примеру, тестировал версию nmap-7.60.tgz от 2017-08-01, она имеет размер 12MБ.
В принципе, процесс установки этой утилиты очень хорошо описан здесь. На всякий случай, повторим здесь основные этапы.
Установка может производиться двумя путями:
1) Автоматическая установка:
sudo apt-get install nmap
(если Вы работаете в Ubuntu). ОС спросит пароль, после верного его ввода начнется установка.
Однако, может возникнуть проблема, если у Вас установлена старая версия Ubuntu. Дело в том, что релизы этой операционной системы меняются, вроде бы, каждые 9 месяцев. Соответственно, приведенная выше команда будет запрашивать версию nmap именно с тех адресов в интернете, которые соответствуют СТАРОЙ версии ОС. Однако, как правило, эти версии впоследствии переносятся в архив (что приводит к смене адреса). В итоге при попытке установки путем указанной команды Вы в консоли будете получать сообщения типа:
404 Not Found [IP: 91.189.91.26 80]
Err http://us.archive.ubuntu.com/ubuntu/ utopic/main nmap amd64 6.46-2ubuntu1
Подобные сообщения означают, что, скорее всего, по указанным адресам в архивах ничего полезного для нас нет (ошибка 404 означает. что соответствующая вебстраница недоступна). А это, в свою очередь, означает, что для того, чтобы воспользоваться данной командой, придется ВРУЧНУЮ (как и многое в Linux, увы) искать на официальном сервере Ubuntu необходимые нам архивы и, после чего, соответствующим образом конфигурировать команду.
Ну, или, как вариант – устанавливать самую последнюю версию ОС. Однако, если в процессе работы в Linux приходится периодически устанавливать то одни, то другие утилиты, модули, то из вышесказанного следует, что при этом придется, в среднем, 1-2 раза в год обновлять ОС. По поводу последнего я, теоретически, ничего не имею против. Однако, возникает резонный вопрос: а, собственно, работать-то в ОС – когда? Если постоянно/периодически приходится ее обновлять и, зачастую, заново устанавливать ранее инсталлированные утилиты? Это утомительно, да и время от времени придется вспоминать, как там что делалось. Поэтому данный вариант, вероятно, будет не самым удобным.
2) Установка вручную:
а) wget -O Nmap.tgz http://nmap.org/dist/nmap-6.25.tgz
Это – команда, при помощи которой происходит скачивание утилиты версии 6.25. Обращаем внимание, что вместо этого можно самостоятельно посетить сайт nmap.org (ссылку см. выше) и скачать понравившуюся Вам версию утилиты оттуда вручную:
б) tar -xvzf Nmap.tgz
Это – команда разорхивации скачанного файла с утилитой. При этом автоматически создастся каталог с именем nmap-6.25. В него следует перейти при помощи следующей команды:
в) cd nmap-6.25
Переходим в нужный каталог:
г) ./configure
По всей видимости, это – команда что-то где-то конфигурирует. Делает она это долго, несколько минут. Следует дождаться удачного завершения.
д) make
Запускаем созданный make-файл. Это – тоже довольно длительный процесс, но и он когда-нибудь закончится.
е) sudo make install
И, наконец, в качестве завершающего этапа – запускаем саму команду инсталляции утилиты nmap. Еще немного ожидания – и утилита будет установлена в системе. По крайней мере, у меня в VMware Player, Linux Ubuntu 14.10 она установилась без особых проблем.
Для того, чтобы узнать информацию о работе этой команды, можно воспользоваться, как обычно, справочной системой:
man nmap
Предупреждаем, что содержание справки здесь составляет более 2000(!) строк. Возможности данной утилиты достаточно широки. Но, мы с Вами рассмотрим лишь некоторые из них – чтобы Вы получили представление о том, какие примерно виды задач она может решать.
Примечание. Не стоит вводить ПРОИЗВОЛЬНЫЙ IP-АДРЕС при использовании данной утилиты. В диапазон адресов могут попасть некие интересные учреждения, о которых в обычной жизни говорить вслух не принято. Даже сканирование (не говоря уже о пинговании) адресов, сетей таких учреждений может окончиться (в России) тюремным сроком. Раз уж даже за митинги или перепосты чужих сообщений людей сажают.
1) nmap scanme.nmap.org
Для примера, взят сервер - сайт разработчика утилиты: scanme.nmap.org
. И вот результаты:Starting Nmap 7.60 ( https://nmap.org ) at 2017-08-14 12:52 PDT
Stats: 0:00:03 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan
Connect Scan Timing: About 2.15% done; ETC: 12:54 (0:02:17 remaining)
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.25s latency).
Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f
Not shown: 990 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
110/tcp closed pop3
111/tcp closed rpcbind
199/tcp closed smux
256/tcp closed fw1-secureremote
995/tcp closed pop3s
1025/tcp closed NFS-or-IIS
5900/tcp closed vnc
31337/tcp open Elite
Nmap done: 1 IP address (1 host up) scanned in 35.34 seconds
Что видим? Программа показывает IP-адреса в двух форматах: IPv4 и IPv6. Показываются также открытые (open) и закрытые (closed) порты. Также сообщается, что есть 990 портов, которые заблокированы сервером. Т.е. о них информации утилита nmap получить не может.
Примечание. Интересно, что при повторном вызове утилиты для этого сайта выдаваемая информация гораздо скуднее и состоит всего из двух видов протоколов – SSH и HTTP. Возможно, сервер, обнаружив, что с нашего IP-адреса произошел повторный аналогичный запрос, перестал «затруднять себя», выдав только наиболее необходимые, по его мнению, порты.
Nmap распознаёт следующие состояния портов: open, filtered, closed, или unfiltered:
- Open означает, что приложение на целевой машине готово для принятия пакетов на этот порт.
- Filtered означает, что брандмауэр, фильтр, или что-то другое в сети блокирует порт, так что Nmap не может определить, является ли порт открытым или закрытым.
- Closed — не связаны в данный момент ни с каким приложением, но могут быть открыты в любой момент.
- Unfiltered порты отвечают на запросы Nmap, но нельзя определить, являются ли они открытыми или закрытыми.
Мы видим, что, скажем, для того, чтобы обратиться к данному серверу по протоколу SSH (например, при помощи интерфейса сокетов), необходимо указывать порт 22 для ТСР протокола (см. задания с сокетами по предмету Вычислительные Системы, Сети и Телекоммуникации). Напомним, что порт задается командой видаaddr.sin_port = htons(3425)
;
В данном случае, вместо 3425 будет фигурировать порт под номером 22.
Если же мы захотим обратиться к этому серверу по протоколу http, тогда порт нужно указать номер 80.
Примечание. Отметим, что это – стандартный порт, который является открытым на прослушивание в очень многих компьютерах-серверах, на которых расположены сайты. А вообще, номер порта может быть выбран администратором сервера произвольно – для любого протокола. Общеизвестный номер порта применятся для того, чтобы для программ, обращающихся к серверу, не было необходимости «угадывать» его или применять при обращении утилиты наподобие nmap.
Для проверки, Вы можете ввести любое другое (существующее!) доменное имя какого-нибудь сайта – и утилита выдаст информацию о портах для сервера, на котором физически находится этот сайт.
Таким образом, зная доменное имя, протокол и номер порта, соответствующий последнему, для конкретного сервера, можно послать ему запрос и получить ответ.
Вместо доменного имени можно ввести IP-адрес, например: nmap 45.33.32.156
Результат будет тем же самым.
В локальной сети (состоящей из одного компьютера, подключенного через виртуальную машину и модем – к провайдеру) выдается сообщение следующего вида:Nmap scan report for localhost (192.168.145.135)
Host is up (0.0000010s latency).
All 1000 scanned ports on localhost (192.168.145.135) are closed
Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds
Подумайте, почему ВСЕ порты закрыты, почему ни одного протокола не показывает эта утилита? Попробуйте запустить один из листингов-серверов и запустите утилиту вновь – изменятся ли результаты ее работы для локальной сети?
Данная утилита позволяет применять многочисленные опции:
Сканирования протокола TCP SYN:nmap -sS 192.168.145.135
Сканирования протокола UDP:nmap -sU 192.168.145.135
Сканирование протокола IP:nmap -sO 192.168.145.135
Сканирование выбранных портов (80, 25, 443):nmap -p 80,25,443 192.168.145.135
Сканирование диапазона портов 1024-2048:nmap -p 1024-2048 192.168.145.135
Обнаружение вида ОС:nmap -O --osscan-guess 192.168.145.135
В локальных сетях или просто имея на руках диапазон ip адресов, удобно проверить их на занятость с помощью ключей –sP (с указанием маски):nmap -sP 192.168.145.0/24
Ответ будет выглядеть так:Starting Nmap 7.60 ( https://nmap.org ) at 2017-08-14 13:38 PDT
Nmap scan report for localhost (192.168.145.2)
Host is up (0.0070s latency).
Nmap scan report for localhost (192.168.145.135)
Host is up (0.00015s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 2.68 seconds.
Таким образом, видим, что в локальной сети имеется 2 хоста. Времена ответов для них составляют, соответственно, 0,007 сек и 0,00015 сек.
Отметим, что в справочной системе по данной утилите, как уже говорилось, присутствуют и многие другие опции. Попробуйте поэкспериментировать самостоятельно, выбрав для себя 2…3 наиболее интересных, на Ваш взгляд, опций.
Более подробно работа утилиты nmap рассмотрена, например, в этой статье. Можете опробовать некоторые примеры из этой статьи.
Утилита ip a (ifconfig – аналог)
↑ К содержанию ↑Эта утилита дает информацию о сетевых интерфейсах (аналогичные программы будут выполнены Вами в Задании 2). Вот примерный результат ее работы:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST, MULTICAST, PROMISC,UP, LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fd:92:b9 brd ff:ff:ff:ff:ff:ff
inet 192.168.145.135/24 brd 192.168.145.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefd:92b9/64 scope link
valid_lft forever preferred_lft forever
Видим, что присутствуют два интерфейса: локальный (lo) и приватный (eth0).
Утилита ping
↑ К содержанию ↑Данная утилита позволяет проверить доступность хостинга (сервера) по его IP-адресу или по доменному имени, замеряя время отклика сервера. Например:
- Можно узнать IP-адрес по доменному имени.
- Можно узнать, работает ли сервер. Например, системный администратор может узнать, завис ли только веб-сервер или проблемы с хостом.
- Можно узнать, есть ли связь с сервером. Например, проблемы с настройкой DNS серверов на машине можно узнать, задав в ping сначала доменное имя, а потом IP-адрес.
- Также можно узнать качество канала, посмотрев, сколько ответов не пришло.
Примечание. В Windows есть аналогичная утилита.
Вот как ею пользоваться:
ping -w 5 45.33.32.156
или
ping -w 5 scanme.nmap.org
Вот что получится:
PING scanme.nmap.org (45.33.32.156) 56(84) bytes of data.
64 bytes from scanme.nmap.org (45.33.32.156): icmp_seq=1 ttl=128 time=262 ms
64 bytes from scanme.nmap.org (45.33.32.156): icmp_seq=2 ttl=128 time=234 ms
64 bytes from scanme.nmap.org (45.33.32.156): icmp_seq=3 ttl=128 time=243 ms
64 bytes from scanme.nmap.org (45.33.32.156): icmp_seq=4 ttl=128 time=238 ms
64 bytes from scanme.nmap.org (45.33.32.156): icmp_seq=5 ttl=128 time=242 ms
--- scanme.nmap.org ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 234.035/243.973/262.669/9.886 ms
Видим, что среднее время ответа сервера составляет примерно 240 мс. Чем выше это время, тем хуже доступен сервер.
Также видим, что 0% пакетов потеряно. Это говорит о том, что связь является надежной, передача сообщений происходит без потерь. В принципе, при таких условиях можно пользоваться не только протоколами ТСР, но и UDP.
У этой утилиты также есть опции, правда, список их не такой большой, как у nmap.
Утилита netstat
↑ К содержанию ↑Если она запущена без параметров, то в консоли показывается список ВСЕХ открытых сокетов. Как PF_INET, так и PF_UNIX. Который является огромным.
Вот наиболее интересные опции:
-а
- показывает как слушающие, так и не слушающие сокеты. Т.е. – все.-р
- показывает идентификатор и имя программы (точнее, процесса), создавшей сокет.-n
- показывает IP-адреса в числовом виде.
Вводим netstat -anp
Вот что выдается:
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp6 0 0 ::1:631 :::* LISTEN -
tcp6 1 0 ::1:52687 ::1:631 CLOSE_WAIT 2744/indicator-prin
tcp6 1 0 ::1:34102 ::1:631 CLOSE_WAIT -
udp 0 0 127.0.1.1:53 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp 0 0 0.0.0.0:18923 0.0.0.0:* -
udp 0 0 0.0.0.0:46638 0.0.0.0:* -
udp 0 0 0.0.0.0:631 0.0.0.0:* -
udp6 0 0 :::42413 :::* -
udp6 0 0 :::43576 :::* -
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 17123 2535/gnome-session @/tmp/.ICE-unix/2535
unix 2 [ ACC ] STREAM LISTENING 12296 - /run/uuidd/request
unix 2 [ ACC ] STREAM LISTENING 12045 - /var/run/acpid.socket
unix 2 [ ACC ] STREAM LISTENING 16786 - /tmp/ssh-fIKSCXpZO88v/agent.2535
unix 2 [ ACC ] STREAM LISTENING 15254 - @/tmp/.X11-unix/X0
unix 2 [ ACC ] SEQPACKET LISTENING 10286 - /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 114993 - /var/run/cups/cups.sock
unix 2 [ ACC ] STREAM LISTENING 37477 2926/gvfsd-trash @/dbus-vfs-daemon/socket-8ITR0Nme
unix 2 [ ACC ] STREAM LISTENING 37482 2926/gvfsd-trash @/dbus-vfs-daemon/socket-fu8EIKBR
unix 2 [ ACC ] STREAM LISTENING 18835 2926/gvfsd-trash @/dbus-vfs-daemon/socket-tHN7I8UR
… и т.д.
Видим, что приватного адреса вида 192.168.145.135 не показывается, вместо него – адрес 127.0.0.1. Что же касается многочисленных сокетов в домене UNIX, то это сокеты, используемые ОС без обращения к сети.
netstat -p –inet
Команда покажет активные соединения (по протоколам TCP, UDP) – только интернетные серверы, без внутренних соединений. Результат будет примерно таким:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 ubuntu:domain *:* LISTEN 1449/dnsmasq
tcp 0 0 localhost:ipp *:* LISTEN 3476/cupsd
udp 0 0 ubuntu:domain *:* 1449/dnsmasq
udp 0 0 *:bootpc *:* 19275/dhclient
udp 0 0 *:bootpc *:* 8530/dhclient
udp 0 0 *:18923 *:* 8530/dhclient
udp 0 0 *:46638 *:* 19275/dhclient
udp 0 0 *:ipp *:* 1444/cups-browsed
Утилита dig / nslookup
↑ К содержанию ↑Зная имя хоста с помощью DNS запроса (DNS lookup) можно узнать его IP. Но иногда нужно решить обратную задачу: узнать имя хоста для которого известен IP адрес. Это называется reverse DNS lookup, можно перевести как обратное DNS преобразование или обратный DNS запрос. Вообще, в сети есть соответствующие сервисы, которые можно применить для этой цели. Например, там по своему IP-адресу можно узнать хост своего интернет-провайдера (Билайн, Мегафон, МТС, Теле и т.д.). Но, как это сделать при помощи своего компьютера?
В Linux обратное DNS преобразование можно сделать с помощью команды dig
к которой добавлена опция -x
:
dig -x 185.117.153.79
В Windows и Linux также можно использовать команду nslookup
:
nslookup 185.117.153.79
Этот способ работает далеко не всегда. А лишь только, если в базе данных Reverse DNS (обратного DNS) присутствует PTR запись. PTR (pointer — указатель) запись сопоставляет IP адрес с доменным именем. Она часто называется "reverse DNS entry" (обратная DNS запись), поскольку она преобразовывает IP адрес в имя.
PTR записи преимущественно используются в мерах безопасности и предотвращения спама для верификации, что адрес почтового сервера разрешён для отправки email от имени конкретного хоста. По обратной DNS записи проверяется, действительно ли имя сервера ассоциировано с IP адресом, с которого было инициировано соединение.
Чтобы внести обратную DNS запись, которая бы связывала IP адрес (например, 185.117.153.79) с вашим доменом (например, site.com), вам нужно обратиться к вашему провайдеру IP адреса для создания PTR записи для конкретного IP адреса.
Утилита tcpdump
↑ К содержанию ↑Эта утилита выдает информацию о сетевом обмене Вашего компьютера (точнее, сетевого интерфейса, функционирующего на нем) с сетью в режиме реального времени. По смыслу – она напоминает Задание 3, только, в отличие от него, имеет гораздо более широкие возможности. Эта утилита имеет множество опций. Посмотрите их, набрав man tcpdump
. Основные опции:
-n
- Отключает преобразование IP в доменные имена. Если указано-nn
, то запрещается преобразование номеров портов в название протокола.-e
- Включает вывод данных канального уровня (например, MAC-адреса).-v
(-vv
или-vvv
) - Вывод дополнительной или еще более дополнительной информации (TTL, опции протокола IP).-w имя_файла
- Задать имя файла, в который сохранять собранную информацию.-r имя_файла
- Чтение дампа из заданного файла.-q
- Переводитtcpdump
в "бесшумный режим", в котором пакет анализируется на транспортном уровне (протоколы TCP, UDP, ICMP), а не на сетевом (протокол IP).-t
- Отключает вывод меток времени.-A
- дает возможность выводить в консоль не только заголовки протоколов IP/UDP/ТСР, но и данные, полученные с веб-сервера, в ASCII-виде. Это бывает очень полезно при отладке клиент-серверных приложений, когда необходимо посмотреть в консоли ответ сервера.-X
- выводит эти данные в 16-ричном виде.
Кроме того, в составе ее параметров могут быть логические операторы and
, or
, not
, т.е. можно комбинировать параметры, оформлять их в виде условий.
Для начала используйте команду sudo tcpdump -D
, чтобы увидеть, какие интерфейсы доступны для захвата. Вот что получилось у меня, к примеру:
1.enp0s3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.usbmon2 (USB bus number 2)
Видим, что под номером 2 имеется псевдоинтерфейс, обозначающий ВСЕ интерфейсы. Так вот, если использовать соответствующий параметр (any
), то утилита tcpdump
будет получать трафик со ВСЕХ интерфейсов.
any
, то утилита tcpdump будет получать не весь трафик. В частности, с локального интерфейса трафик получаться не будет. В этом несложно убедиться, запустив вначале tcpdump (на одной консоли), а затем - сделать ping 127.0.0.1
(на другой). Надо сказать, что это момент несколько ПОВЕРХНОСТНО оговорен в разного рода "руководствах" по этой утилите, в том числе и в ее так называемых мануалах.
Запуск утилиты для того, чтобы прослушивать ВЕСЬ сетевой трафик, осуществляется командой
sudo tcpdump -i any
Ключ -i
показывает что мы захватываем пакеты с определенного (хоть и псевдо) интерфейса.
Теперь можно запустить эту утилиту как обычно, т.е. без учета локального интерфейса. Запустим ее:
sudo tcpdump –v
Результат:
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:22:56.476188 IP6 (hlim 1, next-header UDP (17) payload length: 92) fe80::b96b:b3c0:2168:57f4.dhcpv6-client > ff02::1:2.dhcpv6-server: [udp sum ok] dhcp6 solicit (xid=1cb96f (elapsed-time 1500) (client-ID hwaddr/time type 1 time 473390577 00093bf01a40) (IA_NA IAID:520114262 T1:0 T2:0) (Client-FQDN) (vendor-class) (option-request DNS-search-list DNS-server vendor-specific-info Client-FQDN))
14:22:57.217596 IP (tos 0x0, ttl 64, id 35850, offset 0, flags [DF], proto UDP (17), length 118)
localhost.43108 > localhost.domain: 53116+ PTR? 2.0.0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.f.f.ip6.arpa. (90)
14:22:57.254212 IP (tos 0x0, ttl 128, id 48342, offset 0, flags [none], proto UDP (17), length 182)
localhost.domain > localhost.43108: 53116 NXDomain 0/1/0 (154)
14:22:57.254409 IP (tos 0x0, ttl 64, id 35851, offset 0, flags [DF], proto UDP (17), length 118)
localhost.56391 > localhost.domain: 9796+ PTR? 4.f.7.5.8.6.1.2.0.c.3.b.b.6.9.b.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa. (90)
14:22:57.299388 IP (tos 0x0, ttl 128, id 48343, offset 0, flags [none], proto UDP (17), length 170)
localhost.domain > localhost.56391: 9796 NXDomain 0/1/0 (142)
14:22:58.301471 IP (tos 0x0, ttl 64, id 36015, offset 0, flags [DF], proto UDP (17), length 72)
localhost.59184 > localhost.domain: 17408+ PTR? 2.145.168.192.in-addr.arpa. (44)
14:22:58.339264 IP (tos 0x0, ttl 128, id 48344, offset 0, flags [none], proto UDP (17), length 153)
localhost.domain > localhost.59184: 17408 1/1/2 2.145.168.192.in-addr.arpa. PTR localhost. (125)
14:22:58.339682 IP (tos 0x0, ttl 64, id 36017, offset 0, flags [DF], proto UDP (17), length 74)
localhost.38925 > localhost.domain: 23292+ PTR? 135.145.168.192.in-addr.arpa. (46)
14:22:58.372242 IP (tos 0x0, ttl 128, id 48345, offset 0, flags [none], proto UDP (17), length 155)
localhost.domain > localhost.38925: 23292 1/1/2 135.145.168.192.in-addr.arpa. PTR localhost. (127)
Видим, что, по сути, идет сетевой обмен локального хоста с «самим собой» при помощи протокола UDP.
Расшифруем основные названия:
listening on eth0
- прослушиваем интерфейс под названием eth0,14:22:56.476188
- метка времени: часы, минуты, секунды, микросекундыIP (tos 0x0, ttl 64, id 35850, offset 0, flags [DF], proto UDP (17), length 118)
- протокол IP и параметры его заголовка:tos
(type of service), это поле используется для назначения сетевой политики обслуживания пакета, т.е. задает желаемый вариант маршрутизации;ttl
(time-to-live) - время жизни пакета, не указывается, если оно равно нулю;id
(поле идентификации протокола IP);offset
(смещение фрагмента дейтаграммы);flags
(могут бытьMF
иDF
); + присутствует, если установлен флагMF
,DF
присутствует, если установлен флагF
. Если ни один из флагов не установлен, будет присутствовать . ;proto
(тип протокола);length
(общая длина заголовка). Далее могут идти опции протокола IP.localhost.43108
- открыт порт под номером 43108 на локальном хосте
А теперь, не прерывая работы утилиты, можно попробовать открыть в браузере какую-нибудь вебстраницу (или обновить ее). Посмотрите, что получится. Рассмотрим, что будет, если в заранее открытом браузере Firefox открыть страницу 4846d.ru
. Утилиту запустим со следующими параметрами:
sudo tcpdump -vnet
Так как объем информации, которой обмениваются браузер (точнее, сетевое соединение компьютера, которое использует браузер), открывающий страницу 4846d.ru
, является довольно большим (почти 18 кБ), ниже рассмотрим лишь ее фрагменты, сообщаемой утилитой tcpdump
, с их расшифровкой:
01:02:03:04:05:06 > 52:64:80:32:71:77, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Request who-has 10.0.2.2 tell 10.0.2.15, length 28
52:64:80:32:71:77 > 01:02:03:04:05:06, ethertype ARP (0x0806), length 60: Ethernet (len 6), IPv4 (len 4), Reply 10.0.2.2 is-at 52:64:80:32:71:77, length 46
Компьютер, имеющий МАС-адрес 01:02:03:04:05:06
, имеющий IP-адрес 10.0.2.15
, направляет запрос на компьютер, имеющий МАС-адрес 52:64:80:32:71:77
с помощью протокола ARP (сообщение имеет длину, равную 42 байта), используется сетевой протокол IPv4; запрос имеет следующий вид: какой МАС-адрес имеет узел с IP-адресом, равным 10.0.2.2
?
Компьютер с МАС-адресом 52:64:80:32:71:77
отвечает источнику запроса (т.е. компьютеру с МАС-адресом 01:02:03:04:05:06
) также при помощи протокола ARP, при помощи сетевого протокола IPv4, что IP-адрес, равный 10.0.2.2
, имеет компьютер с МАС-адресом 52:64:80:32:71:77
. Т.е. это - как раз тот самый компьютер, на который и был направлен запрос.
01:02:03:04:05:06 > 52:64:80:32:71:77, ethertype IPv4 (0x0800), length 68: (tos 0x0, ttl 64, id 34622, offset 0, flags [DF], proto UDP (17), length 54)
10.0.2.15.59127 > 10.0.0.1.53: 6707+ A? 4846d.ru. (26)
Компьютер, имеющий МАС-адрес 01:02:03:04:05:06
(с IP-адресом 10.0.2.15
, порт 59127
), направляет запрос на компьютер с МАС-адресом 52:64:80:32:71:77
(с IP-адресом 10.0.0.1
, порт 53
). Далее идет информация, касающаяся заголовков протокола IPv4, где, в частности, указано, что в качестве протокола транспортного уровня будет фигурировать UDP. А далее, после указания IP-адресов (с портами) источника и адресата указан id запроса, равный 6707
; симвод +
означает рекурсивный флаг. Длина запроса равна 26 байт, не включая заголовки UDP и IP протоколов. Символ А
означает адресную запись. Далее указан домен, на который был направлен запрос.
01:02:03:04:05:06 > 52:64:80:32:71:77, ethertype IPv4 (0x0800), length 417: (tos 0x0, ttl 64, id 27765, offset 0, flags [DF], proto TCP (6), length 403)
10.0.2.15.46038 > 37.140.192.59.80: Flags [P.], cksum 0xf35b (incorrect -> 0xc9d2), seq 150989406:150989769, ack 22218563, win 51120, length 363: HTTP, length: 363
GET / HTTP/1.1
Host: 4846d.ru
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Здесь мы видим уже ТСР-запрос на IP-адрес 37.140.192.59
и на стандартный порт 80
. Это - IP-адрес сервера, на котором расположена страница 4846d.ru
. Отметим, что так как эта страница была открыта в браузере ранее, IP-адрес сервера был известен браузеру, поэтому трафика с использованием ARP-протокола, связанного с обращением к серверам DNS и выяснением, какому именно IP-адресу соответствует такое доменное имя, может не быть. По той же причине может отсутствовать траффик, вызванный "тройным рукопожатием" браузера и сервера.
Далее, анализируя транспортный трафик, видим, что браузер с порта 46038
передает на сервер с IP-адресом 37.140.192.59
флаг РUSH
, контрольную сумму, номер последовательности 150989406
, содержащей 150989769-150989406 = 363
байт данных. Это - данные, записанные в формате протокола НТТР. Ну, а дальше - сразу же идут эти данные, представляющие собой HTTP-заголовки запроса браузера, плюс байты, обозначающие пропущенную строку (что, как мы уже знаем, обозначает конец заголовков).
Обратите внимание, что длина сообщения IP-протокола составляет 417 байт, ТСР-протокола - 403 байта, а НТТР-протокола - только 363 байта. Т.е. 417 > 403 > 363. Это - следствие инкапсуляции заголовков протокола друг в друга (более высокоуровневые инкапсулируются в менее высокоуровневые). Понаблюдайте за такой последовательностью длин сообщений протоколов разных уровней во всем трафике утилиты tcpdump
.
Далее сервер отправляет подтверждение принятых заголовков:
52:64:80:32:71:77 > 01:02:03:04:05:06, ethertype IPv4 (0x0800), length 60: (tos 0x0, ttl 64, id 406, offset 0, flags [none], proto TCP (6), length 40)
37.140.192.59.80 > 10.0.2.15.46038: Flags [.], cksum 0x0c79 (correct), ack 363, win 65535, length 0
Затем браузер начинает поочередно делать GET-запросы для скачивания файлов CSS
, JS
, фавиконки.
Tcpdump и процесс "тройного рукопожатия"
Все-таки, рассмотрим процесс "тройного рукопожатия" клиента (точнее, браузера) и сервера на конкретном примере. Чтобы избежать путаницы, сделаем такие фильтры для утилиты tcpdump
, которые помогут избежать вывода излишней информации:
~$ sudo tcpdump -c 9 -i enp0s3 -nS host 4846d.ru
Здесь 9
– максимальное число захватываемых (и выводимых на экран) пакетов, после чего работа утилиты останавливается; enp0s3
– имя сетевого интерфейса (для того, чтобы его узнать, используйте другие сетевые утилиты, например, ip a
. Впрочем, имя сетевого интерфейса будет показано и при запуске tcpdump
, в самом начале, так что его можно подсмотреть и там.
eth0
. Сейчас же они несколько изменены. Впрочем, имя сетевого интерфейса можно легко изменить.Примечание 2. Число захватываемых пакетов – 9 – выбрано с запасом. В идеале, остаточно было бы трех пакетов (ибо «рукопожатие» - тройное). Но, могут наблюдаться разные нюансы, поэтому не всегда логическое соединение устанавливается в течение трех сообщений. Здесь – и качество сетевого соединения, и излишняя, иной раз, «поспешность» браузера… - см. ниже.
После чего в браузере обновим главную страницу сайта 4846d.ru
. Итак, посмотрим, что получится:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
- 00:23:53.836734 IP 10.0.2.15.46102 > 37.140.192.59.80: Flags [S], seq 2435731096, win 29200, options [mss 1460,sackOK,TS val 86332015 ecr 0,nop,wscale 7], length 0
- 00:23:53.876586 IP 10.0.2.15.46104 > 37.140.192.59.80: Flags [S], seq
4158226518
, win 29200, options [mss 1460,sackOK,TS val 86332055 ecr 0,nop,wscale 7], length 0 - 00:23:53.876842 IP 10.0.2.15.46106 > 37.140.192.59.80: Flags [S], seq 3298150341, win 29200, options [mss 1460,sackOK,TS val 86332056 ecr 0,nop,wscale 7], length 0
- 00:23:53.898238 IP 37.140.192.59.80 > 10.0.2.15.46102: Flags [S.], seq
11328001
, ack2435731097
, win 65535, options [mss 1460], length 0 - 00:23:53.898268 IP 10.0.2.15.46102 > 37.140.192.59.80: Flags [.], ack
11328002
, win 29200, length 0 - 00:23:53.966816 IP 37.140.192.59.80 > 10.0.2.15.46106: Flags [S.], seq 11392001, ack 3298150342, win 65535, options [mss 1460], length 0
- 00:23:53.966881 IP 10.0.2.15.46106 > 37.140.192.59.80: Flags [.], ack 11392002, win 29200, length 0
- 00:23:53.966963 IP 37.140.192.59.80 > 10.0.2.15.46104: Flags [S.], seq 11456001, ack
4158226519
, win 65535, options [mss 1460], length 0 - 00:23:53.966999 IP 10.0.2.15.46104 > 37.140.192.59.80: Flags [.], ack 11456002, win 29200, length 0
- 9 packets captured
- 13 packets received by filter
- 0 packets dropped by kernel
Рассмотрим детально информацию, выдаваемую этой утилитой. Слева видим временные метки (см. выше). Видим, что браузер послал первый запрос в момент времени 00:23:53.836734
. Прождав сколько-то микросекунд, не получив ответа и, наверное, посчитав, что сервер этот запрос не получил, браузер посылает следующий запрос в момент времени 00:23:53.876586
. И, вновь не дождавшись ответа, браузер посылает уже ТРЕТИЙ запрос, делая уже третью попытку соединиться с сервером. Тот, наконец-то, лишь после третьей попытки, ответил браузеру в момент времени 00:23:53.898238
.
После временных меток, идут обозначения IP, т.е. работает протокол IP. В первых трех строчках направляется запрос с нашего адреса (10.0.2.15
) на адрес хоста (37.140.192.59
), как обычно, на открытый сервером по умолчанию порт 80. Это браузер делает запрос на сервер, пытаясь установить логическое соединение. В четвертой строчке, наоборот, сервер отвечает браузеру. И т.д.
После двоеточия в каждой строчке видим ключевое слово Flags
- флаги. Сами они перечислены далее в квадратных скобках. В строчках 1…3 передается флаг SYN
(обозначается как S
). Затем идет номер последовательности (seq
); браузер выбрал его равным 2435731096
. Размер окна данных (win
) установлен равным 29200 Байт.
Обратим внимание, что при очередной попытке браузера установить соединение он посылает каждый раз НОВЫЙ номер последовательности: вначале 2435731096
, затем 4158226518
и, наконец, 3298150341
.
В 4-й строчке мы можем наблюдать долгожданный ответ сервера только лишь на ПЕРВЫЙ(!) запрос браузера об установлении соединения. Это видно по тому, что сервер передал acknowledgement (ack), равный 2435731097
, что представляет номер последовательности 2435731096
, переданный браузером в самом первом запросе, увеличенный на 1. При этом сервер, в рамках алгоритма «тройного рукопожатия», передал браузеру свой номер последовательности, равный 11328001
. Сервер также посылает флаг SYN
, что означает его готовность к установлению логического соединения и флаг АСК
(обозначаемый точкой - .
). Сообщение было отослано на порт 46102
, который был открыт браузером при отсылке самого первого сообщения (см. 1-ю строчку).
АСК
и номера подтверждения аск
. Ибо это - разные вещи, хотя и связанные по смыслу: как флаг подтверждения ACK
, так и номер подтверждения фигурируют в заголовке ТСР-протокола.
В 5-й строчке браузер передает флаг АСК
(обозначаемый точкой) и номер последовательности сервера, увеличенный на 1, т.е. число 11328002
. Используется также порт 46102
. Итак, после получения браузером этого сообщения логическое соединение, инициированное в 1-й строчке, считается установленным.
В 6-й строчке сервер дает ответ на 3-е сообщение браузера, аналогичный данному в 4-й строчке (на 1-е сообщение): он посылает браузеру ack 3298150342
.
Самое интересное, что браузер подтвердил и этот ответ сервера – в 7-й строчке, послав серверу подтвердение АСК
и флаг ack 11392002
(что на 1 больше, чем принятый от сервера seq 11392001
, присутствующий в 6-й строчке). Сообщение от сервера в этот раз пришло на порт 46106
, а ведь именно его открыл браузер при посылке серверу сообщения в 3-й строчке.
В 8-й строчке сервер, наконец-то, отвечает на… ВТОРОЕ сообщение браузера, т.е. на 2-ю строчку. Видим, что сервер прислал ему ack 4158226519
, что на 1 выше, чем 4158226518
. Также сервер прислал свой номер последовательности seq 11456001
и флаги SYN, ACK
.
На что браузер, в 9-й строчке, подтвердил и это логическое соединение, прислав серверу флаг АСК
, подтверждение ack 11456002
, большее на 1.
Таким образом, можно констатировать, что:
- Браузер последовательно отправил три запроса об установлении соединения по номерам портов сокетов, соответственно,
46102, 46104, 46106
. - На момент отправления браузером сообщения из 9-й строчки установлено ТРИ логических соединения между ним и сервером по открытым портам сокетов с номерами
46102, 46106, 46104
(в хронологическом порядке установления соединений). Таким образом, второе соединение, будучи инициированным ранее третьего, установилось уже после него. - Размер передаваемых данных равен 0, так как пока не идет речь об их передаче: происходит лишь установление трех логических соединений, передаются лишь заголовки протоколов ТСР с незаполненными полями данных.
- После установления соединений браузер будет использовать их для выполнения, например, GET-запросов, чтобы скачать с сервера html-код, а также иные ресурсы (CSS, JS и др.). В рамках этих запросов будут передаваться совокупности байтов, синтаксически форматированных по стандарту протокола HTTP. И вот тогда-то размер передаваемых данных будет отличен от нуля.
Поле данных протокола ТСР, содержащее в себе HTTP-запрос браузера, будет содержать:
- Строку запроса (например,
GET / HTTP/1.1
), - Заголовки протокола НТТР,
- Пустую строку (сигнализирующую сервера конец сообщения браузера).
Далее, разберем оставшиеся параметры (опции) сетевых запросов браузера и ответов сервера. В 1-й строчке мы видим:
win
- количество байтов данных, ожидаемых отправителем данного, начиная с байта номер которого указан в поле подтверждения ack
. Для оптимизации передачи отправитель не ждет подтверждения для каждого отправленного сегмента, а может отправить в сеть группу сегментов (но в байтах не больше размера окна). Если качество канала плохое (много запросов на повторную передачу, теряются подтверждения) окно уменьшается в размере, если хорошее — окно увеличивается.
options [mss 1460,sackOK,TS val 86332015 ecr 0,nop,wscale 7]
Опция mss
(Maximum Segment Size) определяет максимальное количество байт, которое может быть получено источником сообщения в одном сегменте.
sackOK
(Selective Acknowledgement) позволяет обоим участникам соединения принимать байтовые диапазоны. Обычно механизм подтверждения позволяет лишь подтвердить, что получатель имеет все данные, вплоть до специфического номера байта. В ответах сервера этот параметр отсутствует, вероятно, данный механизм не используется.
TS val / ecr
используются TCP-протоколом для оценки примерного времени обработки запроса (round-trip time - RTT
). TS val
– это временная метка отправителя, а ecr – временная метка ответа, которая обычно представляет собой последнюю временную метку, полученную отправителем. Протокол TCP использует RTT
для контроля правильности передачи.
В 1-й строчке браузер передал TS val 86332015, ecr 0
. При последующих запросах браузер передавал увеличивающиеся метки времени. Вообще-то, в процессе обмена сообщениями браузера с сервером их временные метки (параметры val
и ecr
) должны бы меняться местами, что дополнительно будет подтверждать корректность получения сообщений. В данном случае, такой обмен почему-то не наблюдается.
Опция wscale
представляет собой фактор шкалы окна. Например, если wscale
= 7, win
=29200 Байт, это означает, что браузер (см. 1-ю строчку) сообщает серверу, что максимальный размер его (браузера) буфера равен 7*29200 = 204400 Байт. Т.е. он может принять не более, чем 204400 Байт данных за один раз.
length
– это длина сообщения (НТТР-запроса или ответа) в байтах. Включая и символы перевода строк. Сообщение в формате протокола HTTP содержится в поле данных протокола ТСР.
Самостоятельное задание:
Запустите утилиту, почти как было указано выше:
sudo tcpdump -vne
Обновите страницу сайта. После этого прервите работу утилиты (
Ctrl + C
) и найдите в консоли сообщения, относящиеся в первому успешному "тройному рукопожатию". Поясните, что там происходило, какие параметры использовались и почему.
Утилита arp
↑ К содержанию ↑Утилита arp используется для преобразования IP-адресов в адреса физической сети, к которой подключен компьютер, например, Ethernet или Wifi. Суперпользователь (администратор) может добавлять и удалять аrp записи. Вот пример информации, выдаваемой этой утилитой:
arp –a
Результат:
localhost (192.168.145.254) at 00:50:56:ff:af:31 [ether] on eth0
localhost (192.168.145.2) at 00:50:56:fa:44:ec [ether] on eth0
localhost (192.168.145.1) at 00:50:56:c0:00:08 [ether] on eth0
Видим, что на данный момент в ОС имеется 3 приватных хоста на одном интерфейсе.
Заключение
↑ К содержанию ↑Вот, пожалуй, основные утилиты по работе с сетевыми интерфейсами и сетью в Linux. В Windows есть аналогичные утилиты – многие из них даже совпадают по названию и функциональности.
На самом деле, утилит по управлению сетью и ее конфигурированию – гораздо больше. Но, мы с Вами остановимся лишь на вышеизложенных, ибо они нам пригодятся для анализа результатов работы программ, которые Вы напишете самостоятельно, в рамках Заданий 2, 3.
Итак, освоив работу с сетевыми утилитами ОС Linux, можно перейти к самостоятельной разработке программ, представляющих собой упрощенные аналоги (естественно, с весьма и весьма урезанным функционалом) этих утилит. Переходим к Заданию 2.
С уважением, Салимоненко Д.А.