УДК 002.304

Развертывание и анализ протокола WireGuard ОС Альт

Бойко Артемий Алексеевич – студент факультета Комплексной безопасности топливно-энергетического комплекса Российского государственного университета нефти и газа (национального исследовательского университета) имени И. М. Губкина.

Загорский Александр Леонидович – студент факультета Комплексной безопасности топливно-энергетического комплекса Российского государственного университета нефти и газа (национального исследовательского университета) имени И. М. Губкина.

Научный руководитель Уймин Антон Григорьевич – старший преподаватель Российского государственного университета нефти и газа (национального исследовательского университета) имени И. М. Губкина.

Аннотация: Существует множество различных коммуникационных протоколов, которые появились в разное время. Каждый из этих протоколов имеет ряд как различных преимуществ, так и некоторых недостатков. Протоколы виртуальной частной сети (Virtual Private Network – VPN) необходимы для создания безопасного зашифрованного соединения через общую сеть [2].

Одним из таких протоколов является WireGuard – это современный протокол для создания виртуальной части сети с открытым исходным кодом, представленный Джейсоном Доненфельдом в 2016 году [2]. Сейчас WireGuard является одним из самых популярных VPN-протоколов в одном ряду с OpenVPN и IPSec. Главными преимуществами WireGuard является простота настройки и использования, а также эффективность и безопасность соединения.

Ключевые слова: WireGuard, OpenVPN, VPN, ALT Linux, протокол.

WireGuard

На сайте протокола заявлено, что «WireGuard надежно инкапсулирует IP-пакеты через UDP. Вы добавляете интерфейс WireGuard, настраиваете его с помощью своего закрытого ключа и открытых ключей ваших одноранговых узлов, а затем отправляете через него пакеты» [3].

Кроме того, в основе WireGuard лежит концепция под названием «маршрутизация криптоключей», которая работает путем связывания открытых ключей со списком IP-адресов туннеля, которым разрешено находиться внутри туннеля. Каждый сетевой интерфейс имеет закрытый ключ и список пиров. У каждого узла есть открытый ключ. Открытые ключи -короткие и простые и используются узлами для аутентификации друг друга. Их можно передавать для использования в файлах конфигурации любым внешним методом, аналогично тому, как можно отправить открытый ключ SSH другу для доступа к серверу оболочки [3].

WireGuard отправляет и получает зашифрованные пакеты, используя сетевое пространство имен, в котором изначально был создан интерфейс WireGuard. Это означает, что возможно создать интерфейс WireGuard в своем основном сетевом пространстве имен, имеющем доступ к Интернету, а затем переместить его в сетевое пространство имен, принадлежащее контейнеру Docker, в качестве единственного интерфейса этого контейнера.

Сначала создается VPN-туннель, которому назначаются приватный и публичный ключи, а также IP-адрес. Данный туннель пропускает только те устройства, которые имеют публичные ключи, которые известны туннелю, в то же время инкапсулируя их в UDP (другие сетевые протоколы WireGuard не поддерживает). Однако, для использования туннеля, клиенты должны ввести публичный ключ сервера. Сервер, к слову, получает IP-адреса клиентов вместе с пакетами, в то время как клиенты должны знать его для отправки пакетов [4].

Это значит, что ключи при использовании WireGuard статичны и заранее установлены. Несмотря на кажущуюся простоту данного алгоритма, он обеспечивает дополнительный уровень симметричного шифрования для предотвращения потенциальных уязвимостей [5]. Это устраняет риск взлома трафика, так как даже квантовые компьютеры пока не способны взломать Curve22519 – алгоритм обмена ключами [6].

Рассмотрим все криптографические протоколы, которые задействует WireGuard:

  • ChaCha20 – используется для симметричного шифрования пакетов, получаемых через интернет;
  • Poly1305 – аутентификационный протокол, используемый в связке с ChaCha20;
  • Curve25519 – семейство ассиметричных ключей, которое безопаснее других (например, RSA), используется при обмене ключами по протоколу Диффи-Хеллмана на эллиптических кривых (ECDH);
  • SipHash24 – используется для формирования ключей хеш-функции;
  • BLAKE2s – криптографическая хеш-функция, используемая для хеширования;
  • HKDF (одна из версий KDF – Key Derivation Function) – функция формирования стойких приватных ключей на основе заданного значения с помощью псевдослучайной функции.

Ещё одной важной частью работы WireGuard является концепт маршрутизации Cryptokey Routing [7]. Он заключается в том, что при маршрутизации пакетов WireGuard руководствуется публичным ключом пира. После расшифрования пакета аутентификации, сервер проверяет IP источника пакета на существовании его в списке разрешенных IP. Если он там есть, то WireGuard его пропускает, подписывает своим ключом, шифрует ключом пира, подобранного на основании dst поле пакета, и отправляет соответствующему получателю.

Кроме того, на GitHub существует версия WireGuard с российскими криптографическими алгоритмами [8]. Проект RuWireGuard использует ГОСТ Р 34.10-2012, ГОСТ Р 34.12-2015 и ГОСТ Р 34.11-2012 [8]. Таким образом, даже набор криптографических алгоритмов в WireGuard можно выбрать и настроить.

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

Сравнение скорости WireGuard и OpenVPN

Взглянем на сравнение WireGuard и OpenVPN в одном из открытых источников (для OpenVPN использовался только UPD протокол для уравнивания условий работы) [7]. При работе с портом 1 Гбит/с, пропускная способность WireGuard практически в 4 раза превышает пропускную способность своего конкурента – более 1000 Мбит/с против 258 Мбит/с. При тестах скорости OpenVPN (UDP) и WireGuard при подключении к порту со скоростью 350 Мбит/с через сервер в Великобритании, получаем, что Wireguard по итогам нескольких опытов оказался быстрее OpenVPN в среднем на 94%

Связано это с тем, что в кодовой базе WireGuard содержится практически в 100 раз меньше строчек, чем у других протоколов – 4 000 строк у WireGuard против 500 000 у IPsec и 600 000 строк у OpenVPN соответственно. Это подтверждает, что код WireGuard является более оптимизированным и ресурсноэффективным [9]. Кроме того, код WireGuard выполняется напрямую в ядре наравне с другими файлами ОС, в отличие от других сетевых протоколов.

Установка модулей WireGuard на ОС Альт

В рамках данной работы в качестве ОС, используемой для развертывания WireGuard, будет использоваться ALT Linux. Рассмотрим настройку создания частной виртуальной сети между двумя виртуальными машинами. В качестве гипервизора будет использоваться лицензионный VMware Workstation Pro, а также две виртуальные машины – сервер (ALT Linux Server) и клиент (ALT Linux Client). Для соединения виртуальных машин между собой используется LAN сегмент, где для каждой машины будет настроен IP-адрес.

Для корректной работы и настройки WireGuard, необходимо загрузить на устройства модули WireGuard [11]:

  1. wireguard-tools – пакет, содержащий инструменты командной строки для взаимодействия с модулем ядра WireGuard (необходим для использования команды wg;
  2. wireguard-tools-wq-quick – пакет для быстрого вызова интерфейса WireGuard с помощью команды wg-quick;
  3. kernel-source-wireguard – пакет исходных кодов ядра для WireGuard, работающий ОС Альт, который позволяет ядру ОС использовать модуль WireGuard.

Рассмотрим подробнее справку по командам wg и wg-quick.

  • wg show – отображает текущую конфигурации и информацию об устройстве;
  • wg showconf – отображает текущую конфигурацию WireGuard, для использования с ‘setconf’;
  • wg set – меняет текущую конфигурацию, управление пирами (добавление, удаление, редактирование);
  • wg setconf – применяет конфигурацию WireGuard;
  • wg addconf – добавляет конфигурацию WireGuard;
  • wg syncconf – синхронизирует конфигурационный файл с интерфейсом WireGuard;
  • wg genkey – генерирует новый приватный ключ и записывает его в stdout;
  • wg genpsk – генерирует новый публичный ключ и записывает его в stdout;
  • wg pubkey – читает приватный ключ из stdin и записывает публичный ключ с stdout.

Рассмотрим теперь использование команды wg-quick. Из строчки Usage мы видим, что команда wg-quick используется для быстрой работы с интерфейсом или конфигурационным файлом формата .conf. Хранятся данные файлы в каталоге /etc/wireguard/INTERFACE.conf.

Утилита wg-quick может работать только с файлом конфигурации. Файл конфигурации состоит из полей [13]:

  • PrivateKey — приватный ключ. Не путь к ключу, а именно его содержимое. Обязательно должно присутствовать;
  • ListenPort — порт, на котором работает WireGuard. Если нет, выбирается случайно;
  • FwMark — маркировка исходящего трафика;
  • Address — IP-адреса, которые будут назначены интерфейсу;
  • DNS — DNS-адреса (через запятую или несколько раз указать DNS). Требует наличие пакета resolvconf. Если его нет, DNS не добавляются;
  • MTU — значение MTU для интерфейса. Если нет, MTU не изменяется;
  • Table — таблица маршрутизации, куда будут добавлены маршруты для WireGuard. Если нет, используется таблица main;
  • PreUp, PostUp, PreDown, PostDown — скрипты, которые будут выполняться перед и после подключения, перед и после отключения соответственно. Можно указывать несколько скриптов. Выполняться они будут в порядке, описанном в файле;
  • SaveConfig — флаг сохранения всех изменений в файл конфигурации.

Каждый пир должен быть представлен отдельной секцией [Peer] со следующими полями (совпадающими с параметрами запуска wg set <WG_IFACE> peer...):

  • PublicKey — публичный ключ. Обязательно должен присутствовать;
  • PresharedKey — дополнительный ключ шифрования. Если нет, дополнительное шифрование не используется;
  • AllowedIPs — список разрешенных подсетей. Можно указывать каждую сеть через запятую, а можно несколько раз указать это поле. Если нет, никакая сеть не закреплена за пиром;
  • Endpoint — IP-адрес или имя пира с обязательным указанием порта. Можно не указывать.

Настройка WireGuard на ОС Альт

Для начала, настроим IP адреса сервера и клиента и проверим работоспособность и скорость соединения. Присвоим серверу IP 10.0.0.1, а клиенту – 10.0.0.202.

1

Рисунок 1. Пример настройки IP-адреса.

Перейдем к настройке WireGuard. Как было изучено из справки по командам wg и wg-quick, необходимо создать конфигурационные файлы. Для удобства создадим каталог /etc/wireguard, внутри которого создадим каталог /keys. Сделаем это на обеих виртуальных машинах.

2

Рисунок 2. Пример создания каталога для хранилища ключей.

Затем, сгенерируем приватный и публичный ключи для сервера и клиента с помощью команды “wg genkey | tee private.key | wg pubkey | tee public.key”. Как стало известно из справки по команде wg, команды genkey и pubkey генерируют приватный и публичный ключ соответственно, а команда tee перенаправляет вывод предыдущей команды в предписанный файл.

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

  1. [Interface] – информация об интерфейсе данного устройства:
  • Address - IP-адрес, присваиваемый данному интерфейсу;
  • ListenPort – прослушиваемый порт;
  • PrivateKey – приватный ключ устройства.
  1. [Peer] – информация о пирах, которые подключаются к данному интерфейсу:
  • PublicKey – публичный ключ клиента;
  • AllowedIPs – какие IP могут использовать данный ключ;
  • PersistentKeepalive – периодичность попыток проверки доступности удаленной стороны соединения.

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

3

Рисунок 3. Пример создания конфигурационного файла.

Заполним необходимой информацией конфигурационные файлы для сервера и клиента.

4

Рисунок 4. Пример содержания конфигурационного файла.

Результатом данных процедур будет создание интерфейса wg2001, информацию о котором можно увидеть с помощью команды ip a, а также настроенная частная виртуальная сеть с помощью WireGuard, информацию о котором можно увидеть с помощью команды wg.

5

Рисунок 5. Вывод команды ip a.

6

Рисунок 6. Вывод команды wg.

Соединение двух машин при использовании WireGuard.

7

Рисунок 7. Передача пакетов с WireGuard.

Заключение

Таким образом, был рассмотрен сетевой протокол WireGuard, изучен его алгоритм работы, установлены модули WireGuard для работы на ОС Альт, а также была создана виртуальная частная сеть между двумя ПК с использованием WireGuard в качестве сетевого протокола.

Подводя итоги, можно сделать вывод, что WireGuard является одним из самых передовых VPN-протоколов на данный момент, а также легко настраивается и быстро и эффективно работает на ОС Альт и других операционных системах.

Список литературы

  1. Уймин, А. Г. Практикум. Демонстрационный экзамен базового уровня. Сетевое и системное администрирование / А. Г. Уймин. — Санкт-Петербург : Лань, 2024. — 116 с. — ISBN 978-5-507-48647-2. — Текст : электронный // Лань : электронно-библиотечная система. — URL: https://e.lanbook.com/book/362903 (дата обращения: 23.01.2024).
  2. Что такое WireGuard и как оно работает? // uchet-jkh.ru URL: https://uchet-jkh.ru/i/cto-takoe-wireguard-i-kak-ono-rabotaet/ (дата обращения: 04.01.2024).
  3. WireGuard - Fast, Modern, Secure VPN Tunnel // www.wireguard.com URL: https://www.wireguard.com/ (дата обращения: 04.01.2024).
  4. WireGuard — прекрасный VPN будущего? // Хабр URL: https://habr.com/ru/articles/432686/ (дата обращения: 04.01.2024).
  5. Что такое WireGuard® протокол? // VPN Unlimited - Безопасный VPN URL: https://www.vpnunlimited.com/ru/help/vpn-protocols/wireguard-protocol (дата обращения: 04.01.2024).
  6. Quantum Computing Might Be Closer Than Previously Thought // IBMSystems Magazine URL: http://www.ibmsystemsmag.com/mainframe/trends/IBM-Research/quantum_computing/ (дата обращения: 05.01.2024).
  7. OpenVPN или WireGuard: какой протокол лучше выбрать? // is*hosting URL: https://help.ishosting.com/ru/openvpn-vs-wireguard (дата обращения: 05.01.2024).
  8. Разработка и развитие отечественной версии протокола WireGuard // GitHub URL: https://github.com/bi-zone/ruwireguard-spec/blob/main/intro.md (дата обращения: 06.01.2024).
  9. Что такое WireGuard и как его настроить на Android // zoom.cnews.ru URL: https://zoom.cnews.ru/b/post/tehnoblog/76317 (дата обращения: 08.01.2024).
  10. Performance // WireGuard URL: https://www.wireguard.com/performance/ (дата обращения: 08.01.2024).
  11. How To Set Up WireGuard on Debian 11 // DigitalOcean URL: https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-debian-11 (дата обращения: 08.01.2024).
  12. Package kernel-source-wireguard: Information // ALT Linux URL: https://packages.altlinux.org/en/p9/srpms/kernel-source-wireguard/2636928865353696472 (дата обращения: 08.01.2024).
  13. How it was // Хабр URL: https://habr.com/ru/companies/inDrive/articles/586006/ (дата обращения: 08.01.2024).

Интересная статья? Поделись ей с другими: