Сети и Linux

"Короче, в чём заключаются основы настройки и оптимизации производительности сети?
- Ну, во-первых, нужно закрыть все окна браузера. Во-вторых, поменять DNS-серверы. И в-третьих, выключить компьютер.
(С) Балабоба, искусственный интеллект Яндекса.

"Когда дело доходит до сетевых возможностей, трудно представить что-то, что было бы невозможно для Linux"
(C) Уильям Шоттс, "Командная строка Linux".
Kandinsky 2.1: Linux во всемирной сети - узлах, серверах, датацентрах.
Kandinsky 2.1: Linux во всемирной сети - узлах, серверах, датацентрах.

Самой простой командой Linux, с которой каждый желающий может начать увлекательное путешествие в мир компьютерных сетей, является ping. Она позволяет проверить доступность узла в сети и оценить время, затраченное на передачу пакетов между узлами. Например, можно написать: ping ya.ru и увидеть как специальные сетевые пакеты, называемые icmp_seq, отсылаются указанному сетевому узлу и возвращаются от него обратно отправителю. Из-за этой особенности такие посылки ещё называются эхо-запросами. Выполнение команды завершается нажатием клавиш Ctrl+c.

Использование команды ping для отправки эхо-запросов.
Использование команды ping для отправки эхо-запросов.

В выводе команды содержится число отправленных пакетов (packets transmitted), полученных (received), процент потерянных (packet loss), общее время работы (time), минимальное, среднее, максимальное время и квадратичное отклонение (rttmin,avg,max и mdev). Также указано максимальное количество IP-маршрутизаторов, на которое передаётся пакет (значение ttl).

Пакеты - это порции данных, подготовленные для передачи по сети. Они состоят из заголовка и полезной нагрузки. Заголовок содержит служебную информацию - адреса отправителя и получателя, используемый протокол и т.д. Полезная нагрузка - это сами данные, которые требуется передать или получить. Протоколы представляют собой наборы правил, которые определяют формат передаваемых пакетов, способ их синхронизации, методы обнаружения и исправления ошибок в них. Отправитель и получатель - узлы сети (nodes). Узел - любое устройство в сети. В зависимости от выполняемых ими функций узлы могут иметь свои особые названия. Например узлы сети, которые имеют адреса, называются хостами (hosts). У хостов помимо адреса, например 77.88.55.242, могут быть имена, например ya.ru. Узлы, соединяющие две сети - шлюзы (gateways). Узлы, определяющие оптимальный маршрут передачи пакетов между сетями - маршрутизаторы (routers). Узлы, которые предоставляют услуги другим устройствам в сети (хранение и совместное использование файлов, управление базами данных, веб-хостинг и т.д.) называются серверами.

Из чего состоят пакеты, формируемые командой ping. ICMP-посылка находится внутри более общей структуры, построенной по правилам IP-протокола
Из чего состоят пакеты, формируемые командой ping. ICMP-посылка находится внутри более общей структуры, построенной по правилам IP-протокола

Пакет icmp_seq, известный так же как "пинг-пакет" содержит данные, структурированные по протоколу ICMP (Internet Control Message Protocol). Он начинается с IP-заголовка (IP header). Это означает, что в конечном счёте этот пакет формируется в соответствии с протоколом IP (Internet Protocol). Вслед за IP-заголовком идёт заголовок ICMP посылки, в котором указаны её тип (type), дополнительная информация (code), контрольная сумма (checksum) и некоторый контент различной длинны. Далее идут непосредственно данные, размер которых зависит от параметров указанных при запуске команде ping.

Сетевые команды выступают в роли интерфейса для взаимодействия человеком с узлами сети по определённым протоколом. Эти протокольные междуморды сами в свою очередь опираются на интерфейс системных вызовов и функций библеотек языка Си.

Kandinsky 2.1: Междуморда протокольная
Kandinsky 2.1: Междуморда протокольная

Исследовать детали этих взаимодействий можно как обычно, с помощью команды strace. Команда ping создаёт ICMP-посылку, упаковывает её в IP-пакет и отправляет по назначению. Для лучшего понимания её работы наберём: strace -e trace=network ping 127.0.0.1 -c 1 -4.

Исследование работы программы ping с помощью команды strace
Исследование работы программы ping с помощью команды strace

127.0.0.1 - это IP-адрес виртуального хоста, который является тем же самым устройством, на котором запускается сама команда.
Первыми в выдаче strace идут системные вызовы socket(), которые создают сокеты типа DGRAM для протоколов ICMP и IP, а после знака "=" указаны номера соотвествующих файловых дескрипторов: 3 и 4.

Сокет (socket) - это механизм взаимодействия между двумя программами, работающими на одном компьютере или на разных узлах сети. В Linux доступ к сокетам реализован с помощью дескрипторов, похожих на дескрипторы обычных файлов, но вместо указания на блоки с фактическими данными на диске, они выступают как конечные точки для обмена данными процессов между собой и с сетью. Существуют различные типы сокетов, одним из которых является сокетом дейтаграм (DGRAM). Это сетевые сокеты и они используются в Linux службами для прослушивания сети и обмена дейтаграмами (порциями информации, состоящими из заголовка и блока данных). При передаче по сети дейтаграмы включаются в качестве полезной нагрузки внутрь пакетов (инкапсулируются в пакеты). В результате получаются дейтаграмные пакеты, каждый из которых несёт в себе IP-адрес (указывающий узел назначения) и номер порта (идентифицирующий приложение которому предназначена информация). Этого достаточно для попадания в пункт назначения без предварительного создания заранее определенного маршрута. Поэтому службы дейтаграмм считаются не имеющими соединения.

Kandinsky 2.0: Сокеты дейтаграм
Kandinsky 2.0: Сокеты дейтаграм

Следующий системный вызов connect(). Он получает в качестве аргумента дескриптор 4 для, того чтобы подключиться к UDP-порту с номером 1025 на целевом хосте с адресом 127.0.0.1. Порты дополняют сетевые адреса. Сетевой адрес соответствуют узлу сети, а порт идентифицирует соединение внутри этого узла с конкретным приложением. Это позволяет общаться по одному и тому же адресу к различным приложениям. UDP (User Datagram Protocol) - тот самый протокол, по правилам которого формируются дейтаграмы.

Kandinsky 2.0: Пакеты прибывают в порты
Kandinsky 2.0: Пакеты прибывают в порты

Дальше происходит системный вызов getsockname(). Он необходимый для получения адреса хоста, к которому привязан сокет с дескриптором 4. Потом идёт серия системных вызовов setsockopt(), которые выполняют различные настройки сокета для протокола ICMP.
И вконце-концов дело доходит до системных вызовов sendto() и recvmsg(), которые используются для отправки IP-пакета (со встроенной в него дейтаграмой) на целевой хост и последующего получения ответа от целевого хоста.

Создать сеть - это значит установить соединения между устройствами и обеспечить пересылку данных между ними. Чтобы понять, как это должно работать, необходимо задать два главных вопроса:
- Каким образом компьютер, отправляющий данные, знает, куда их отправлять?
- Когда компьютер-адресат получает данные, как он догадывается о том, что он только что получил?
Каждый из этих вопросов при детальном рассмотрении можно разбить на более простые и конкретные вопросы, затрагивающие отдельные аспекты работы сети - как происходит отправка, получение, идентификация данных и т.д. Инженеры, находя ответы на эти вопросы, группируют их в слои, расположенные один над другим. Такие структуры называются сетевыми уровнями взаимодействия.

Уровни сетевого взаимодействия OSI, TCP/IP и связанные с ними протоколы
Уровни сетевого взаимодействия OSI, TCP/IP и связанные с ними протоколы

Один из наиболее известных вариантов - модель взаимодействия открытых систем (OSI). Она состоит из 7 слоёв:

  1. Физический (Physical layer), отвечает за физическое подключение устройства к сети. Определяет тип линии связи, вид несущего сигнала и способы его модуляции, разъёмы и прочие вещественные детали сети.
  2. Канальный (Data Link layer), подготавливает информацию к сетевому обмену, разбивая её на кадры во время передачи и преобразуя их обратно во время приёма.
  3. Сетевой (Network layer), маршрутизирует данные в сети.
  4. Транспортный (Transport layer) , обеспечивает последовательность и целостность передачи данных.
  5. Сеансовый (Session layer), устанавливает и завершает сеансы между приложениями.
  6. Представительный (Presentation layer), обеспечивает шифрование и дешифровку данных, а также их преобразование в удобный для приложений формат.
  7. Прикладной (Application layer), обеспечивает интерфейс между приложениями и процессами сетевого взаимодействия.

Любая подобная модель - не догма, а как сказали бы классики, "руководство к действию". Поэтому на практике наибольшее распространение получила модель с меньшим числом слоёв - TCP/IP. Её разработчики решили, что четыре уровня будет в самый раз. А именно: уровня сетевого интерфейса (Network Interface), межсетевого (Intenet) и транспортного (Transport) уровней, а также уровня приложений (Application).

Данные передаются между слоями как по конвейеру, на каждом участке которого различные участники выполняют над ними определённые протоколами операции. На каждом уровне единица информации имеет собственное название. Для физического уровня это бит. Для более высоких уровней уже используются более сложные единицы, называемые в общем протокольными блоками данных (protocol data unit, pdu). Они отличаются друг от друга содержанием служебной информации,определяемой конкретным протоколом, поэтому pdu имеют также свои названия. Для уровня данных такая единица - кадр (фрейм), для сетевого уровня - пакет, для транспортного уровня - сегмент (если используется протокол TCP) или дейтаграмма (если используется протокол UDP), для более высоких уровней - сообщение.

Структура кадра Ethernet. Он как главная матрёшка - содержит в себе все структуры более высоких уровней сетевого взаимодействия.
Структура кадра Ethernet. Он как главная матрёшка - содержит в себе все структуры более высоких уровней сетевого взаимодействия.

При передаче данные перемещаются сверху вниз. Сообщение оборачивается в сегмент (или дейтаграмму), сегмент (или дейтаграма) оборачивается в пакет, пакет оборачивается в кадр. А кадр отправляется в сетевое оборудование для того, чтобы там побитово превращаться в ту или иную форму физических сигналов, пригодных для передачи по линиям связи. Наиболее распространенное сетевое оборудование опирается на технологию Ethernet, поэтому и кадры как правило формируются в соответствии с требованиями этой технологии и называются Ethernet-кадры. При приёме всё происходит в обратном порядке.

Другой простой и часто используемой в Linux командой для исследования состояния сети явялется traceroute. Она выводит список всех "переходов" (hops) которые совершает пакет при путешествии по сети до указанного узла назначения. Например, можно посмотреть как проходит маршрут пинг-пакета до хоста с именем ya.ru:
traceroute -I ya.ru

Вывод traceroute, параметр -I указывает команде формировать пакеты с ICMP посылками внутри, по умолчанию формируются UDP-пакеты.
Вывод traceroute, параметр -I указывает команде формировать пакеты с ICMP посылками внутри, по умолчанию формируются UDP-пакеты.

Команда traceroute отправляет пакет с временем жизни (TTL) равным 1 и смотрит адрес ответившего узла. Затем отправляет пакет с TTL=2, 3 и т.д. пока не достигнет конечного пункта назначения. Время прохождения пакета туда и обратно фиксируется. Некоторые узлы могут не отвечать на сервисные пакеты, тогда на против них будут отображаться символы *. Так происходит, когда пакет попадает в шлюзы, настройки которых запрещают высылать ICMP пакеты с сообщением "time exceed", либо TTL таких пакетов слишком мал. Трассировка может использоваться для обнаружения обрыва в цепочке маршрутизаторов. Также можно с помощью неё попытаться определить использование подсетей провайдером, если протрассировать разные хосты и выделить из выдачи одинаковые начальные IP-адреса, это и будет информация о том, откуда вы получаете доступ к внешней сети.

Также в арсенале Linux для исследователя сетей имеется гибрид команды ping и traceroute - mtr. Эта команда постоянно опрашивает указанный хост, позволяя отслеживать изменения задержки и производительности. Например: mtr ya.u. Прервать выполнение можно сочеанием клавиш Ctrl+c.

Вывод команды mtr
Вывод команды mtr

Обе эти команды работают с IP-пакетами, т.е. на межсетевом уровне (Internet) и не имеют прямого доступа к более низким уровням модели TCP/IP. Однако в конечном счёте за передачу и приём информации отвечает уровень сетевого интерфейса, который ничего не знает о IP-пакетах, они для него являются частью полезной нагрузки внутри Ethernet-кадра. Как же тогда практически решается задача доставки пакетов по назначению? Для этого был создан протокол ARP (Adress Resolution Protocol, протокол преобразования адресов). Он применяется для построения таблиц соответствия IP-адресов аппаратным адресам устройств Ethernet (MAC-адресам). Ядро Linux поддерживает в оперативной памяти таблицу ARP (ARP-кэш) с соответствующими парами адресов автоматически (динамические записи), однако их можно вносить и самостоятельно (статические записи). Для этого в Linux присутствует команда arp. Вызов команды arp с параметром -a отобразит содержимое ARP-кэша, используя параметр -s можно добавить запись, параметр -d позволяет удалить запись.

Вывод ARP-таблицы командой arp -a и чтением файла /proc/net/arp
Вывод ARP-таблицы командой arp -a и чтением файла /proc/net/arp

Если кэш не содержит адреса назначения, в сеть отправляется широковещательный ARP-запрос (ARP request), который поступает всем хостам локальной сети (подсетям) . Тот хост, который имеет указанный в запросе IP-адрес, высылает ответ (ARP response), указывая свой MAC-адрес. Когда адрес назначения находится в другой подсети, задача протокола ARP сводится к определению MAC-адреса какого-либо маршрутизатора, ведущего в эту продсеть. Маршрутизатор хранит свои собственные ARP-таблицы, по которым определяет, какая из подсетей является назначением для поступающих пакетов. Получив пакет, который требуется переправить в другую подсеть, маршрутизатор отправляет в эту подсеть собственный ARP-запрос, чтобы выяснить какое устройство там обладает соответствующим IP-адресом. Получив от него MAC-адрес, маршрутизатор пересылает ему данный пакет.

Процесс получения MAC-адреса
Процесс получения MAC-адреса

В сети Internet пакету, чтобы достигнуть точки назначения, как правило требуется пройти множество хостов и маршрутизаторов. Каждому из этих устройств нужно знать куда передавать пакет дальше, поэтому они поддерживают таблицы маршрутов. Посмотреть содержимое этой таблицы на компьютере можно с помощью команды route. Более подробную информацию можно также получить с помощью команды routel.

Вывод команд route и routel
Вывод команд route и routel

Target - целевой IP-адрес, gateway - IP-адрес шлюза, source - IP-адрес отправителя. Также присутствует название сетевого интерфейса (столбец dev).

Также информацию о маршрутизации позволяет получить команда ip c параметром route. Строка default означает маршрут пакетов по умолчанию, а IP-адрес после слова via указывает на шлюз, через который они пойдут. После слова dev отображается название сетевого интерфейса через который доступен шлюз по умолчанию. Запись proto static сообщает, что маршрут был установлен администратором, а kernel, что его установило ядро. Адрес 192.168.1.1 - это мой маршрутизатор, 192.168.1.0 - это адрес моей подсети. Он образуется логическим разбиением IP-адреса с помощью сетевой маски на префикс сети и адреса хостов. В выводе команды ip route маска записана в нотации CIDR (Classless Inter-Domain Routing, бесклассовая междоменная маршрутизация), которая выглядит так: /8, /16, /24 и т.д. Число после слеша означает количество первых бит IP-адреса, зарезервированных под адрес сети. Остальные адреса могут принадлежать хостам.

Вывод команды ip route.
Вывод команды ip route.

Маску можно записывать и в виде точечно-десятичной нотации, подобно IP-адресу и представлять в двоичной форме, например в точечной нотации: 255.255.255.0 - четыре числа от 0 до 255, разделённые точками, называются октетами (потому что такой диапазон чисел занимает 8 бит памяти, другое название - байт). В двоичную форму эту запись можно перевести с помощью калькулятора командной строки bc. Эта программа поддерживает помимо прочего операции в различных системам счисления (двоичные, десятеричные, шестнадцатеричные).
Пример:
echo "obase=2;ibase=10;255;255;255;0" | bc

Перевод  из десятичной системы счисления в двоичную с помощью калькулятора bc.
Перевод из десятичной системы счисления в двоичную с помощью калькулятора bc.

Параметр obase задаёт систему исчисления в которую будут переведены входные значения, ibase указывает в какой системе исчисления задаются входные значения.

При переводе из десятичной точечной нотации в двоичную систему получилась запись вида 11111111.11111111.11111111.00000000. Количество единиц в ней равно 24, именно такое значение и будет эквивалентно записи префиксной маски: /24. Применяя её к какой-либо ести, например 192.168.1.0/24 мы сообщаем, что первые три октета IP адреса необходимо интерпретировать как префикс подсети (от слов pre fix, т.е. предварительно зафиксированный, неизменный), а оставшийся октет отводится под адреса хостов в этой подсети. Это значения, который могут меняться от 0 до 255. При этом значения 0 и 255 зарезервированы для особого применения. Значение 0 используется для обозначения адреса данной подсети, а значение 255 является широковещательным адресом, который используется для рассылки пакетов всем хостам данной подсети. Итого получается 254 доступных адреса.

Если нужно больше, можно перераспределить адреса с помощью маски, например отведя для хостов не один, а два октета: 192.168.0.0/16. Такая запись означает, что первые 16 бит адреса используются для определения подсети, а оставшиеся 16 бит для определения хостов этой подсети. Максимальное количество хостов такой подсети будет равно 2^16 -2, т.е. 65534 хоста.

Задание IP-адреса и маски позволят однозначно опрделить границы подсети выполнив между ними побтовое умножение (логическую операцию "И"). GNU bc не умеет этого делать, поэтому здесь можно воспользоваться арифметическими возможностями самого bash:
echo $((192&255)).$((168&255)).$((1&255)).$((106&0))

Пример получения границы подсети с помощью побитовой операции "AND" (логического умножения) IP-адреса на маску.
Пример получения границы подсети с помощью побитовой операции "AND" (логического умножения) IP-адреса на маску.

Другие поддерживаемые bash побитовые операции: "OR" (используется знак "|"), "NOT" (знак "~"), "XOR" (знак "^").

Для построения локальных подсетей (Loacl Area Network, LAN) можно назначать любые диапазоны адресов, но принято использовать выделенные для частныех сетей:
-10.0.0.0 - 10.255.255.255, маска подсети 255.0.0.0
-100.64.0.0 - 100.127.255.255, маска подсети 255.192.0.0
-172.16.0.0 - 172.31.255.255, маска подсети 255.240.0.0
-192.168.0.0 - 192.168.255.255, маска подсети 255.255.0.0

Тем хостам, которые должны быть доступны в глобальной сети (World Area Network, WAN) присваиваются публичные IP адреса. Их выдача контролируется различными организациями, начиная от международной некоммерческой организации ICANN (Internet Corporation for Assigned Names and Numbers) и заканчивая интернет-провайдерами.

Пакеты, идущие с частных IP-адресов или на них, сами по себе не проходят дальше магистральных маршрутизаторов. Чтобы хосты с частными IP-адресами имели доступ к глобальной сети используются различные специальные технологии- прокси-сервера, трансляция сетевых адресов (NAT), сетевые туннели (VPN).

Но что это за сеть 169.254.0.0, маршрут к которой показала команда ip route? Есть такие IP-адреса, которые зарезервированы под особые нужды. Например сеть 127.0.0.0/8 (loopback - петля на себя) используется для проверки работоспособности программных компонентов системы, отвечающих за сеть. Независимо от наличия физического подключения к сети, адреса из этого диапазона должны отвечать на запросы команды ping. А сеть 169.254.0.0/16 используется Linux для работы службы APIPA (Automatiс Private IP Adressing). Данная служба выбирает для компьютера IP-адрес из диапазона сети 169.254.0.0/16, если не удалось получить другой адрес от DHCP-сервера или из сетевых настроек.

Процесс получения сетевых настроек по протоколу DHCP
Процесс получения сетевых настроек по протоколу DHCP

DHCP - протокол динамического конфигурирования хостов (Dynamic Host Configuration Protocol), описанный в документах RFC 2131 и RFC 2132. Он определяет, как устройства могут автоматически получить IP-адрес, адрес сетевого шлюза, сетевую маску, имя хоста и другие сетевые параметры. Данный протокол имеет клиент-серверную архитектуру. Чтобы сетевые устройства (клиенты) могли получить необходимые сведения по запросу, им должен быть доступен в сети DHCP-сервер, которые умеет отвечать на такие запросы. Для запроса и ответа используется транспортный протокол UDP.

Обычно DHCP-сервер принимает запросы в порт 67, а клиенты должны ожидать прибытия ответов в порт 68. Однако можно установить и другие номера. Клиент выбирает такой порт со своей стороны, который в это время свободен, а соединяется практически всегда с каким-либо хорошо известным портом на стороне сервера. Узнать, какие порты зарезервированы в системе для различных сервисов можно прочитав файл
/etc/services. Программы, настраивающиеся на работу в сети используют этот файл в связке с функцией getportbyname().

Получение списка служб, которые могут использовать клиентские приложения, номеров портов и соответствующих протоколов транспортного уровня
Получение списка служб, которые могут использовать клиентские приложения, номеров портов и соответствующих протоколов транспортного уровня

Порты могут быть открыты или закрыты, это используется такими программами как брандмауэр (межсетевой экран) для управления потоком данных (трафиком). Например, брандмауэр может быть настроен так, чтобы закрывать все порты, за исключением тех, которые требуются для определённых сетевых служб для того, чтобы повысить защищённость системы от несанкционированного доступа. Посмотреть список всех открытых портов в системе можно с помощью команды netstat ss.

Просмотр открытых портов с помощью команды netstat с параметром ss.
Просмотр открытых портов с помощью команды netstat с параметром ss.

Помимо сетевых соединений данная команда показывает активные сокеты домена Unix (UDS). Они не являются сетевыми сокетами и для их работы даже нет необходимости настраивать сеть. Приложения, которые построены по клиент-серверной архитектуре, используют их для обмена данными без сетевого протокола, как будто работают с файловой системой (однако на самом деле непосредственный обмен данными идёт через буфер памяти ядра - KMB).

 Как сокеты домена Unix помогают работе шины D-bus
Как сокеты домена Unix помогают работе шины D-bus

Такие сокеты применяются, к примеру, в системной шине сообщений D-BUS для межпроцессного взаимодействия, позволяющего процессам выяснять, кому и какую работу необходимо выполнить. Файл UDS для D-BUS обычно можно найти в каталоге /var/run/dbus, он называется system_bus_socket и процессы подключаются к нему для отправки и получения сообщений. У этого файла есть права доступа (обычно rw-rw-r), что позволяет настроить контроль доступа процессов к шине D-BUS.

Сокеты домена Unix, используемые службой systemd-journal
Сокеты домена Unix, используемые службой systemd-journal

Поскольку ядру при работе UDS не приходится проходить через множество уровней сетевой подсистемы, производительность значительно повышается. Система инициализации systemd активно использует данный вид сокетов. Например, в каталоге /run/systemd/journal можно найти сокеты для отправки сигналов и другой информации от процесса-демона (systemd-journal) совему агенту в пользовательском пространстве (systemd). Файл dev-log - сокет, который получает сообщения ядра, socket и syslog - это сокеты, которые получают сообщения от программ, регистрирующих сообщения с помощью syslog API, stdout используется для регистрации сообщений от служб, стандартный вывод которых регистрируется службой systemd-journald, io.systemd.journal используется для чтения системных журналов с помощью команды journalctl.

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

Вывод информации о сетевых интерфейсах системы с помощью команды netstat
Вывод информации о сетевых интерфейсах системы с помощью команды netstat

Первая запись, enp3s0 - это интерфейс Ethernet. Вторая, lo - петлевой интерфейс (loopback). Когда исодящие данные для локального хоста доходят до сетевого интерфейса lo в ядре, оно просто заново упаковывает их как входящие данные и отправляет обратно через интерфейс lo. Также в выводе команды соедржится информация о статусе интерфейсов: включён (UP) или выключен (DOWN), статистика: количество полученных (RX) и отправленых (TX) пакетов, ошибок (errors), отброшенных пакетов по причине проблем на физическом уровне (dropped). Также указаны MAC-адрес интерфейса (ether), присвоенный интерфейсу IP-адрес (inet), маска (netmask), IP-адрес новой версии межсетевого протокола IPv6 (ipv6). Запись MTU (максимальная единица передачи), которая сообщает наибольший размер пакета, который можно отправить по сетевому соединению без фрагментации - 1500 байт.

Перевод десятичного поля flags в двоичную и шестнадцетиричную системы счисления с помощью команды bc, перевод числа из шестнадцатеричной в двоичную систему с помощью xxd и перевод из десятичной системы в шестнадцатиричную с помощью printf.
Перевод десятичного поля flags в двоичную и шестнадцетиричную системы счисления с помощью команды bc, перевод числа из шестнадцатеричной в двоичную систему с помощью xxd и перевод из десятичной системы в шестнадцатиричную с помощью printf.

Запись flags=4163 - это десятичное число, отражающее комбинацию характеристик сетевого интерфейса (флагов). В шестнадцетеричной системе исчисления оно эквивалентно 1043, а в двоичной равно 00010000 01000011. Каждый бит - это флаг, который может считаться установленным (значение 1) или снятым (значение 0). Значения флагов по их позиции с права на лево означают (если равны 1), что интерфейс:
- включен (UP);
- поддерживает широковещательную передачу (BROADCAST)
- работает в отладочном режиме (DEBUG)
- является интерфейсом обратной связи (LOOPBACK)
- используется для точка-точка соединений (POINTOPOINT)
- не поддерживает использование заголовков trailer (NOTRAILERS)
- запущен и готов к использованию (RUNNING)
- не использует протокол ARP (NOARP)
- находится в режиме прослушивания всех пакетов на сети (PROMISC)
- принимает все multicast-пакеты на сети (ALLMULTI)
- является мастером для агрегированных интерфейсов (MASTER)
- является слейвом для агрегированных интерфейсов
- поддерживает multicast-передачу (MULTICAST)
- поддерживает выбор порта при передаче (PORTSEL)
- поддерживает автоматическое определение типа среды передачи (AUTOMEDIA)
- MAC-адрес был назначен динамически (DYNAMIC)
Исходя из этого flags=4163 указывает на то, что интерфейс включён, поддерживает широковещательную передачу, запущен и готов к использованию, использует протокол ARP, поддерживает заголовки trailer и multicast-передачу.

Сравнение адресов IPv4 и IPv6
Сравнение адресов IPv4 и IPv6

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

Другие параметры команды netstat:
-c, неперерывно выдавать информацию о состоянии сети до тех пор, пока работа программы не будет прервана;
-n, выдать IP-адреса без их преобразования в имена хостов;
-a, вывести список всех активных портов
-o, показать информацию о количестве повторно переданных байтов и состоянии таймеров (on/off);
-g, отобразить членства в мультикаст группах;
-l, отобразить прослушиваемые порты сервера;
-s, отобразить сетевую статистику;
-t, информация о TCP-соединениях, включая работающие на приём;
-u, информация об UDP-соединениях;
-w, информация о RAW-сокетах;
-x, информация о доменных сокетах типа UNIX.

Разновидности сокетов по их доступу к слоям сетевой модели взаимодействия
Разновидности сокетов по их доступу к слоям сетевой модели взаимодействия

RAW-сокет (необработанный сокет) - это тип сетевого сокета, который обеспечивает прямой доступ к протоколам более низкого уровня, таким как Internet Protocol (IP) и Internet Control Message Protocol (ICMP), минуя обычную обработку IP и TCP/UDP, выполняемую сетевым стеком операционной системы. Необработанные сокеты могут использоваться для отправки и получения необработанных дейтаграмм на межсетевом уровне (Internet), позволяя приложению напрямую создавать пакеты и манипулировать ими. Это может быть полезно для инструментов сетевого анализа и диагностики, а также для реализации пользовательских протоколов и выплнения низкоуровневых сетевых операций.

Многие команды для настройки сети берут информацию из файловой системы procfs. Можно считывать эти данные и напрямую. Посмотреть, что там есть можно введя команду:
ls -lhF /proc/net.

Что можно найти в каталоге /proc/net
Что можно найти в каталоге /proc/net

- /proc/net/dev, информация о работе сетевых устройств (сколько байт принято и отправлено, количество ошибок и т.д.);
-
/proc/net/tcp и udp, дампы таблицы сокетов TCP и UDP, которые могут быть полезны при отладке;
-
/proc/net/snmp, содержит данные, необходимые службе SNMP (Simple Network Managment) для управления IP-устройствами и мониторинга работы сети с использованием протоколов ICMP, TCP и UDP;
-
/proc/net/arp, читабельный (ASCII) вариант дампа ARP таблицы ядра, которая используется для определения адресов. В ней записаны как полученные динамически, так и заданные явно записи ARP (Address Resolution Protocol), обеспечивающие отображение между адресами канального уровня (MAC-адресами) и сетевого уровня (IP-адресами);

Содержимое файлов /proc/net/dev и /proc/net/tcp
Содержимое файлов /proc/net/dev и /proc/net/tcp

- /proc/net/fib_trie, дерево FIB(Forwarding Information Base), служащее для ускорения мршрутизации ip-пакетов, промежуточные узлы обозначаются символами +--, конечные узлы символами |--;
-
/proc/net/fib_triestat, статистика связанная с маршрутизацией FIB
-
/proc/igmp, список всех адресов групп многоадресной рассылки, которые получает сервер;
-
/proc/net/netlink, предоставляет информацию об открытых сокетах в виде таблицы, в столбцах которой содержатся индетификаторы сокета(sk), протокол Ethernet (Eth), идентификатор процесса (Pid), группы многоадресной рассылки (Groups), буферы памяти для приёма и отправки (Rmem и Wmem). Может быть полезен для определения того, какие процессы взаимодействуют с ядром через сокеты Netlink;

Содержимое файла /proc/net/netlink
Содержимое файла /proc/net/netlink

- /proc/net/netstat, статистика, относящаяся к различным сетевым протоколам, таким как TCP, UDP и ICMP, в том числе набор ключей и значений, которые представляют различные сетевые счётчики, такие как количество принятых и переданных пакетов, ошибки и т.д. Может пригодиться при анализе сетевого трафика и устранения неполоадок в сети, хотя для непосредственного чтения человеком данный файл не адаптирован;
-
/proc/net/packet, предоставляет информацию о сетевых сокетах, использующих семейство протоколов AF_PACKET: номер индекса сокета, тип протокола, количество отправленных и полученных пакетов, размер буфера сокета и процесс, использующий сокет. Из этого файла можно узнать какой процесс использует определённый сетевой интерфейс;
-
/proc/net/protocols, содержит информацию о сетевых протоколах, активных в данный момент в системе. В нём перечислены различные статистические данные для каждого протокола, включая количество сокетов,объём используемой и зарезервированной памяти;

Содержимое файла /proc/net/protocols
Содержимое файла /proc/net/protocols

- /proc/net/psched, предоставляет информацию о параметрах планировщика пакетов для сетевых интерфейсов в системе. В нём содержится такая информация, как количество пакетов и общее количество байт в очереди и средний размер пакета. Используется такими программами, как tc (traffic control), для регулирования пропускной способности и правил качества обслуживания (QoS);
-
/proc/net/ptype, список типов сетевых интерфейсов (ethertypes), распознаваемых сетевым стеком ядра Linux. Представляет собой двухбайтовые поля в кадрах Ethernet, которые идентифицируют протокол, заключённый (инкапсулированный) в полезной нагрузке;
-
/proc/net/sockstat, статистика об общем количестве сокетов, используемых ядром, включая подробную информацию о количестве используемых сокетов TCP, UDP, UDPLITE, RAW и FRAG и объёме используемой ими памяти. Постоянно обновляется ядром и может использоваться для мониторинга состояния сетевой подсистемы в режиме реального времени;

Содержимое файлов /proc/net/ptype и /proc/net/sockstat
Содержимое файлов /proc/net/ptype и /proc/net/sockstat

- /proc/net/ip_tables_matches, список всех загруженных в ядро модулей iptables, используемых для управления правилами брандмауэра путём сопоставления пакетов на основе различных критериев, таких как IP-адреса источника и назначения, порты, протоколы, и т.д.;
-
/proc/net/ip_tables_names, содержит список таблиц фреймворка Netfilter (межсетевого экрана), настроенных в ядре для фильтрации, преобразования сетевых адресов и других манипуляций с пакетами. Часто используется в сочетании с командой iptables для управления правилами Netfilter;
-
/proc/net/ip_tables_targets, предоставляет информацию о целевых объектах, доступных для использования iptables. Каждая строка в файле представляет собой отдельный объект и содержит информацию о его имени и любых связанных с ним параметров. Целевые объекты - это конечные действия, которые iptables выполняет с пакетом, соответствующим правилу. Например, правило может сопоставлять пакеты, предназначенные для определённого диапазона IP-адресов, и соответствующей целью может быть отбрасывание этих пакетов или пересылка их на другой IP-адрес. Целевые объекты, доступные в iptables, могут варьироваться в зависимости от версии iptables и загруженных в данный момент модулей. Некоторые распространённые цели: ACCEPT, DROP, REJECT,SNAT, DNAT, LOG, QUEUE.

Типы првил iptables
Типы првил iptables

Iptables является в Linux наиболее часто используемым инструментом сетевой безопасности, позволяющим указать какие типы трафика разрешены или запрещены и на каком уровне (по IP-адресу источника/назначения, номеру порта, протоколу и т.д.). Эту команду можно использовать для настройки правил блокирования входящего трафика для всех IP-адресов кроме доверенных, пропускать только определённый вид трафика (SSH, HTTPS и т.д.), ограничивать колиество одновременных подключений с одного IP-адреса или сети, ведения журнала всех отклонённых попыток подключения, настройка правил переадресации портов для перенаправления входящего трафика на определённые порты. И это не полный перечень её возможностей.

Вывод правил с помощью команды iptables -nvl. Параметр n указывает, что нужно выводить IP-адреса, v добавляет к выводу имя интерфейса, опции правил (если есть) и TOS-маску (Type of Service), L указывает на то, что нужно вывести все правила указанных цепочек.
Вывод правил с помощью команды iptables -nvl. Параметр n указывает, что нужно выводить IP-адреса, v добавляет к выводу имя интерфейса, опции правил (если есть) и TOS-маску (Type of Service), L указывает на то, что нужно вывести все правила указанных цепочек.

Существует несколько цепочек (chain), по которым пакеты могут пройти через iptables: INPUT, которая описывает как будут обрабатываться поступающие из сети пакеты, OUTPUT, описывающая обработку отправляемых в сеть пакетов и FORWARD, отвечающая за обработку пакетов, которые не предназначены для даннго хоста, а проходят через него транзитом. Также, для первичной обработки входящих пакетов используется цепочка PREROUTING, а для постобработки пакетов, которые отправляются в сеть используется цепочка POSTROUTING. Могут быть созданы и пользовательские цепочки. И для каждой из них в таблицах записываются правиала, которые сосотят из условия, действия, счётчика. Условия - это, например,тип протокола, IP-адрес, порт, сетевой интерфейс. Действия - это то, что нужно сделать с пакетом- принять (ACCEPT), отбросить (DROP), вернуть в вышестоящую цепочку (RETURN) и т.д.

Входящий трафик можно настроить командой:
iptables -A INPUT -s IP_Address/Netmask -p tcp --dport Port_Number -j ACCEPT
Она добавляет правило в цепочку INPUT, разрешающее входящие TCP-соединения по определённому номеру порта с указанного IP-адреса или сети.
Исходящий трафик настраивается командой:
iptables -A OUTPUT -d IP_Address/Netmask -p tcp --sport Port_Number -j ACCEPT
Она добавляет правило в цепочку OUTPUT, разрешающее исходящие TCP-соединения по определённому номеру порта с указанным IP-адресом или сетью.

Kandinsky 2.1: iptables - помощник сетевых администраторов и друг Linux-серверов
Kandinsky 2.1: iptables - помощник сетевых администраторов и друг Linux-серверов

Другие примеры использования iptables:

  • Блокировать весь входящий трафик с определённого IP-адреса: iptables -A INPUT -s 192.168.1.100 -j DROP
  • Разрешить прохождение трафика SSH (по умолчанию через порт 22): iptables -A INPUT -p tcp --dport ssh -j ACCEPT
  • Ограничить доступ к определённому порту для определённой сети: iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j DROP
  • Разрешить весь исходящий трафик:
    iptables -A OUTPUT -j ACCEPT
  • Направить весь входящий трафик с интерфейса eth на интерфейс eth1: iptables -A FORWARD -i eth -o eth1 -j ACCEPT
  • Ограничить скорость входящего трафика на порту 22 до 1 Мбит/с:
    iptables -A INPUT -p tcp --port 22 -m limit --limit 1mbit/s -j ACCEPT
Параметры iptables для различных задач: фильтрации (FILTER), преобразования IP-адресов (NAT) и специализированного изменения пакетов (MANGLE).
Параметры iptables для различных задач: фильтрации (FILTER), преобразования IP-адресов (NAT) и специализированного изменения пакетов (MANGLE).

Таблица NAT (Network Address Translation) обычно используется для того, чтобы разрешить нескольким хостам совместно использовать один общедоступный P-адрес. Таблица Mangle может использоваться для изменения определённыхполей в пакетах, таких как время ожидания (TTL) или поле типа обслуживания (TOS). Большинство правил iptables по умолчанию определяются в таблице FILTER. Также для работы с пакетами, которые ещё не прошли обработку предназначена таблица правил RAW.

Если нужно запретить какое-то соединенеие, то ACCEPT заменяется на DROP. Основные параметры команды задаются заглавными буквами. Например, удалить правило можно указав параметр
-D, вставить правило с помощью параметра -I, вывести все правила с помощью параметра -S. Параметр -N позволяет создать цепочку, -X удалить цепочку, -P установить действие по умолчанию, -F удаляет все правила. Дополнительные параметры указываются прописными буквами. Например -p позволяет указать протокол (tcp, udp, icmp и т.д.), -s задаёт адрес источника, -d задаёт адрес приёмника, -i и -o указывают выходной и выходной сетевой интерфейс, -j задаёт действие, если правило подошло. Сохранить правила в Ubuntu можно выполнив команду:
sudo /sbin/iptables-save

Вывод списка правил iptables с помощью параметра -S
Вывод списка правил iptables с помощью параметра -S

Если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -p:
iptables -p INPUT ACCEPT
iptables -p OUTPUT ACCEPT
iptables -p FORWARD ACCEPT

Помимо iptables в Linux доступны и другие средства сетевой отладки и безопасности с открытым исходным кодом, которые могут помочь контролировать и защищать сети. Некоторые из популярных - Nmap (сканер портов), Tcpdump (перехватчик и анализатор сетевого трафика), Ngrep (анализатор сетевого трафика с интерфейсом командной строки), Wireshark (анализатор сетевого трафика с графическим интерфейсом), Snort (система обнаружения вторжений), Suricata (ещё одна система обнаружения вторжений), Logwatch (инструмент анализа файлов журналов).

С помощью команды tcpdump можно перевести сетевой интерфейс в неизбирательный режим работы (promiscous mode), чтобы иметь возможность подробно изучать каждый сетевой пакет в сети. Добавляя различные параметры можно фильтровать вывод, чтобы получать более конкретный отчёт о хостах источника и назначения, сети, адресах Ethernet, протоколах различных уровней модели сетевого взаимодействия.

 Команда tcpdump, её параметры, возможности, примеры вывода
Команда tcpdump, её параметры, возможности, примеры вывода

Команда tcpdump является интерфейсом (фронтендом), позволяющим пользователям задавать параметры захвата и отображения сетевого трафика. Такого рода программы относятся к перехватчикам сетевого траффика (снифферам). То, что непосредственно выполняет эту работу на более низком уровне, взаимодействуя с операционной системой и аппаратными средствами, называется бекендом. Его реализует сетевая подсисмтемы ядра Linux, в частности механизм фильтрации сокетов, известный как Berkeley Packet Filters (BPF). Он позволяет программе пользовательского пространства подклчать фильтр к любому сокету и разрешать или запрещать передачу данных через сокет. Фильтр в данном случае - это определённый набор инструкций и чтобы обеспечить безопасность времени их выполнения в пространстве ядра, BPF использует виртуальную машину. С точки зрения пользователя команда, задающая фильтр, может выглядеть, например, так:
tcpdump -i eth0 -d enp3s0
Для виртуальной машины же она будет представлять собой набор инструкций (байткод) вида:
(000) ldh [12]
(001) jeq #0x86dd jt 2 jf 3
(002) ret #262144
(003) ret #0

Преобразованием пользовательских команд в инструкции, предназначенные для выполнения машиной, называеся компиляцией и в случае tcpdump это делается с помощью вызова функции pcap_compile() из библиотеки libpcap (эта библиотека используется также и Wireshark, snort, nmap и многими другими подобными программами). Запуск полученных инструкций происходит при вознкновении какого-либо события в ядре, например поступлени пакета в сетевую карту.

Если запустить команду tcpdump без указания сетевого интерефейса, она выберет для прослушивания первый из списка доступных. Для того чтобы просмотреть этот список можно ввести эту команду с параметром команду -D. У меня первый в этом списке enp3s0. С ним и будет происходить работа. Можно указать это явно используя праметр -i. По умолчанию tcpdump работает до тех пор, пока не будет прервана сочетанием клавиш ctrl+c. Если нужно остановить её работу после захвата определённого количества пакетов, используется параметр -c.

Расшифровка вывода команды tcpdump
Расшифровка вывода команды tcpdump

Time stamp (метка времени) - конкретная дата, отражённая в числе. Protocol (протокол) по котрому был обработан пакет, в данном случае это IP (Internet Protocol). Source IP and Port (адрес источника и порт) и Dest IP and Port (адрес назначения и порт) - отражают имя или IP-адрес хоста отправителя, получателя и номера соответствующих им портов. Имя вместо IP-адреса выводится у хостов по умолчанию, если нужен именно адрес, следует добавит к команде tcpdump параметр -n. TCP Flags (флаги TCP) указыват на состояние соединения (S - SYN, первый шаг в установлении соединения; F - FIN, прекращение соединения; . - ACK, пакет подтверждения принят успешно; P - PUSH, пакеты нужно обработать, а не буферизировать; R - RST, связь прервалась.). TCP Ack - номер подтверждения данных в пакете, TCP Window (размер окна TCP) - количество байтов, доступных в приёмном буфере. Options (параметры) - параметры TCP. Length (длина) - длина полезной нагрузки в пакете.

Синтаксис команды tcpdump предусматривает передачу ей более сложных выражений для настройки фильтрации, состоящих из примитивов (коассификаторов, спецификаторов и квалификаторов) которые можно группировать при помощи скобок и соединять с помощью операторов and (логическое "И"), or (логическое "ИЛИ") и not (логическое "НЕТ"). Классификаторы указывают к какому виду относится имия или номер порта идентификатора: host, net, port. Спецификаторы сообщают конкретное направление передачи: src, dst, src or dst, src and dst. Квалификаторы ограничивают соотвествие определённым протоколом: ether, fddi, tr, ip, ip6, arp, rarp, tcp, udp.

Несколько простых примеров использования команды tcpdump.
- Перехват DNS-трафика, который по умолчанию связан с портом 53:
tcpdump -c 1 -i enp3s0 port 53 -n
- Запись выходных данных в файл:
sudo tcpdump -c 1 -i enp3s0 port 53 -n -w dumpfile.pcap -v
Просматривать дамп можно командой:
tcpdump -r dumpfile.pcap или с помощью команды: wireshark dumpfile.pcap.

Выполнение команды tcpdump с примитивом port, запись дампа в файл и его просмотр в графической программе wireshark.
Выполнение команды tcpdump с примитивом port, запись дампа в файл и его просмотр в графической программе wireshark.

По умолчанию tcpdump выдаёт только информацию заголовков пакетов, но добавив параметр -X можно просмотреть содержимое самого пакета в шестнадцатеричном формате (HEX), а с помощью параметра -A вывести содержимое пакета в формате ASCII. Проиллюстрировать это можно следующим примером. В одном окне терминала вводится команда для перехвата пакетов, поступающих с хоста ya.ru:
tcpdump -i enp3s0 -c 10 -n -vv host ya.ru -A
В другом окне терминала запускается команда:
wget ya.ru. Результат перехвата содержимого пакетов, поступающих от ya.ru отразится в первом окне.

Захват пакетов поступающих с определённого хоста и отображение их содержимого в ASCII формате с помощью tcpdump с параметром -A.
Захват пакетов поступающих с определённого хоста и отображение их содержимого в ASCII формате с помощью tcpdump с параметром -A.

Следует проявлять тактичность в использовании этой возможности, поскольку в сочетании с параметром -I команда tcpdump может подобным образом выдавать содержимое любых пакетов локальной сети, а не только тех, которые предназначены для хоста на котором она запущена. Некоторые владельцы других компьютеров в сети могут быть против этого. Хотя и сильно беспокоиться не стоит, потому что многие сетевые соединения зашифрованы.

Другие примеры использования команды tcpdump.

  • Перехватить пакеты, игнорируя определённый порт:
    tcpdump -i
    enp3s0 -c 5 -nn not port 22
  • Перехватить все пакеты кроме ICMP:
    tcpdump -i enp3s0 not icmp
  • Перехватить пакеты с определённого IP-адреса и для определённого порта:
    tcpdump -n -i enp3s0 src 10.0.0.1 and dst port 80
  • Захватывать только исходящие пакеты на интерфейсе enp3s0: tcpdump -i enp3s0 -Q out
  • Захватывать только те пакеты, которые идут из сети 192.168.1.0/24: tcpdump net 192.168.1.0/24
  • - Захватывать только те пакеты, длина которых меньше 100:
    tcpdump less 100
  • Захватывать только те пакеты, длина которых больше 100:
    tcpdump greater 100
  • Захватывать входящий трафик:
    tcpdump inbound
  • Захватывать исходящий трафик:
    tcpdump outbound
  • Перехватывать только пакеты TCP:
    tcpdump tcp
  • - Перехватывать только пакеты UDP:
    tcpdump udp
Пример фильтрации пакетов по соджержанию конкретных битов
Пример фильтрации пакетов по соджержанию конкретных битов

Tcpdump умеет фильтровать пакеты по содержанию конкретных битов в заголовках. Синтаксис, позволяющий это реализовать: proto[expr:size], где proto — протокол, expr — смещение в байтах от начала заголовка пакета, а size — необязательное поле, указывающее на длину рассматриваемых данных. Например, tcpdump 'tcp[13]==2', захватывает пакеты с установленным флагом SYN, поскольку в 13-байтном заголовке TCP под данный флаг отведёт байт с порядковым номером 2. Таким способом можно отловить сетевые пакеты передаваемые, например по протоколу DHCP:
tcpdump -i enp3s0 -vvv -s 1500 '((port 67 or port 68) and (udp[8:1] = 0x1))'

Пример фильтрации DHCP-пакетов
Пример фильтрации DHCP-пакетов

Также tcpdump может быть полезна при разработке приложений, например когда требуется узнать какие функции выполняются удалённо, какие параметры передаются и какие результаты возвращаются. Для этого нужно перехватить пакеты, передающиеся по протоколу RPC (Remote Procedure Call) и параметр, указывающий на это: -T rpc.
Пример команды:
tcpdump -i enp3s0 -s 0 -n -A -vvv -T rpc host mc.yandex.ru

Результат перехвата rpc-пакета
Результат перехвата rpc-пакета

Заголовок пакета содержит исходный и целевой IP-адреса и порты; флаги пакета ([P.] указывает на то, что данный пакет содержит полезную нагрузку и является частью длинного потока данных); контрольную сумму (cksum), которая используется для проверки целостности данных, номера последовательности пакета (seq 584:988 означает, что пакет содержит данные с номерами последовательности от 584 до 988); номер подтверждения (ack 203), который указывает на то, что пакет должен быть подтверждён; размер окна ("win 1516"), указывающий на количество байт, которые отправитель может передать до получения подтверждения; дополнительные параметры (options[...]), включащие метку времени отправителя (TS val) и метку времени получателя (ecr); длину пакета в байтах (length), которая равна 404.

Вслед за заголовком идёт сама полезная нагрузка, но эти данные внутри пакета зашифрованы. Можно добавить к команде параметр -w чтобы записать дамп в файл и передать его для анализа программе wireshark. Однако она должна иметь доступ к необходимым ключам и сертификатам шифрования. Указанный в заголовке порт сервера 443 означает, что для обмена данными используется безопасный протокол передачи гипертекста (HTTPS), шифрование которого опирается на протоколы SSL(Secure Sockets Layer)/TLS (Transport layer security). Большинство серверов, которые предназначены для взаимодействия с браузерами (веб-серверов) используют данную технологию.

Процесс запуска зашифрованного сеанса связи (TLS-рукопожатие)
Процесс запуска зашифрованного сеанса связи (TLS-рукопожатие)

Программа wireshark - не браузер и доступ к необходимым сертификатам ей нужно обеспечить самостоятельно (открыв меню Редактирование -> Параметры-Protocols ->TLS). Отсюда можно сделать вывод, что не всякая полезная нагрузка из перехваченных пакетов может быть действительно полезна. Нужно либо смириться с этим, либо проявить дополнительную смекалку.

Kandinsky 2.1: Начинающий специалист по сетям вникает в теорию и практику получение полезных нагрузок из пакетов.
Kandinsky 2.1: Начинающий специалист по сетям вникает в теорию и практику получение полезных нагрузок из пакетов.

К слову, можно посмотреть, какие службы RPC есть на компьютере запустив команду: rpcinfo -p localhost. Этот инструмент командной строки опирается на службу Rpcbind (старое название - Portmapper), которая сопоставляет службы RPC с портами, на которых они прослушиваются. По умолчанию единственным включённым портов является порт 111 для UDP и TCP. Когда запускается служба RPC, она регистрируется в rpcbind, сообщая, какой номер пора она прослушивает и какие номера программ RPC она ожидает обслуживать. Проверить статус Rpcbind в Ubuntu можно выполнив команду: systemctl status rpcbind.service
Если эта служба не используется, её рекомендуется отключить для повышения безопасности. Для этого нужно ввести команды:
systemctl disable rpcbind.service
systemctl stop rpcbind.service
systemctl stop rpcbind.socket

Rpcbind и команда rpcinfo для просмотра служб, использующих удалённый вызов процедур (RPC)
Rpcbind и команда rpcinfo для просмотра служб, использующих удалённый вызов процедур (RPC)

Что ещё можно сделать для повышения безопасности компьютера, подключённого к сети, позволит узнать программа Nmap (Network Mapper). Она сканирует все порты компьютера или сети компьютеров в поисках открытых портов, а затем выводит список всех обнаруженных портов. Имеет смысл сделать это на непосредственно на проверяемом компьютере и где-то за пределами локальной сети, чтобы иметь картину с разных ракурсов и знать, к примеру, что блокируется брандмауэром. Например, я могу проверить свой компьютер, введя команду:
nmap 192.168.1.106

 Результат работы программы Nmap
Результат работы программы Nmap

Ещё одна полезная комана - lsof. Она способна отследивать открытые файлы, а также выводить список программ, которые в данный момент используют или прослушивают порты. Для этого нужно ввести команду: lsof -i. Если её запустить с правами обычного пользователя, она покажет только процессы этого пользователя. При запуске с корневыми правами отчёт будет с различными процессами и пользователями. Такая возможность неплохо дополняет команду netstat -lntup, которая показывает активные соединения с интернетом только для серверов.

Результат выполнения команды lsof -i обычным пользователем и с правами администратора
Результат выполнения команды lsof -i обычным пользователем и с правами администратора

Если нужно найти какой-либо конкретный порт (допустим, известно, что какой-то процесс использует этот порт, и нужно узнать, что это за процесс), поможет такая команда: lsof -i:port. Более подробный сиснтаксис в этом случае: lsof -iprotocol@host:port. Параметры protocol, @host и :port будут соответствующим образом фильтровать вывод команды lsof. Как и в большинстве сетевых утилит, параметры host и port могут быть либо именами, либо числами. Команда lsof пытается выполнить обратное разрешение каждого IP-адреса в имя хоста, и это замедляет вывод. Поэтому можно использоватьпараметр -n, чтобы отключить разрешение имён.

Получение информации о процессах, использующих конкретный порт с помощью команды lsof
Получение информации о процессах, использующих конкретный порт с помощью команды lsof

Чрезвычайно удобным фильтром команды lsof является статус соединения. Чтобы, например, отобразить только те процессы, которые прослушивают порты TCP, можно ввести такую команду:
sudo lsof -iTCP -sTCP:LISTEN

Получение списка процессов, прослушивающих порты TCP. Параметр -s задаёт имена состояний портов.
Получение списка процессов, прослушивающих порты TCP. Параметр -s задаёт имена состояний портов.

Команда lsof способна также отслеживать открытые файлы. Например можно получить список всех файлов, открытых в каталоге /var/log/ запустив команду: sudo lsof +D /var/log/

Получение списка файлов, открытых в каталоге /var/log/ с помощью lsof
Получение списка файлов, открытых в каталоге /var/log/ с помощью lsof

Предупреждения (WARNING) которые при этом выводятся означают, что lsof обнаружила виртуальную файловую систему GNOME (gvfs), смонтированную в пространстве пользователя (FUSE). Она служит мостом между API GNOME и ядром, а доступк ней может получить только владелец.

Есть множество и других вариантов её применения к файлам. Например, с помощью параметра -p можно указать номер процесса, чтобы увидеть, какие файлы им открыты:
sudo lsof -p 1828.

Просмотр отрытых процессом файлов с помощью команды lsof
Просмотр отрытых процессом файлов с помощью команды lsof

В Ubuntu имеются сетевые службы, которые занимаются автоматическим конфигурированием сетей. Они могут отслеживать физические сети и выбрать сетевые интерфейсы ядра на основе наборов правил. Примером такой службы является networkManager. Она запускается во время загрузки системы и обслуживает два основных уровня конфигурации. Первый - это информация о доступных аппаратных средствах, обычно она извлекается из ядра и появляется при отслеживании демона udev через шину Desktop Bus (D-Bus). Второй уровень конфигурации представляет специальный перечень подключений: аппаратные средства и дополнительные параметры конфигурации физического и сетевого уровней. Например, беспроводная сеть может быть представлена как подключение.

Получение статуса службы NetworkManager с помощью команды systemctl
Получение статуса службы NetworkManager с помощью команды systemctl

Проверить, запущена ли служба NetworkManager можно выполнив команду: sudo systemctl status NetworkManager. Если она запущена, то для управления ею из командной строки используется команда nmcli, имеющая следующий синтаксис: nmcli опции объект команда.

Результат выполнения команды nmcli без параметров
Результат выполнения команды nmcli без параметров

В качестве объектов выступают:
-
device, управление сетевыми устройствами;
-
connection, управление соединениями;
-
networking, управление сетью в целом;
-
general, показывает состояние всех сетевых протоколов и NetworkManager в целом;
-
radio, управление протоколами беспроводных сетей типа WiFi.

Некоторые примеры использования этой команды.
-информация о всех сетевых интерфейсах:
nmcli device show

Получение информации о всех сетевых интерфейсах с помощью nmcli
Получение информации о всех сетевых интерфейсах с помощью nmcli

- узнать состояние интерфейсов:
nmcli device status
- список доступных подключений:
nmcli connection show
- посмотреть информацию о проводном подклюении для интерфейса enp3s0:
nmcli connection show "Проводное соединение 1"

Получение информации о состоянии сетевых интерфейсов и соединениях
Получение информации о состоянии сетевых интерфейсов и соединениях

- подключиться к сети:
nmcli connection up "Проводное соединение 1"
- отключиться от сети:
nmcli connection down "Проводное соединение 1"
- создать новое подключение с использованием протокола DHCP:
nmcli connection add con-name "dhcp" type ethernet ifname enp3s0
- создать новое подключение, назначив ему статический адрес:
nmcli connection add con-name "static" ifname enp3s0 autoconnect no type ethernet ipv4 192.168.1.210 gw 192.168.1.1
- указание DNS-сервера:
nmcli conn modify "static" ipv4.dns 8.8.8.8
- добавление ещё DNS-сервера:
nmcli conn modify "static" +ipv4.dns 8.8.4.4
Знак "+" можно использовать и для добавления адрсосв (они должны быть из той же подсети, что и шлюз):
nmcli con modify "static" +ipv4.addresses 192.168.0.240/24
- активирование подключения:
nmcli connection up static

Основным каталогом конфигурации менеджера NetworkManager обычно является /etc/NetworkManager/, и в нём присутствует несколько различных файлов конфигурации. Главным является NetworkManager.conf. Его формат подобен XDG-файлам .desktop и файлам .ini стандарта Microsoft: пары параметров "ключ-значение" распределены по различным секциям. Практически каждый файл конфигурации содержит секцию [main], которая определяет необходимые для использования плагины. В большинстве случаеы редактирования NetworkManager.conf не требуется, поскольку специальные параметры конфигурации находятся в других файлах. Тем не менее, если необходимо, например, запретить настройки каких-либо сетевых интерфейсов, можно указать это в файле NetworkManager.conf, перечислив соотвествующие MAC-адреса в разделе [keyfile]:
unmanaged-devices=mac:10:78:d2:eb:76:97;mac:1c:65:9d:cc:ff:b9

Конфигурационные файлы NetworkManager
Конфигурационные файлы NetworkManager

В каталоге /etc/NetworkManager/dispatcher.d расположен сценарий 01-ifupdown, который NetworkManager использует для запуска всего, что находится в подкаталогах no-wait.d, pre-down.d, pre-up.d когда статутс сетевого интерфейса в системе меняется. Это обеспечивает корректную работу сетевых демонов, которым нужно знать, когда начать или завершить просулшивание сетевого интерфейса.

В каталоге /etc/NetworkManager/system-connections/ находятся файлы настроек проводных соединений. В частности там хранятся настройки IP-адреса и шлюза, адреса внешних DNS-серверов для ipv4 и ipv6.

Содержимое файла настроек "Проводное соединение 1"
Содержимое файла настроек "Проводное соединение 1"

Одной из заключительных задач любого сетевого конфигурирования является разрешение имени хоста с помощью службы DNS. Эта служба отличается тем, что расположена полностью в пространстве пользователя. Автоматические службы сетевой конфигурации, такие как DHCP, почти всегда содержат конфигурацию DNS.

Процесс разрешения имён обычно протекает следующим образом:
1. Приложение вызывает функцию, чтобы выяснить IP-адрес, который стоит за именем хостаю Эта функция находится в совместно используемой системной библиотеке, поэтому приложению не нужно знать подробности о том, как она работает, или об изменениях в её реализации.

Содержимое файла /etc/nsswitch.conf
Содержимое файла /etc/nsswitch.conf

2. Когда эта функция запускается, она действует в соответствии с набором правил (расположенных в файле /etc/nsswitch.conf), чтобы установить план действий при поисках. Например, такие правила обычно говорят о том, что перед переходом к DNS следует проверить ручное переопределение в файле /etc/hosts.

Служба разрешения сетевых имён для локальных приложений systemd-resolved
Служба разрешения сетевых имён для локальных приложений systemd-resolved

3. Когда функция решает использовать службу DNS для поиска имени (в данном случае systemd-resolved), она обращается к допонительному файлу конфигурации, чтобы найти сервер имён DNS. Сервер имён представлен в виде IP-адреса. Для systemd-resolved это файл /etc/systemd/resolved.conf.

Содержимое файла /etc/setemd/resolved.conf
Содержимое файла /etc/setemd/resolved.conf

4. Функция отправляет DNS-запрос на поиск (по сети) серверу имён.
5. Сервер имён сообщает в ответ IP-адрес имени хоста, а функция возвращает этот IP-адрес приложению.

В Linux для ускорения разрешения имён обычно используется локальный DNS-сервер, который кеширует ответы повторяющихся DNS-запросов. Этим могут заниматься разные программы: dnsmasq, bind9, pdnsd, nscd и т.д. Некоторые программы построены так, чтобы обращаются к DNS-серверам напрямую (например ping). Они берут адреса DNS-серверов из файла /etc/resolv.conf. Служба systemd-resolved может выступать в роли локальной слушающей DNS-заглушки с IP-адресом 127.0.0.53. Чтобы направить все прямые DNS-запросы таким путём, нужно изменить файл resolv.conf:
mv /etc/resolv.conf /etc/resolv.conf.bak
echo 'nameserver 127.0.0.53' > /etc/resolv.conf.

Проверить, как проходят DNS-запросы можно выполнив команду:
nslookup -debug ya.ru

Проверка работы службы разрешения имён
Проверка работы службы разрешения имён

Для разрешения имён в локальной сети для хостов, у которых нет записи в службе DNS используются средства mDNS (Multicast DNS, многоадресная служба DNS) и SSDP (Simple Service Discovery Protocol, простой протокол обнаружения службы). Наиболее широко используемая реализация mDNS для Linux называется Avahi. В Ubuntu, Avahi используется для автоматического обнаружения и доступа к сетевым службам, таким как принтеры, файловые серверы, медиа-серверы и другие устройства в домашней сети. Он обеспечивает механизм "zeroconf" (нулевой конфигурации), который позволяет устройствам автоматически настраивать себя и обмениваться информацией о доступных службах.

Проверить, используется ли этот демон можно с помощью команды: sudo systemctl status avahi-daemon

Проверка статуса службы avahi-daemon
Проверка статуса службы avahi-daemon

Настройки Avahi хранятся в несколько файлах:
1.
/etc/avahi/avahi-daemon.conf. Этот файл содержит основные настройки демона Avahi. Здесь можно задать имя устройства, тип сети, порты, которые должны быть доступны для обнаружения, и другие параметры.

Основной файл конфигурации avahi
Основной файл конфигурации avahi

2. /etc/avahi/hosts. В этом файле можно указать пользовательские имена и IP-адреса для устройств в сети. Это может быть полезно, если Вы хотите иметь более понятные имена для устройств вместо IP-адресов.

Файл имён хостов локальной сети, обслуживаемых avahi
Файл имён хостов локальной сети, обслуживаемых avahi

3. /etc/avahi/services. В этот каталог размещают файлы с описанием доступныхагышщи сетевых служб. Например, файл ssh.service, с информацией о доступном SSH-сервере в сети. При обнаружении такого файла, Avahi рассылает информацию о доступной службе на другие устройства в сети.

Kandinski 2.1: Демон Avahi рассылает информацию о доступных службах устройствам в сети
Kandinski 2.1: Демон Avahi рассылает информацию о доступных службах устройствам в сети

Есть несколько распространённых сетевых серверов:

  • httpd, apache, nginx - веб-серверы;
  • sshd - демон защищённой оболочки;
  • postfix, qmail, sendmail - почтовые серверы;
  • cupsd -сервер печати;
  • smbd, nmbd - серверы программного пакета Samba, использующегося для сетевого взаимодействия с системами Windows.

Общим свойством большинства сетевых серверов является то, что они обычно действуют в виде нескольких процессов. Хотя бы один из процессов прослушивает сетевой порт, и когда поступает новое входящее соединение, прослушивающий процесс использует системный вызов fork(), чтобы создать дочерний процесс, который становится ответственным за новое соединение. Серверы, которые принимают UDP-пакеты, просто получают данные и реагируют на них. У них нет соединений, которые надо прослушивать.

Использование непривелегированного дочернего процесса, чтобы ограничивать последствия ошибок программирования.
Использование непривелегированного дочернего процесса, чтобы ограничивать последствия ошибок программирования.

Каждый сервер работает по-своему. Одним из самых распространённых сетевых сервисных приложений является защищённая оболочка (SSH). Она даёт возможность защищённого входа в систему, удалённого исполнение команд, простого совместного использования файлов, опираясь на криптографические системы с открытым ключом аутентификации и упрощёнными шифрами для сеансовых данных.

Оболочка
OpenSSH является популярной бесплатной реализацией SSH для Unix, и она присутствует практически во всех версиях Linux. Клиент оболочки OpenSSH называется ssh, а сервер - sshd.

Оболочка SSH позволяет:

  • шифрование пароля и других сеансовых данных для защиты от шпионов;
  • туннелирование других сетевых соединений, включая те, которые исходят от клиентов системых X Window;
  • наличие клиентов почти для любой операционной системы;
  • использование ключей для аутентификации хоста.
Процесс взаимодействия клиента и сервера по протоколу SSH
Процесс взаимодействия клиента и сервера по протоколу SSH

Туннелирование - это процесс упаковки и передачи одного сетевого подключения с помощью другого. Оно используется для создания виртуального приватного канала (туннеля) через открытую сеть, такую как Интернет. Туннелирование позволяет зашифровать и защитить передаваемые данные, а также обойти ограничения, наложенные на сетевой трафик. Может быть реализовано на разных уровнях сетевой модели OSI, включая уровни 2 (Data Link), 3 (Network) и 4 (Transport). Помимо SSH протоколы туннелирования включают в себя IPsec, SSL/TLS, PPTP, L2TP и другие.

Для запуска сервера sshd необходим файл конфигурации, а также ключи хоста. В большинстве версий ОС файл конфигурации находится в каталоге
/etc/ssh, и если вы установили пакет sshd, то вся конфигурация будет выполнена корректно за вас. Имя файла конфигурации sshd_config легко спутать с файлом установщика клиента ssh_config, поэтому будьте внимательны.

Основной файл конфигурации Openssh и пример конфигурационного файла для отдельных хостов
Основной файл конфигурации Openssh и пример конфигурационного файла для отдельных хостов

В Ubuntu основной файл конфигурации ssh: /etc/ssh/ssh_config содержит запись: Include /etc/ssh/ssh_config.d/*.conf, означающую, что файлы конфигурации для отдельных хостов или групп хостов будут читаться из каталога ssh_config.d. Каждый такой файл должен содержать допустимую конфигурацию SSH, все возможные значения которой перечислены на странице руководства sshd_config(5). Эта страница доступна только в случае установленного пакета SSH сервера.

У оболочки OpenSSH есть три набора ключей хоста: один для протокола версии 1 и два для протокола 2-й версии. В каждом наборе присутствует открытый ключ (файл с расширением
.pub) и секретный ключ (файл без расширения). Никому не показывайте секретный ключ, даже в собственной системе, поскольку при этом вы подвергаетесь риску вторжения злоумышленников. Обычно используется протокол 2-й версии. Он поддерживает алгоритмы шифрования RSA и DSA.

Чтобы создать ключи для протокола SSH можно воспользоваться командой ssh-keygen:
ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t dsa -N '' -f /etc/ssh/ssh_host_dsa_key

 Скрытый каталог .ssh, файл known_hosts и конфиуграционные файлы config и ssh_config
Скрытый каталог .ssh, файл known_hosts и конфиуграционные файлы config и ssh_config

Сервер SSH и клиенты применяют также файл ключей known_hosts, который содерит открытые ключи от других хостов. Если вы намерены использовать аутентификацию на основе хостов, файл known_hosts на сервере должен содержать открытые ключи хостов для всех надёжных клиентов. При настройке нового компьютера с нуля можно импортировать файлы ключей со старого компьютера, чтобы у пользователей не возникло несоответствие ключей при подключении к новому компьютеру. На клиентских компьютерах этот файл обычно находится в домашнем каталоге пользователя в скрытом подкаталоге .ssh.

Взаимоотношения клиента и сервера SSH и участвующие в этом файлы ключей
Взаимоотношения клиента и сервера SSH и участвующие в этом файлы ключей

Хотя в большинстве версий ОС присутствует клиент SSH, сервер sshd обычно не входит в комплект по умолчанию. В Ubuntu и Debian при установке пакета SSH-сервера создаются ключи, запускается сервер и заносится информация о запуске в конфигурацию загрузки системы.

Сервер sshd можно запустить посредством модуля сокета в системе systemd (sshd.socket) или сервиса (sshd.service). Разница между ними в том, как будет обрабатываться входящее подключение. Сервис sshd.service - это служба SSH-сервера, которая запускается и работает постоянно в фоновом режиме, прослушивая определённый порт (по умолчанию 22). Сокет-активатор sshd.socket - сам прослушивает входящие соединения на этом порту и запускает сервер SSH только при активном подключении, что помогает снизить нагрузку на сервер.

Для использования sshd.socket нужно выполнить ряд действий.

  1. Создать каталог для модуля сервиса:
    sudo mkdir /etc/systemd/system/sshd.socket.d
  2. Создать файл конфигурации модуля сокета:
    sudo nano /etc/systemd/system/sshd.socket.d/listen-sssh.conf
  3. Добавить следующие строчки в конфигурационный файл:
    [Socket] ListenStream=22
  4. Создать модуль сервиса для sshd:
    sudo nano /etc/systemd/system/sshd@.service
  5. Добавить следующие строчки в этот файл:
    [Unit]
    Description=OpenSSH Server Socket
    [Service]
    ExecStart=-/usr/sbin/sshd -i StandardInput=socket
    [Install]
    WantedBy=socket.target
  6. Перезапустить демоны systemd и разрешить модуль сокета:
    sudo systemctl daemon-reload sudo systemctl enable sshd.socket
  7. Запустить модуль сокета:
    sudo systemctl start sshd.socket

Подключиться к удалённому хосту можно с помощью команды:
ssh remote_username@host

Пример подключения к удалённому хосту с помощью команды ssh
Пример подключения к удалённому хосту с помощью команды ssh

Параметр remote_username@, указывать не обязательно, если локальное имя пользователя такое же как и для хоста. Команду ssh можно также встраивать в "конвейер", как показано в приведённом ниже примере, в котором каталог dir копируется на другой хост:
tar zcvf - dir | ssh remote_host tar zxvf

Оболочка OpenSSH содержит команду для передачи файлов - scp, которая работает подобно команде cp.

Копирование файлов по SSH с помощью команды scp
Копирование файлов по SSH с помощью команды scp

Примеры использования команды scp:
- cкопировать файл 'file' с удалённой системы 'host', используя SSH-подключение с именем пользователя 'user' в текущий рабочий каталог этого пользователя:
scp user@host:file;
- скопировать файл 'file' с локальной системы на удаленную систему `host` в в каталог 'dir':
scp file user@host:dir
- скопировать файл 'file' с одного хоста на другой:
scp user1@host1:file user2@host2:dir

Можно было бы продолжить изучение возможностей OpenSSH и заодно коснуться не менее интересной программы OpenVPN, но этим я пожалуй займусь в следующий раз. А пока лучше сделаю ещё пару крпуных мазков по сетевом средствам Linux.

Службы TCP являются одними из самых простых для понимания, поскольку они построены на несложных, непрерывных двусторонних потоках данных. Вероятно, лучший способ увидеть, как они работают, - "пообщаться" с веб-серверами напрямую через TCP-порт 80 и получить представление о том, как данные перемещаются через это соединение. В этом может помочь команда
telnet. Данная команда изначально была предназначена для осуществления входа на удалённые хосты. Хотя вход на удалённые сервер с помощью команды telnet без использования техноолгии Kerberos совершенно не защищён, клиент telnet может быть полезен для отладки удалённых служб.

Например, введём команду :
telnet google.com 80

Подключение к google.com с помощью команды telnet
Подключение к google.com с помощью команды telnet

После этого введём:
GET / HTTP/1.1
И два раза нажмём "Enter"

Ответ google.com на HTTP-запрос
Ответ google.com на HTTP-запрос

Сервер должен отправить в виде ответа некоторое количество HTML-текста, а затем разорвать соедиение.
Взаимодействие с веб-сервером осуществляется по протоколу прикладного уровня HTTP (Hypertext Transfer Protocol, протокол передачи гипертекста) . HTTP-запрос начинается со стартовой строки: GET / HTTP/1.1, где
GET - это метод, который позволяет запросить у сервера конкретный ресурс и передать ему небольшие объёмы данных через строку запроса в составе URL(Uniform Resource Locator, унифицированного указателя ресурса). На месте GET могут быть и другие методы - POST, HEAD, PUT, DELETE, OPTIONS, PATCH.После метода GET указывается URL (в данном примере /, что означает запрос главной страницы сайта). Далее указывается версия протокола HTTP/1.1, которая определяет структуру следующих за стартовой строкой данных.

Многие сайты работают по протоколу HTTPS, который подразумевает обмен сертификатами для шифрования трафика. Программа telnet не умеет это делать в автоматическом режиме (вместо неёможно использовать программы
openssl и gnutls). Поэтому для подобных экспериментов лучше подыскать подходящие сайты. Сделать это можно указав в поисковом запросе google специальный параметр: -inurl:https. Он исключит из выдачи HTTPS ресусры. Например, поисковый запрос:
"Команды Linux" -inurl:https
позволил мне найти ресруср
http://www.electrosad.ru/.
После подключения к нему был отправлен более подробный запрос:
GET /OS/Com.htm HTTP/1.1
Host:electrosad.ru
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close

Рис. Ответ electrosad.ru на HTTP-запрос
Рис. Ответ electrosad.ru на HTTP-запрос

Строка User-Agent - передаёт серверу характеристики клиента. В данном случае пришлось пойти на обман, представившись браузером Firefox, поскольку в противном случае сервер nginx выдавал не запрашиваемую страниу, а заглушку с сообщением "400 Bad Request". Строка Accept указывает серверу какие типы контента клиент может понять. Строка Connection даёт серверу понять, что делать после завершения текущего запроса (транзакции). Строка host позволяет указать точный адрес запрашиваемой страницы на подключенном сервере. Все эти строки - заголовки HTTP-запроса, передаваемого серверу.

Взаимодействовать с серверами по протоколам HTTP, HTTPS и FTP можно также с помощью команды curl.
Например: curl --trace-ascii trace_file
http://electrosad.ru

Получение веб-страницы при помощи команды curl
Получение веб-страницы при помощи команды curl

Результат работы этой команды запишется в файл trace_file. Первая часть этого файла содержит информацию о попытке команды curl установить TCP-соединение с сервером:
== Info: Trying 77.222.40.118:80...
== Info: TCP_NODELAY set
== Info: Connected to electrosad.ru (77.222.40.118) port 80 (#0)

Этот этап отражает работу curl на транспортном уровне и ниже. При условии, что соединение оказалось успешным, далее curl пытается отправить запрос ("заголовок"); именно в этот момент в дело вступает прикладной уровень.
=> Send header, 77 bytes (0x4d)
0000: GET / HTTP/1.1
0010: Host: wikipedia.org
0025: User-Agent: curl/7.68.0
003e: Accept: */*
004b:

Здесь первая строка представляет отладочный вывод команды curl, сообщающий о дальнейших действиях команды. Остальные строки показывают , что именно команда curl отправляет серверу.
Curl знает о том, что она получает заголовки, пока ей не встретится пустая строка, которая сигнализирует об окончании HTTP-заголовков. Тогда команда интерпретирует всё, что последует далее, как запращиваемый документ.

Другие примеры использования сurl:
- Отправка POST-запроса с данными:
curl -d "param1=value1&param2=value2" -X POST https://www.example.com/api
POST - это метод передачи данных на сервер. В отличие от метода GET передаваемые параметры не отображаются URL строке, а размещаются в теле запроса.
- Отправка запроса с заголовками:
curl -H "Content-Type: application/json" -H "Authorization: Bearer token" https://www.example.com/api
- Получение HTTP- заголовков:
curl -I www.example.com
- Загрузка файла с сервера:
curl -O https://www.example.com/file.txt
- Сообщить серверу характеристики клиента:
curl -I http://localhost --user-agent "I am a new web browser"
- Сохранить файлы cookie веб-сайта:
curl --cookie-jar cookies.txt https://www.yandex.com/index.html -O
- Отправить файлы cookie веб-сайта:
curl --cookie cookies.txt https://www.yandex.com
Файлы Cookie - небольшие фрагменты данных, которые отправляются сервером и хранятся на компьютере пользователя. Использутся для хранения информации о пользователе (логин, пароль, местоположение, языковые настройки, сведения о товарах в корзине интернет-магазина и т.д.)

Kandinsky 2.1: Получение  печенек с удалённого сервера в режиме командной строки
Kandinsky 2.1: Получение печенек с удалённого сервера в режиме командной строки

Сей инструмент может быть полезен много где. Например, его можно применить сомместно с каим нибудь языком программирования (PHP, Perl, Python) в задачах парсинга (автоматического сбора и систематизации данных) веб-страниц. Но прежде чем погрузиться на космические корабли и отправиться бороздить просторы большого театра, думаю, не лишним будет взять на заметку ещё несколько полезных интуструментов по работе с сетями в Linux. И это такие команды как ifconfig, ip, route, ethtool. Они используются для настройки сети.

С помощью ethtool, например, можно узнавать и менять низкоуровневые параметры сетевой карты (настройки драйвера, режим подключения, скорость соединения, длину очереди передачи/приёма, статистику интерфейса). Синтаксис команды следующий: ethtool параметры интерфейс аргументы.

Получение информации о настройках сетевой карты с помощью команды ethtool
Получение информации о настройках сетевой карты с помощью команды ethtool

Примеры использования ethtool:
- Вывести текущие настройки сетевого интерфейса:
sudo ethtool enp3s0
- Отлключить автоматическое согласование параметров работы:
sudo ethtool -s enp3s0 autoneg off
- Установить скорость передачи данных:
sudo ethtool -s enp3s0 speed 10
- Установить режим приёмопередачи half duplex:
sudo ethtool -s enp3s0 duplex half
- Вывести информацию о драйвере сетевой карты:
sudo ethtool -i enp3s0
- Показать статистику интерфейса:
sudo ethtool -S enp3s0
- Получение параметров паузы (механизма Ethernet для уменьшения загруженности канала связи)
sudo ethtool --show-pause enp3s0
Autonegotiate- автосогласование, RX- пауза приёма, TX - пауза передачи
- Отключить автонастройку паузы:
sudo ethtool --pause enp3s0 autoneg off
- Отключить паузу для приёма:
sudo ethtool --pause enp3s0 rx off
- Отключить паузу для передачи:
sudo ethtool --pause enp3s0 tx off

Команды ip дублирует возможности ifconfig и многих других команд для настройки сети, поэтому в новых системах, как правило, пристутствует только она. Хотя в некоторых случаях быстрее использовать эти отдельные команды, поскольку они имеют более простой синтаксис.

Рассмотрим несколько примеров их использования.
- Отобразить все сетевые настройки:
ifconfig или ip a

Просмотр сетевых настроект с помощью команд ifconfig и ip.
Просмотр сетевых настроект с помощью команд ifconfig и ip.

- Добавить IP-адрес:
ifconfig enp3s0 add 192.168.1.100 или ip a add 192.168.1.100 dev enp3s0
- Удалить IP-адрес:
ifconfig enp3s0 del 192.168.1.100 или ip a del 192.168.1.100 dev enp3s0
-Добавить маску сети:
ifconfig enp3s0 netmask 255.255.255.0 или ip addr add 192.168.1.100/24 dev enp3s0
- Добавить MAC-адрес:
ifconfig enp3s0 hw ether 00:0c:29:33:4e:aa или ip link set dev enp3s0 address
00:0c:29:33:4e:aa
- Установить значения MTU на 2000:
ifconfig enp3s0 mtu 2000 или ip link set dev enp3s0 mtu 2000
- Установить длину очереди передачи:
ifconfig enp3s0 txqueuelen 1200 или ip link set dev enp3s0 txqueuelen 1200
- Включить promiscuous режим:
ifconfig enp3s0 promisc или ip link set dev enp3s0 promisc on
- Включить сетевой интерфейс:
ifconfig enp3s0 up или ip link set enp3s0 up
- Выключить сетевой интерфейс:
ifconfig enp3s0 down или ip link set enp3s0 down
- Включить протокол ARP для сетевого интерфейса:
ifconfig enp3s0 arp или ip link set enp3s0 arp on
- Включить протокол ARP для сетевого интерфейса:
ifconfig enp3s0 -arp или ip link set enp3s0 arp off

Команда route позволяет настраивать маршруты. В домашней сети это, как правило, сводится к указанию шлюза по умолчанию, например так: route add default gw gw-address

Добавление и удаление маршрутов с помощью команды route
Добавление и удаление маршрутов с помощью команды route

Параметр gw-address является IP-адресом шлюза по умолчанию, он должен быть адресом в локально подключённой сети, определённой адресом и маской одного из сетевых интерфейсов.
Чтобы удалить шлюз по умолчанию, можно воспользоваться командой:
route del -net default
Можно легко переопределить шлюз по умолчанию с помощью других маршрутов. Допустим, ваш компьютер находится в подсети 10.23.2.0/24, вы желаете попасть в подсеть 192.168.45.0/24 и знаете о том, что адрес 10.23.2.44 может выступать в роли маршрутизатора для этой подсети. Запустите такую команду, чтобы отправить трафик, связанный с адресом 192.168.45.0 на этот маршрутизатор:
route add -net 192.168.45.0/24 gw 10.23.2.44
Нет необходимости указывать маршрутизатор, чтбы удалить маршрут:
route del -net 192.168.45.0/24

Работа с маршрутизаторами зачастую намного сложнее, чем кажется. Для приведённого примера следует убедиться в том, что маршруты для всех хостов сети 192.163.45.0/24 могут привести обратно в сеть 10.23.2.0/24, а иначе первый добавленный вами маршрут окажется бесполезным.

Настройку маршрутов позволяет выполнять и команда ip:
sudo ip route add 43.143.5.25 via 192.168.1.1
Сначала указывается IP адрес цели, а затем шлюз в локальной сети, через который можно достичь этого адреса. Но такие маршруты будут активны только до перезагрузки. Чтобы они сохранились, их нужно добавить в файл конфигурации. В Ubuntu начиная с версии 18.04 за сетевые настройки отвечает программа Netplan и соответствующие файлы настроек должны находиться в каталоге /etc/netplan. настройки для этой программы написаны на языке YAML и пример, который используется по умолчанию, можно просмотреть открыв файл 01-network-manager-all.yaml.

Настройка сети при помощи програмы netplan
Настройка сети при помощи програмы netplan

Имя конфигурационного файла може быть любым, главное чтобы оно оканчивалось на .yaml. Внутри -текст с описанием блоков и вложенных в них параметров:
-
network: блок начала конфигурации
-
version: версия YAML
-
renderer: используемый сетевой менеджер NetworkManager (можно указать другой - networkd)
Можно отредактировать этот файл добавив другие блоки и параметры. Например:
-
ethernets: настройки сетевых инерфейсов
-
dhcp4: будет ли получать IP-адрес автоматически
-
addresses: задание IP адресов
-
routes: насройка маршрутов
-
mtu: значение mtu
-
nameservers: настройка серверов имён (DNS)
-
bridges: настройки для сетевых мостов, позволяющих пропускать сетевой трафик с одного сетевого интерфейса на другой
-
wifis: настройки WiFi.

Взаимоотношения Netplan с другими сетевыми компонентами и пример отредактированного файла конфигурации
Взаимоотношения Netplan с другими сетевыми компонентами и пример отредактированного файла конфигурации

В каталоге /etc/netplan можно создать собственные файлы конфигурации Netplan и указать необходимые настройки маршрутизациим и всего остального. Для проверки нужно ввести команду: netplan --debug generate
Для применения настроек: netplan apply.

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

Kandinski 2. Linux, сети и датацентры - вместе веселей.
Kandinski 2. Linux, сети и датацентры - вместе веселей.

В подготовке материала помимо меня и Балабобы Яндекса были использованы:
Брайан Уорд "Внутрннее устрйоство Linux".
Уильям Шоттс "Командная строка Linux".
Алексей Стахнов "Сетевое администрирование Linux".
Дуглас Э. Камер "Сети TCP/IP".
Сетевые ресурсы habr.com, opennet.ru, losst.pro и других.

Все картинки, взятые из Интернет, принадлежат их авторам.