УДК 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]:
- wireguard-tools – пакет, содержащий инструменты командной строки для взаимодействия с модулем ядра WireGuard (необходим для использования команды wg;
- wireguard-tools-wq-quick – пакет для быстрого вызова интерфейса WireGuard с помощью команды wg-quick;
- 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. Пример настройки IP-адреса.
Перейдем к настройке WireGuard. Как было изучено из справки по командам wg и wg-quick, необходимо создать конфигурационные файлы. Для удобства создадим каталог /etc/wireguard, внутри которого создадим каталог /keys. Сделаем это на обеих виртуальных машинах.
Рисунок 2. Пример создания каталога для хранилища ключей.
Затем, сгенерируем приватный и публичный ключи для сервера и клиента с помощью команды “wg genkey | tee private.key | wg pubkey | tee public.key”. Как стало известно из справки по команде wg, команды genkey и pubkey генерируют приватный и публичный ключ соответственно, а команда tee перенаправляет вывод предыдущей команды в предписанный файл.
После создания ключей, перейдем к созданию конфигурационных файлов. Как уже было написано ранее, файлы должны содержать следующую информацию:
- [Interface] – информация об интерфейсе данного устройства:
- Address - IP-адрес, присваиваемый данному интерфейсу;
- ListenPort – прослушиваемый порт;
- PrivateKey – приватный ключ устройства.
- [Peer] – информация о пирах, которые подключаются к данному интерфейсу:
- PublicKey – публичный ключ клиента;
- AllowedIPs – какие IP могут использовать данный ключ;
- PersistentKeepalive – периодичность попыток проверки доступности удаленной стороны соединения.
Примечательно, что если IP не будет входить в данный список разрешенных адресов или не будет иметь необходимый публичный ключ, то соединение не будет установлено.
Рисунок 3. Пример создания конфигурационного файла.
Заполним необходимой информацией конфигурационные файлы для сервера и клиента.
Рисунок 4. Пример содержания конфигурационного файла.
Результатом данных процедур будет создание интерфейса wg2001, информацию о котором можно увидеть с помощью команды ip a, а также настроенная частная виртуальная сеть с помощью WireGuard, информацию о котором можно увидеть с помощью команды wg.
Рисунок 5. Вывод команды ip a.
Рисунок 6. Вывод команды wg.
Соединение двух машин при использовании WireGuard.
Рисунок 7. Передача пакетов с WireGuard.
Заключение
Таким образом, был рассмотрен сетевой протокол WireGuard, изучен его алгоритм работы, установлены модули WireGuard для работы на ОС Альт, а также была создана виртуальная частная сеть между двумя ПК с использованием WireGuard в качестве сетевого протокола.
Подводя итоги, можно сделать вывод, что WireGuard является одним из самых передовых VPN-протоколов на данный момент, а также легко настраивается и быстро и эффективно работает на ОС Альт и других операционных системах.
Список литературы
- Уймин, А. Г. Практикум. Демонстрационный экзамен базового уровня. Сетевое и системное администрирование / А. Г. Уймин. — Санкт-Петербург : Лань, 2024. — 116 с. — ISBN 978-5-507-48647-2. — Текст : электронный // Лань : электронно-библиотечная система. — URL: https://e.lanbook.com/book/362903 (дата обращения: 23.01.2024).
- Что такое WireGuard и как оно работает? // uchet-jkh.ru URL: https://uchet-jkh.ru/i/cto-takoe-wireguard-i-kak-ono-rabotaet/ (дата обращения: 04.01.2024).
- WireGuard - Fast, Modern, Secure VPN Tunnel // www.wireguard.com URL: https://www.wireguard.com/ (дата обращения: 04.01.2024).
- WireGuard — прекрасный VPN будущего? // Хабр URL: https://habr.com/ru/articles/432686/ (дата обращения: 04.01.2024).
- Что такое WireGuard® протокол? // VPN Unlimited - Безопасный VPN URL: https://www.vpnunlimited.com/ru/help/vpn-protocols/wireguard-protocol (дата обращения: 04.01.2024).
- Quantum Computing Might Be Closer Than Previously Thought // IBMSystems Magazine URL: http://www.ibmsystemsmag.com/mainframe/trends/IBM-Research/quantum_computing/ (дата обращения: 05.01.2024).
- OpenVPN или WireGuard: какой протокол лучше выбрать? // is*hosting URL: https://help.ishosting.com/ru/openvpn-vs-wireguard (дата обращения: 05.01.2024).
- Разработка и развитие отечественной версии протокола WireGuard // GitHub URL: https://github.com/bi-zone/ruwireguard-spec/blob/main/intro.md (дата обращения: 06.01.2024).
- Что такое WireGuard и как его настроить на Android // zoom.cnews.ru URL: https://zoom.cnews.ru/b/post/tehnoblog/76317 (дата обращения: 08.01.2024).
- Performance // WireGuard URL: https://www.wireguard.com/performance/ (дата обращения: 08.01.2024).
- 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).
- Package kernel-source-wireguard: Information // ALT Linux URL: https://packages.altlinux.org/en/p9/srpms/kernel-source-wireguard/2636928865353696472 (дата обращения: 08.01.2024).
- How it was // Хабр URL: https://habr.com/ru/companies/inDrive/articles/586006/ (дата обращения: 08.01.2024).