Анализ компьютерных сетей
Доброго времени суток, хабровчане! Недавно я защитил свой проект "Анализ компьютерных сетей" и решил поделиться этим самым проектом с вами.
Компьютерные сети – неотъемлемая часть современной жизни. В момент полной цифровизации государств, знание работы сетей становится обязательным для всех IT-специалистов и даже обычных людей. Очень сильно популяризируются сервисы VPN/Proxy, туториалы по созданию своих VPN/Proxy серверов, методы защиты конфиденциальной информации.
Темой моего проекта является анализ компьютерных сетей. Актуальность проекта заключается в том, что в эпоху, когда многие компании собирают данные, а иногда хакеры могут перехватить наш трафик, знание работы сетей становится особенно важно. Просто необходимо позаботиться о безопасности своих данных. Например, быть уверенным, что какая-либо корпоративная сеть не прослушивается злоумышленниками. Информационная безопасность сегодня — это не просто мода, а насущная необходимость. Постоянно растет киберпреступность, и защита трафика от перехвата — это основной аспект цифровой жизни человека или бизнеса.
Проблема проекта – в современное время все мы пользуемся сетями. Но не всегда мы знаем, как исправлять неполадки и анализировать сеть на угрозы.
Для решения этой проблемы я планирую исследовать работу и устройство базовых протоколов, механизмы передачи данных и шифрования, анализировать существующие решения для шифрования трафика, обмена сообщениями и анализа сетей, а также самому создать программу для анализа сети на компьютере. Эта программа и является продуктом проекта. Программа будет написана на языке программирования Python, что позволит в будущем легко портировать программу на другие платформы, кроссплатформенную библиотеку PySide6, использующая Qt 6. Для построения интерфейса и внешнего вида я применю знания CSS и программу Qt Designer. Данный продукт будет полезен разработчикам, системным администраторам, специалистам информационной безопасности. Продукт можно использовать для выявления подозрительных пакетов, устройств, сканирования портов IP-адреса, информация о сети и компьютере, статус связи, и другие вспомогательные утилиты для взаимодействия с сетью или работой с протоколами.
Цель проекта – изучить устройство компьютерных сетей и применить знание на практике, создав Desktop-программу для анализа сети.
Задачи проекта:
1. Изучить устройство основных протоколов, стек TCP/IP;
2. Изучить работу DNS-серверов;
3. Изучить работу HTTP/HTTPS;
4. Изучить сетевые протоколы SSH, ftp, telnet;
5. Изучить методы анализа сетевого трафика;
6. Изучить работу с сетями на языках программирования C, Python, Rust;
7. Написать программу для базового анализа сети и взаимодействия с ней;
8. Изучить DPI;
9. Изучить модель OSI и TCP/IP;
10. Исследовать работу сетей.
Рассмотрим, где используются сети в современном мире:
1. Веб-сайты – URL-адреса маршрутизируются через DNS-сервера, мы посылаем HTTP/HTTPS.
2. Сетевые устройства – различные принтеры или IP-камеры.
3. Резервное копирование – часто в компаниях используют один большой сервер с резервными копиями.
4. VoIP - Телефония, работающая по протоколу IP. Применяется она сейчас повсеместно, так как проще, дешевле традиционной телефонии и с каждым годом вытесняет ее.
5. Приложения и программы – сейчас практически все программное обеспечение работает со своими серверами.
В этом проекте я хочу рассказать о базисе работы компьютерных сетей:
· Модель OSI;
· Стек протоколов TCP/IP, UDP;
· Защищенные протоколы TLS/SSL, SSH;
· Как работают DNS-сервера;
· Как работает блокировка пакетов по DPI
· IPv4 и IPv6 сети
· Примеры работы и анализа сети на языках программирования C, Rust, Python.
Давайте разберемся с основополагающими понятиями – что такое сеть, протокол, и т.д.
Протокол – это набор правил и соглашений, которые определяют формат и порядок работы узлов сети.
DNS (англ. Domain naming system - система доменных имён) — система, которая преобразует доменные имена в IP-адреса, позволяя устройствам находить веб-сайты и другие сетевые ресурсы и подключаться к ним.
Сеть – это ряд подключенных устройств, способные взаимодействовать друг с другом.
Узел – устройство, которое является частью сети.
IP-адрес – уникальный цифровой идентификатор с размером 32 бита у IPv4 и 128 битов у IPv6.
Маршрутизатор – это устройство, которое управляет трафиком между различными сетями, направляя пакеты данных от одной сети к другой.
Коммутатор – устройство в сети, задачей которого является соединения других устройств и налаживания отправки и приема данных между ними.
Брандмауэр – устройство безопасности или программное обеспечение, которое отслеживает и контролирует входящий и исходящий сетевой трафик на основе набора предопределённых правил безопасности.
LAN (локальная сеть) – сеть, которая соединяет устройства в пределах ограниченной географической зоны, такой как дом, офис или здание.
WAN (глобальная сеть) – сеть, соединяющая устройства на большой территории.
MAC-адрес – это еще один уникальный идентификатор устройства в сети. В отличии от IP-адреса, MAC-адрес является физическим, а IP присваивается виртуально.
Разберем подробнее несколько важных определений.
Маршрутизатор нужен для соединения двух и более локальных сетей в одну. Его задачей станет определение путей отправления пакетов данных. Маршрутизатор работает на 3 уровне модели OSI (я рассмотрю ее позже). Именно на этом уровне и происходит распределение пакетов данных между участниками сети по их путям передачи.
Коммутатор занимается же перенаправлением данных в пределах именно одной сети. Работает коммутация на уровень ниже, чем маршрутизация – на канальном (L2) уровне модели OSI. Этот уровень должен обеспечивать надежную передачу данных через физический канал и занимается обнаружением и исправлением ошибок. Также он работает с MAC-адресами.
Разберем несколько базовых сетевых протоколов.
Существуют следующие протоколы:
HTTP — согласно ему, браузер формирует сообщение для сервера;
DNS — согласно ему, браузер узнает IP-адрес сайта по его доменному имени;
TCP — согласно ему, устанавливается соединение и гарантируется целостность передачи данных;
IP — согласно ему, осуществляется адресация в сети;
Ethernet — согласно ему, осуществляется физическая передача данных между устройствами в сети.
FTP — согласно ему, компьютеры могут передавать друг другу файлы по сети.
SMTP — согласно ему, сервера маршрутизирует электронную почту в сети.
UDP — протокол, ориентированный на отправку дейтаграмм (небольших блоков данных) без установления соединения. Он не гарантирует доставку пакетов и не восстанавливает потерянные данные. Зато UDP проще и быстрее чем TCP. А TCP уже предоставляет гарантии доставки пакетов, их упорядочивания и восстановления при ошибках. Этим они и тяжелее UDP.
ARP (address resolution protocol) – это один из самых важнейших протоколов, он позволяет определить MAC-адрес устройства по его IP.
Сети устроены так, что ни одно устройство в нем не начнет отправлять данные, если MAC-адрес целевого шлюза или узла неизвестен. Вот здесь и пригождается ARP. Работает он примерно так:
1. Устройство отправляет ARP-запрос на широковещательный MAC-адрес.
2. Все устройства в сети получают этот запрос.
3. Устройство, чей IP-адрес совпадает с нужным, отправляет ARP-ответ, содержащий свой MAC-адрес.
4. Устройство-отправитель извлекает из него MAC-адрес и записывает его в ARP-таблицу MAC-адресов.
IPv4 (Internet Protocol version 4) – один из основных и самых распространенных протоколов для работы устройств в сети.
ICMP (internet control message protocol) – это специальный протокол, созданный чтобы уведомлять об ошибках и рассылать прочую информацию для дебаггинга успехов или неудач при работе с данными между устройствами в сети. Как можно понять из определения, он редко используется для передачи данных, чаще всего для проверки связи между двумя устройствами. Например, утилита ping.
Перейдем непосредственно к изучению работы сетей – начнем с детального рассмотрения популярных протоколов, модели OSI, а после займемся практической частью: работой с сетью на языках программирования Rust, Python, C.
Классификация сетей, модель OSI

Модель OSI и TCP/IP является основой и базой для погружения в работу сетей. Они позволяют более точно изучить работу сетевых устройств и их отличия.
Модель OSI – эта эталонная модель для описания работы сетевых систем. Эта модель позволяет разделить процесс сетевого взаимодействия на 7 связанных уровней. Каждый уровень выполняет специфичные для него требования и взаимодействует с уровнями выше и ниже. Хотя стандартная модель OSI предполагает 7 уровней, администраторы чаще всего работают со вторым, третьим, четвёртым уровнями и объединяют 5, 6 и 7 уровни в один, чаще всего называя седьмым. Ядро ОС отвечает за реализацию физического, канального, сетевого и транспортного уровней, предоставляя прикладным программам унифицированный интерфейс для работы с сетью.

Проблема ее была только в том, что ее разрабатывали около 7 лет. Пока специалисты спорили, как ее лучше сделать, другие модели модернизировались и набирали обороты. В настоящее время модель OSI не используют. Она применяется только в качестве обучения сетям.
Самое главное – понимать, что нельзя перепрыгнуть с одного уровня на другой, данные должны передаваться с нижнего на верхний или с верхнего на нижний уровень. Такие процессы получили название инкапсуляция (с верхнего на нижний) и деинкапсуляция (с нижнего на верхний).
Как было написано выше, модель OSI в наше время не используется. Пока разрабатывалась эта модель, все большую популярность получал стек протоколов TCP/IP. Он был значительно проще и завоевал быструю популярность.

Модель и стек протоколов TCP/IP

Модель TCP/IP почти полностью повторяет модель OSI, но значительно ее упрощая.
Первый уровень – канальный. В данной модели он объединяет L1 и L2 уровни модели OSI.
Второй уровень – межсетевой. Он идентичен сетевому уровню L3 модели OSI.
Третий уровень – транспортный. Он полностью повторяет транспортный уровень L4 модели OSI.
Четвертый уровень – прикладной. Он объединяет L5 – L7 уровни модели OSI.

Большинство действующих стандартов интернета и протоколов TCP/IP регламентируются документами Request For Comments (RFC).
Существуют следующие протоколы:
HTTP — согласно ему, браузер формирует сообщение для сервера;
DNS — согласно ему, браузер узнает IP-адрес сайта по его доменному имени;
TCP — согласно ему, устанавливается соединение и гарантируется целостность передачи данных;
IP — согласно ему, осуществляется адресация в сети;
Ethernet — согласно ему, осуществляется физическая передача данных между устройствами в сети.
FTP — согласно ему, компьютеры могут передавать друг другу файлы по сети.
SMTP — согласно ему, сервера маршрутизирует электронную почту в сети.
UDP — протокол, ориентированный на отправку дейтаграмм (небольших блоков данных) без установления соединения. Он не гарантирует доставку пакетов и не восстанавливает потерянные данные. Зато UDP проще и быстрее чем TCP. А TCP уже предоставляет гарантии доставки пакетов, их упорядочивания и восстановления при ошибках.
Transmission Control Protocol/Internet Protocol (Стек протоколов TCP/IP) — если сказать простым языком, это набор взаимодействующих протоколов разных уровней, согласно которым происходит обмен данными в сети. Каждый протокол — это набор правил, согласно которым происходит обмен данными. Итого, стек протоколов TCP/IP — это набор наборов правил. Множество протоколов можно классифицировать по сетевым уровням, на котором они работают. Наиболее распространенные сетевые модели — это OSI и TCP/IP.
В критичных системах (например DNS) чаще используется UDP. Здесь важна скорость, а не гарантия доставки. Пока отправится TCP пакет, UDP пакет уже успеет три раза вернуться. А в других приложениях, где более важна целостность данных, а не скорость, применяется TCP.
· Узел сети — это устройство, являющееся частью компьютерной сети. Узлы можно разделить на оконечные и промежуточные:
· Оконечные узлы — это узлы, которые отправляют и/или принимают какие-либо данные. Простыми словами, это устройства, которые являются получателем или источником информации.
· Промежуточные узлы — это узлы, которые соединяют оконечные узлы между собой.
Например, смартфон через Wi-Fi отправляет запрос к серверу. Смартфон и сервер — оконечные узлы, а Wi-Fi-роутер — это промежуточный узел.
IP-сеть представляют собой совокупность связанных между собой хостов-узлов. Связь между хостами может осуществляться либо напрямую, либо через промежуточные устройства, которые мы рассмотрели ранее – коммутаторы и маршрутизаторы.
Для приема данных из сети и их последующей передачи узел использует различные интерфейсы.
Передаваемое сообщение может быть представлено в виде UDP-датаграммы или TCP-сегмента, которое состоит из заголовка и полезной нагрузки. Чтобы отправить сообщение через IP-сеть, оно заключается в IP-датаграмму. Каждому физическому интерфейсу соответствует определенный размер порции данных, который не должен превышать максимально допустимый размер (MTU). Если размер IP-датаграммы превышает этот лимит, происходит фрагментация и создаются несколько IP-пакетов; в противном случае формируется единственный IP-пакет для всей датаграммы.
IP-пакет, согласно маршрутизационной таблице хоста, передается через выбранный логический интерфейс.
Каждый IP-адрес представляет собой набор, как мы уже говорили, из 32 бит в v4 и 128 бит в v6. Первые N бит данного адреса указывают на принадлежность к определенной сети, тогда как остальные биты служат для уникальной идентификации устройства в рамках этой сети. Тем не менее, существуют специальные значения для адресов, состоящих полностью из нулей или единиц. Адрес, в котором все биты равны 0, обозначает сеть, в то время как адрес, заполненный единицами, является широковещательным адресом.
Сам стек TCP/IP базирован на следующих протоколах, часть которых мы уже рассмотрели:
· Ethernet II - Ethernet-фрейм содержит MAC-адрес получателя, MAC-адрес отправителя, тип фрейма и сами данные.
· IP (Internet Protocol) – Протокол IP позволяет передавать данные порциями. IP-датаграмма — это те данные, которые передаются на сетевой уровень, а IP-пакет — это те данные, которые передаются в IP-сети.
· ICMP (Internet Control Management Protocol) –протокол, предназначенный для отправки сообщений об ошибках и передачи служебной информации, которая указывает на успех или неудачу при обмене данными с другим IP-адресом.
· UDP (User Datagram Protocol) – Протокол позволяет двум процессам обмениваться UDP-датаграммами. Каждая UDP-датаграмма содержит в себе порт отправителя (Source Port), порт получателя (Destination Port), длину дейтаграммы (Length), контрольную сумму (checksum) и, собственно, сами передаваемые данные.
· TCP (Transmission Control Protocol) – Сообщения, используемые в протоколе TCP, называются TCP-сегментами. Просьба не путать с сегментами сети. Они с ними не имеют ничего общего. При расчёте контрольной суммы для TCP-сегмента, как и в UPD используется псевдозаголовок. Но если для UDP расчёт контрольной суммы не является обязательным, то для TCP он обязателен.
· DHCP (Dynamic Host Configuration Protocol) – протокол существует для настройки работы в сети TCP/IP. Для этого нужно указать IP-адрес и маску подсети (маска подсети — битовая маска, позволяющая разделить IP-адрес на адрес подсети и адрес узла (хоста, компьютера, устройства) внутри этой подсети). Также иногда необходимо указать адрес DNS-сервера. DHCP позволяет хосту получить эти данные автоматически.
· DNS (Domain Name Service) – позволяет получить IP-адрес и прочую информацию по доменному адресу сервера.
Защищенные протоколы TLS/SSL, HTTPS, SSH
Для того, чтобы безопасно обмениваться информацией, были созданы специальные зашифрованные протоколы.
Для безопасной передачи данных между узлами в сети есть специальный защищенный протокол TLS (Transport Layer Security) / SSL (Secure Socket Layers). Цель протокола — обеспечить шифрование данных при передаче.
Протокол Secure Sockets Layer (SSL) появился на свет благодаря компании Netscape, в 1995 году. Его целью была обеспечение безопасной передачи данных между клиентом и сервером в интернете. Насчитывается несколько версий SSL, каждая из которых более безопасная, чем предыдущая.
В 1999 году его заменили на TLS (Transport Layer Security). Но до сих пор упоминают термин SSL для обозначения обоих протоколов.
Сайт, где используют SSL/TLS-протокол, отличается тем, что его URL-адрес начинается с «HTTPS», а не «HTTP», что свидетельствует о защищенном соединении.
Некоторая информация о работе SSL/TLS выше и ниже взята с моей статьи «Большое руководство по сетям и шифрованию в Linux (часть 1)» - https://habr.com/ru/companies/timeweb/articles/832302/.

TLS и SSL используют:
· Ассиметричная криптография для аутентификации. Кстати, этот тип шифрования более ресурсоемкий, поэтому его комбинируют с симметрическим шифрованием.
· Симметричное шифрование для конфиденциальности.
· Коды аутентичности сообщений для сохранения целостности сообщений.
Небольшая сноска о том, что такое симметричное и ассиметричное шифрование.
Симметричная криптография – это тип криптографии, в котором и для шифрования, и для расшифровки данных используется только один ключ. И получатель, и отправитель должны иметь копию секретного ключа.
Ассиметричная же криптография более сложная, но более безопасная – используется сразу два ключа. Один открытый, другой закрытый. Перед отправкой данные шифруются через открытый ключ, который должен быть и у отправителя, и у получателя. А закрытый ключ для расшифровки есть только у получателя. Поэтому никто, кроме него, не может прочитать отосланные ему данные.
Протокол TLS/SSL широко используется в приложениях, работающих с сетью. Вообще, можно сказать, что это одно и тоже, ведь с версии 3.0 SSL появился его приемник — TLS, но название так прижилось, что до сих пор под SSL чаще всего подразумевают TLS.
Когда пользователь заходит на какой-то сайт по HTTPS, браузер запрашивает сертификат у сервера, который высылает копию SSL-сертификата с открытым ключом шифрования. После браузер проверяет и подтверждает этот сертификат. Кроме того, проверяется дата действия сертификата и наличие корневого сертификата, выданного надежным центром сертификации. Если браузер доверяет сертификату, то он генерирует предварительный секрет (pre-master secret) сессии на основе открытого ключа, используя максимально высокий уровень шифрования, который поддерживают обе стороны. Сервер расшифровывает предварительный секрет с помощью своего закрытого ключа, соглашается продолжить коммуникацию и создать общий секрет (master secret), используя определенный вид шифрования. Теперь обе стороны используют симметричный ключ, который действителен только для данной сессии. После ее завершения ключ уничтожается, а при следующем посещении сайта процесс рукопожатия запускается сначала.
Принцип работы SSL и TLS — практически один и тот же. Поверх протокола TCP/IP устанавливается защищенный канал, внутри которого передаются данные по прикладному протоколу (HTTP, DNS, FTP, SMTP и другие).
Прикладной протокол находится в канале TLS/SSL, а тот в свою очередь уже в TCP/IP. По сути, данные передаются именно по TCP/IP, но суть в том, что данные зашифрованы, и расшифровать их может только машина, которая установила соединения.
Установка соединения обеспечивается в несколько этапов:
1. Клиент устанавливает соединение с сервером и запрашивает защищенное подключение. Это может обеспечиваться установлением соединения на порт для SSL/TLS (по умолчанию 443), либо дополнительны запросом клиентом установки защищенного соединения после установки обычного.
2. При установке соединения клиент предоставляет список алгоритмов шифрования, которые доступны. Сервер сверяет их со своим списком, и после выбирает самый надежный алгоритм, после чего сообщает его клиенту.
3. Сервер отправляет клиенту свой цифровой сертификат (который подписан удостоверяющим центром) и открытый ключ сервера.
4. Клиент, при желании может проверить сертификат сервера. Он связывается с сервером доверенного центра и проверяет, валиден ли он. Желательно клиенту обязательно проверять, чтобы избежать ARP-спуфинга. Злоумышленник в этом типе кибератак может выступать, как и клиентом, так и сервером.
5. Генерируется ключ сеанса для защищенного соединения. Генерация происходит так:
· клиент генерирует случайную последовательность из чисел;
· клиент шифрует ее открытым ключом сервера и посылает результат на сервер;
· сервер расшифровывает полученную последовательность при помощи закрытого ключа.
Учитывая, что алгоритм шифрования ассиметричный, расшифровать последовательность может только сервер. В основе ассиметричного шифрования — два ключа (приватный и публичный). Публичным ключом сообщение шифруется, а приватным расшифровывается. Расшифровать ключ при помощи публичного ключа нельзя.
6. Таким образом устанавливается зашифрованное соединение. Данные, передаваемые по нему, шифруются и расшифровываются до тех пор, пока соединение не будет разорвано.
Цель хеш-алгоритма – преобразовать SSL-сертификат в битовую строку фиксированной длины.
В основе хеширования лежит хеш-функция. Это функция преобразования данных любой длины в данные заданной длины и почти гарантирует безопасность данных.
Хеш-алгоритм также применяет код аутентификации сообщения (MAC), который необходим для проверки целостности пересылаемых данных. MAC использует хеш-функцию для представления данных сообщения как значение фиксированной длины, после чего производится хеширование сообщения.
В протоколе TLS применяется HMAC (хешированный код аутентификации сообщения). Его основное отличие заключается в использовании хеш-функции вместе с общим секретным ключом, что делает ключ частью данных. Для подтверждения подлинности обеим сторонам необходимо использовать идентичные ключи.
На данный момент поддерживается хеширование по алгоритму SHA2, наиболее часто используется SHA-256. Этот алгоритм достаточно безопасен и менее громоздок по сравнению с SHA-512: длина слова SHA-512 составляет 64 бита, тогда как у SHA-256 — 32 бита. Также другие параметры больше: количество раундов составляет 80 (вместо 64), а сообщение делится на блоки по 1024 бита (вместо 512 бит). Ранее использовались алгоритмы SHA1, MD5 и другие, но сейчас они считаются уязвимыми. Тем не менее, иногда можно встретить хеши MD5 даже в настоящее время.
Рассмотрим также SSH (в контексте его будет пониматься OpenSSH).
SSH (Secure Shell) — это протокол прикладного уровня для безопасного обмена информацией между двумя устройствами. При передаче по SSH информация шифруется, поэтому протокол используется для работы в незащищённых сетях, чтобы обеспечить высокий уровень защиты.
Проще говоря, ssh дает возможность безопасного соединения с сервером и работы с ним. Работает он на 22 порту.
Итак, защищенные протоколы очень часто используются в современном мире. Сайты без https уже почти и не встретишь, а почти все мессенджеры используют шифрование сообщений.
Как работает блокировка по DPI
В последнее время участилась цензура в интернете, и не только в российской. Один из самых ярких примеров – постепенная блокировка YouTube. Изначально РКН говорил о том, что неполадки на серверах Google Global Cache, но потом признался, что YouTube блокируют.
Но как же работает эта блокировка? Сама блокировка фильтрует трафик через прореху в расширении SNI протокола TLS.
Эта блокировка явно не подстроена третьими лицами, ибо право свободного распространения информации закреплено в пункте 4 статьи 29 Конституции РФ.
Также существует федеральный закон, принятый в 2019 году, согласно которому, каждый оператор связи должен установить у себя ящики ТСПУ (технические средства противодействия угрозам), а отчитываться об этом в «федеральный орган исполнительной власти, осуществляющий функции по контролю и надзору в сфере средств массовой информации, массовых коммуникаций, информационных технологий и связи», то есть Роскомнадзор. При этом все ТСПУ находятся под управлением Центра мониторинга и управления сетью связи общего пользования (ЦМУ ССОП), созданного на базе ФГУП «ГРЧЦ». Фактически, ЦМУ ССОП – это техническое подразделение Роскомнадзора.
Ядро и центральный элемент ТСПУ – это сервер DPI. DPI (англ. Deep Packet Inspection) – технология, подразумевающая глубокий анализ, обработку, фильтрацию и подмену пакетов в режиме реального времени.
Глубокий в данном определении означает что проверка идет на всех уровнях модели OSI, с верхнего до нижнего, или пока не будет достигнут уровень без шифрования.
Как только DPI стал более-менее популярен, к этому стали подключаться провайдеры, а позже и государство. Любое государство с бюджетом и целью начало открыто противодействовать сначала запрещенным сайтам, а позже использовать DPI как метод интернет-цензуры.
Рынок устройств DPI стремительно растет, и в 2019 году он оценивался в 8,7 млрд долларов США, а стабильный ежегодный рост по оценкам составляет около 8%.
Собственно, из-за того, что в России DPI-оборудование только локализируют и настраивают, а не производят, закупают его в других странах, включая даже санкционные.
Для обхода DPI создано два Open-Source решения: GoodbyeDPI и Zapret (https://github.com/bol-van/zapret).
Zapret работает путём обфускации трафика. Программа изменяет сетевые пакеты таким образом, чтобы провайдер не мог определить, что пользователь пытается получить доступ к заблокированному ресурсу.
Zapret особенно эффективен для обхода DPI (глубокий анализ пакетов), который используется провайдерами для фильтрации контента. Программа не является VPN, а значит, не шифрует весь трафик, а лишь маскирует его для обхода фильтров.
GoodbyeDPI работает за счёт манипуляции заголовками пакетов с целью «обмануть» DPI-системы.
Программа использует несколько методов:
· Фрагментация заголовков пакетов. Программа разбивает заголовки пакетов на несколько частей. DPI-системы, рассчитывающие на стандартные, правильно сформированные заголовки, могут не распознать такие пакеты и не применят к ним блокировки или замедления.
· Подмена флагов TCP. Программа может изменять флаги TCP (например, флаг FIN или RST), чтобы DPI-системы не корректно интерпретировали установление соединений и не смогли эффективно блокировать трафик.
· Модификация SNI-заголовка. Программа может изменять SNI-заголовок, делая его нечитаемым для DPI-системы, но при этом он остаётся валидным для конечного сервера.
· Удаление SNI-заголовка. GoodbyeDPI может полностью удалять SNI-заголовок из TLS-запроса, что делает его невидимым для DPI-системы.
DPI блокировка ведется на уровне шифрования и системных протоколов, и пока она не может противодействовать разрозненным пакетам как методу обхода.
Работа с сетью на языке программирования C/Rust/Python
В этом разделе я рассмотрю работу и анализ сетевых инфраструктур на языках программирования C, Rust, Python.
Почему именно они?
1. C – компилируемый низкоуровневый язык. Является базой в программировании, т.к. он задал основные тренды развития. На нем написана большая часть ядра Linux, что позволяет работать с сокетами в Linux на низком уровне. Минус – это его простота, многое приходится создавать самому.
2. Python – популярный кроссплатформенный интерпретируемый язык программирования. Для него существует множество библиотек для работы и анализа сети – например, scapy.
3. Rust – популярный новый язык программирования, memory-safe, низкоуровневый. Часто применяется как альтернатива C в системном программировании.
Как я уже говорил, для создания GUI-программы я выбрал Python. В Python есть множество библиотек, которые помогают работать с сетями, а также есть C-расширения.
Но для начала разберемся с низкоуровневыми языками программирования.
В качестве примера я напишу код на Windows Sockets, на языке программирования C. Данная программа при компиляции позволит посылать простейшие GET-запросы на указанный IP-адрес.
Изображение листинга кода хранится в приложении под номером 7.
Исходный код доступен по ссылке из моего репозитория: https://github.com/alexeev-prog/network_programming/blob/main/c/getclient.c
При запуске он позволяет читать ответ сервера на отправленный GET-запрос.
Код работает следующим образом:
1. Подключение необходимых библиотек: В начале мы подключаем библиотеки, которые нам нужны. winsock2.h — это библиотека, которая предоставляет функции для работы с сокетами в Windows.
2. Инициализация Winsock: перед тем, как мы начнем использовать сокеты, необходимо инициализировать библиотеку Winsock, что мы и делаем с помощью функции WSAStartup. Если инициализация завершилась неудачей, программа завершится с ошибкой.
3. Настройка соединения: Мы создаем структуру addrinfo, которая содержит информацию о типе соединения, протоколе и других параметрах. В нашем случае мы хотим использовать IPv4 и TCP.
4. Получение адресов: С помощью getaddrinfo мы запрашиваем IP-адрес для заданного хоста. Эта функция превращает доменное имя или IP-адрес в структуру, содержащую информацию об адресе, необходимую для подключения.
5. Создание сокета: Мы создаем сокет с помощью функции socket. Это своего рода "канал" для связи между компьютерами. Если создание сокета не удалось, программа также завершится с ошибкой.
6. Подключение к серверу: теперь, когда у нас есть сокет, мы можем подключиться к серверу с помощью функции connect, используя адрес, полученный ранее. Если подключение не удалось, сокет будет закрыт, и снова выведем сообщение об ошибке.
7. Формирование GET-запроса: Мы создаем строку с нашим GET-запросом к серверу. Этот запрос говорит серверу, что мы хотим получить обычно главный документ (например, HTML-страницу) с заданного адреса.
8. Отправка запроса: с помощью функции send мы отправляем сформированный GET-запрос на сервер.
9. Получение ответа: после отправки запроса мы будем получать ответ от сервера. Мы используем recv, чтобы получать данные в цикле, пока сервер отправляет нам информацию. Мы добавляем нулевой терминатор к строке, чтобы сделать её удобной для печати.
10. Закрытие сокета: после завершения работы с сокетом мы его закрываем и очищаем ресурсы с помощью функции WSACleanup.
11. Главная функция: В main мы проверяем, передан ли аргумент командной строки (IP-адрес). Если нет, программа завершится с выводом сообщения о правильном использовании. Затем вызываем функцию, которая отправляет GET-запрос на указанный IP-адрес.
В итоге код делает следующее: берет IP-адрес, подключается к серверу, отправляет GET-запрос и получает ответ от сервера, который затем печатает на экран. Это основной принцип работы с сокетами — мы устанавливаем соединение, отправляем и получаем данные между клиентом и сервером.
Также доступен код клона утилиты ping на C++ для Linux, доступный по ссылке https://github.com/alexeev-prog/network_programming/blob/main/cpp/ping.cpp. Из-за технических ограничений по операционной системе в я не буду объяснять принцип работы сетей под Linux, в данном проекте я обозреваю либо кроссплатформенные решения, либо Windows-only решения.
Перейдем к языку программирования Rust.
Для работы с сетевыми компонентами в Rust используются библиотеки. Все функции, связанные с сетью, расположены в пространстве имен std::net; для чтения и записи в сокеты также используются функции чтения и записи из std::io. Наиболее важной структурой здесь является IpAddr, представляющий собой общий IP-адрес, который может быть либо версии 4, либо 6. SocketAddr, который представляет собой общий адрес сокета (комбинацию IP и порта на хосте), TcpListener и TcpStream для обмена данными по протоколу TCP, UdpSocket для UDP и многое другое.
Так, если мы хотим начать слушать порт 8090 на рабочей машине, то выполнить это можно с помощью следующей команды:
let listener = TcpListener::bind("0.0.0.0:8090").expect("Could not bind");
А код полноценного TCP эхо-сервера на Rust можно найти по ссылке в моем репозитории: https://github.com/alexeev-prog/network_programming/blob/main/rust/http_echo_server.rs
Перейдем к Python и практической части.
Практическая часть
В этой части я расскажу о программе на Python.
Функционал программы будет заключаться в следующем:
1. Сканирование портов;
2. Анализ пакетов и выявление подозрительной активности;
3. Сохранение отчетов;
4. Информация о сети;
5. Проверка, есть ли IP в черных списках DNS;
6. Удаленная командная оболочка;
7. Информация о домене по IP-адресу
8. Вспомогательные мелкие сетевые утилиты.
В будущем я планирую добавить сканер сайтов на наличие базовых уязвимостей.
Данная программа будет поддерживать многопоточность. GUI будет написан на PySide6 – библиотеке для построения графического интерфейса на основе Qt 6.
Интерфейс программы будет реализован в программе Qt Designer.
В программе будет 6 вкладок:
· Сканер портов;
· Анализ активности пакетов;
· Информация о сети;
· Удаленная командная оболочка;
· Сетевые утилиты;
· Справка.
В сканере портов собственно функционал для сканирования серверов на открытые порты.
Во вкладке «Анализ активности пакетов» будет два списка анализированных пакетов: нормальные и подозрительные.
В следующей вкладке, «Информация о сети» отображается общая характеристика сетевой инфраструктуры и устройства в сети.
В «Сетевые утилиты» несколько вспомогательных утилит для сбора различной информации, например домен по IP.
В последней вкладке «Справка» отображена общая информация о программе.






Источники
1. Rust в действии // Макнамара Тим // издательство в России «БХВ», оригинальное издательство «Manning» // 2023 год
2. Большое руководство по сетям и шифрованию трафика в Linux (часть 1) - https://habr.com/ru/companies/timeweb/articles/832302/ (моя статья)
3. Большое руководство по сетям и шифрованию трафика в Linux (часть 2) - https://habr.com/ru/companies/timeweb/articles/836062/ (моя статья)
4. Путь пакета через ядро Linux - https://habr.com/ru/articles/886058/
5. Сетевое программирование на Python // Галбрейт Дж. // издательство в России «БХВ», оригинальное издательство «BPB Publications» // 2022 год
6. Сложно о простом. Модель OSI и TCP/IP - https://habr.com/ru/articles/820419/
7. Сложно о простом. Самые популярные протоколы и принципы их работы. ARP, ICMP, IGMP, TCP, UDP, SCTP, DNS и DHCP. Часть 1 - https://habr.com/ru/companies/timeweb/articles/848604/
8. Передача данных по сети. Стек протоколов TCP/IP. - https://python-course.readthedocs.io/projects/year2/en/latest/lessons/06-protocols.html#id3
9. Основы компьютерных сетей. Тема №1. Основные сетевые термины и сетевые модели - https://habr.com/ru/articles/307252/
10. Сложно о простом. Как работает интернет. Часть 1. Что такое коммутатор, маршрутизатор и примеры работы простых сетей - https://habr.com/ru/companies/timeweb/articles/871308/
11. Сложно о простом. Как работает интернет. Часть 2. Что такое сеть, маска подсети, сегментация сети с помощью VLAN и маски - https://habr.com/ru/companies/timeweb/articles/874768/
12. Сложно о простом. Как работает интернет. Часть 3. Что такое маршрутизация, Proxy ARP и Super VLAN - https://habr.com/ru/companies/timeweb/articles/880914/
13. Разбираемся с сетевым программированием на Rust - https://habr.com/ru/companies/otus/articles/846346/
14. Выгодоприобретатели блокировки YouTube - https://habr.com/ru/articles/847008/
15. Протоколы семейства TCP/IP. Теория и практика - https://habr.com/ru/companies/ruvds/articles/759988/
16. «Как это работает»: знакомство с SSL/TLS - https://habr.com/ru/companies/1cloud/articles/326292/
Исходники, различные документы доступны в моем телеграм-канале. Если хотите, присоединяйтесь, там я публикую анонсы новых статей и полезный материал.