Wireguard
является весьма новым протоколом построения виртуальных частных сетей (VPN) – он был предложен канадским инженером Джейсоном Доненфельдом (Jason A. Donenfeld) в 2018 году. Автор разработал его для собственных нужд, руководствуясь недостатками других известных протоколов (IPSec
, OpenVPN
, L2TP
): сложностью настройки, наличием уязвимостей, низкой производительностью.
В начале 2020 года VPN WireGuard
включили в ядро Linux 5.6. Отдельно также были подготовлены решения для предыдущих версий 5.4 и 5.5. Внедрение решения существенно повысило уровень безопасности при передаче данных по сети, а также производительность VPN.
Плюсы WireGuard
в сравнении с конкурентными VPN-разработками:
- простота эксплуатации;
-
применение современных криптографических решений (
NoiseProtocol Framework
,Curve25519
и ряда других); - читаемый код, который легко поддается исследованию на ошибки и уязвимости, а также обладает компактностью;
- превосходство над конкурентными продуктами в плане производительности;
- детализированная, понятная спецификация.
Получается, можно считать WireGuard
панацеей, а OpenVPN
и IPSec
записывать в разряд устаревших решений. Но не стоит спешить с выводами, пока не разберемся с основными принципами его использования.
Принципы работы
-
Происходит создание интерфейса
WireGuard
, которому назначается приватный ключ и IP-адрес. Производится загрузка настроек других пиров: публичных ключей, IP-адреса и так далее. -
Любой IP-пакет, который приходит на
WireGuard
интерфейс, инкапсулируется в UDP, после чего безопасно передается заданным в конфигурации пирам. - Клиенты при настройке системы указывают публичный IP сервера. В свою очередь, сервер VPN в автоматическом режиме собирает внешние клиентские адреса во время передачи корректных данных аутентификации.
- У сервера может изменяться публичный IP прямо во время работы. В такой ситуации система отправляет сообщения клиентам, чтобы они немедленно выполнили обновление собственного конфига.
-
Применяется концепт маршрутизации
Cryptokey Routing
.WireGuard
осуществляет прием и отправку пакетов, основываясь на публичном ключе пира. При расшифровке сервером аутентифицированного пакета выполняется проверка IP-адреса источника. В случае его соответствия конфигурацииallowed-ips
интерфейсWireGuard
принимает этот пакет. -
Процесс пересылки исходящего сообщения выглядит так: определяется IP-адрес назначения пакета, после чего на основе этой информации делается выбор пира. Пакет подписывается собственным ключом, затем выполняется шифрование ключом пира, а потом выполняется отправка на
Remote Endpoint
.
Примечательный факт: базовая логика WireGuard
включает 4000 строчек с кодом. Напомним, что OpenVPN
и IPSec
реализованы с помощью сотен тысяч строк. Чтобы поддерживать актуальные криптографические алгоритмы, специалисты предлагают внедрить в ядро Linux новый Crypto Zinc
. Пока стороны спорят, насколько такое решение будет удачным.
Производительность
Ощутимый прирост в скорости, если сравнивать продукт с решениями OpenVPN
и IPSec
, характерен для Linux-систем, поскольку в них WireGuard
внедрен непосредственно в модуль ядра. Есть поддержка OpenBSD, macOS, FreeBSD, мобильных ОС. В 2020 году был выпущен клиент Wireguard
для
ОС Windows. Однако в этих системах выполнение WireGuard
происходит в userspace, поэтому серьезного прироста производительности здесь не отмечается.
Опыт использования
WireGuard
, на первый взгляд, может показаться идеальным вариантом для пользователя. О низкоуровневых решениях уже позаботились в спецификации, благодаря чему настройка VPN-инфраструктуры проводится за 5–10 минут. С подробностями процесса установки можно ознакомиться на
официальном портале WireGuard.
Генерация ключей шифрования производится при помощи утилиты WG
.
После этого создается конфиг сервера /etc/wireguard/wg0.conf
.
На следующем этапе поднимается туннель, для чего используется скрипт WG-Quick
.
В ОС, в которых применяется systemd, можно прописать: sudo systemctl start wg-quick@wg0.service
.
Создается клиентский конфиг: /etc/wireguard/wg0.conf
.
После этого поднимается туннель.
Компактная база кода и простота конфигурации стали возможны благодаря отказу от использования функции дистрибьюции ключей. Распространение коротких ключей шифрования тут производится аналогично SSH Keys. Правда, из-за этого появляется один нюанс: WireGuard
бывает сложно использовать в действующих сетях.
К минусам решения стоит причислить отсутствие возможности настроить работу WireGuard
через HTTP-прокси, поскольку в качестве транспортного протокола применяется UDP.
Выводы
Безусловно, мы имеем дело с перспективным решением, которое уже можно эксплуатировать на серверах. Оно позволяет достичь высокой производительности на системах, работающих под управлением Linux. Продукт элементарен в настройке, его легко поддерживать. Отдельно стоит отметить небольшую и читабельную базу кода, тем не менее, широкое применение данного протокола.