Обзор VPN на базе WireGuard

Дмитрий Аверин
23 июля 2020
access_time3 минуты
remove_red_eye1502
Компания «Ланкрафт»
Компания «Ланкрафт»

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 записывать в разряд устаревших решений. Но не стоит спешить с выводами, пока не разберемся с основными принципами его использования.

Принципы работы

  1. Происходит создание интерфейса WireGuard, которому назначается приватный ключ и IP-адрес. Производится загрузка настроек других пиров: публичных ключей, IP-адреса и так далее.
  2. Любой IP-пакет, который приходит на WireGuard интерфейс, инкапсулируется в UDP, после чего безопасно передается заданным в конфигурации пирам.
  3. Клиенты при настройке системы указывают публичный IP сервера. В свою очередь, сервер VPN в автоматическом режиме собирает внешние клиентские адреса во время передачи корректных данных аутентификации.
  4. У сервера может изменяться публичный IP прямо во время работы. В такой ситуации система отправляет сообщения клиентам, чтобы они немедленно выполнили обновление собственного конфига.
  5. Применяется концепт маршрутизации Cryptokey Routing. WireGuard осуществляет прием и отправку пакетов, основываясь на публичном ключе пира. При расшифровке сервером аутентифицированного пакета выполняется проверка IP-адреса источника. В случае его соответствия конфигурации allowed-ips интерфейс WireGuard принимает этот пакет.
  6. Процесс пересылки исходящего сообщения выглядит так: определяется 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. Продукт элементарен в настройке, его легко поддерживать. Отдельно стоит отметить небольшую и читабельную базу кода, тем не менее, широкое применение данного протокола.