Связанные руководства
WireGuard изнутри: как он работает и как развивался
Обновлено
WireGuard — VPN-протокол с открытым кодом. Его придумал Джейсон Доненфельд (Jason A. Donenfeld), опубликован он был около 2015 года, а в 2020-м официально вошёл в ядро Linux. Главное в нём можно описать одним словом: «мало». Мало кода — ядро реализации занимает несколько тысяч строк, тогда как у OpenVPN и IPsec счёт идёт на сотни тысяч. Мало настроек — набор алгоритмов шифрования один, выбирать не дают. Мало состояний — нет понятий «подключается» и «отключено»: есть данные — отправляет, нет — молчит. Отсюда скорость, экономия батареи и простота аудита, но отсюда же и ограничения: только UDP, никакой маскировки, распределение ключей — не его забота. Ниже сначала о том, как он работает, а потом о том, как он шаг за шагом стал основой VPN нового поколения.
Идея: сделать VPN похожим на сетевую карту
До WireGuard основными вариантами были IPsec и OpenVPN. IPsec — большое семейство стандартов с огромным числом настроек, и состыковать оборудование разных производителей — известная головная боль. OpenVPN работает в пространстве пользователя и опирается на громоздкую TLS-библиотеку: гибкий, но медленный. Объём кода у обоих такой, что полностью его вряд ли кто-то проверял.
WireGuard подходит с обратной стороны: делать одну вещь и делать её правильно. В системе он выглядит как виртуальная сетевая карта (например, wg0). Вы задаёте ей свой закрытый ключ и открытые ключи нескольких собеседников; отправленные в неё пакеты шифруются и уходят наружу, а полученные — расшифровываются и выходят из неё. Всё остальное — маршрутизация, файрвол, выдача адресов — остаётся существующим инструментам системы.
Чего он сознательно не делает, тоже понятно: не согласовывает алгоритмы, не работает с логинами и паролями, не раздаёт адреса, не маскирует трафик. Всё это либо считается источником уязвимостей, либо оставлено инструментам уровнем выше.
Маршрутизация по ключам: открытый ключ и есть личность
В WireGuard у каждого устройства есть пара ключей, и открытый ключ — это его удостоверение, примерно как в SSH: стороны прописывают у себя открытые ключи друг друга — и доверие установлено, без сертификатов, логинов и паролей.
В конфигурации для каждого собеседника задаётся строка «разрешённых адресов» (AllowedIPs). Она работает в обе стороны: при отправке пакет шифруется ключом того собеседника, в чей диапазон попадает адрес назначения, и уходит к нему; при приёме после расшифровки проверяется, входит ли адрес источника в диапазон этого собеседника, и если нет — пакет отбрасывается. Такой подход называется маршрутизацией по ключам (cryptokey routing): таблица маршрутов и контроль доступа объединены в одну таблицу.
Поэтому если указать у собеседника разрешённые адреса 0.0.0.0/0, это значит «весь трафик — ему», то есть обычный «глобальный» VPN; если указать только подсеть локальной сети, через туннель пойдёт только трафик в эту подсеть.
Рукопожатие и шифрование: один фиксированный набор алгоритмов
Перед первым обменом данными два устройства выполняют рукопожатие: инициатор отправляет один пакет, ответчик возвращает один — и всё, у обеих сторон есть набор сеансовых ключей только на этот период. Рукопожатие построено на фреймворке Noise: стороны аутентифицируют друг друга долговременными ключами, а временные ключи обеспечивают прямую секретность — даже если долговременный закрытый ключ когда-нибудь утечёт, записанный ранее трафик расшифровать не получится.
Сеансовые ключи автоматически меняются каждые несколько минут, пользователь этого не видит, и никакого «переподключения» при этом нет.
Алгоритмы фиксированы: обмен ключами — Curve25519, шифрование данных — ChaCha20-Poly1305, хеширование — BLAKE2s. Согласования нет, а значит, нет и атак на понижение: злоумышленник не может уговорить стороны перейти на более слабый алгоритм. Если когда-нибудь один из алгоритмов взломают, выпустят новую версию протокола целиком, а не добавят ещё одну опцию.
Дополнительно можно задать предварительно согласованный ключ (pre-shared key), который работает поверх механизма открытых ключей, — это защита на будущее от угрозы квантовых компьютеров для алгоритмов с открытым ключом.
Только UDP, молчание для чужих, смена сети без обрыва
- Только UDP: WireGuard шифрует каждый пакет отдельно и кладёт его в UDP-пакет. Отказ от TCP намеренный: если гонять TCP внутри TCP, повторную передачу делают оба уровня, и при потерях пакетов они тормозят друг друга.
- Молчание для чужих: на пакеты, не прошедшие аутентификацию, ответа нет вообще. Для того, кто сканирует порты, такой порт выглядит закрытым, и узнать, что на нём работает WireGuard, нельзя.
- Роуминг: WireGuard не знает «соединений», он знает только открытые ключи. Если у собеседника сменился адрес — телефон перешёл с Wi‑Fi на мобильную сеть, — то, как только от него придёт следующий пакет и пройдёт аутентификацию, ответы автоматически пойдут на новый адрес. Поэтому при смене сети туннель не рвётся.
- Тишина: когда отправлять нечего, туннель не создаёт никакого трафика, поэтому на телефоне он очень экономен. Только если устройство находится за роутером и при этом должно всё время оставаться доступным для другой стороны, нужно включить периодический keepalive (PersistentKeepalive): раз в несколько десятков секунд отправляется маленький пакет, чтобы на роутере сохранялось сопоставление адресов.
Почему он быстрый
- Работает в ядре: в Linux WireGuard — модуль ядра, пакетам не нужно копироваться туда-обратно между ядром и пользовательской программой; OpenVPN традиционно работает в пространстве пользователя, и каждый пакет делает лишний круг.
- Алгоритмы подходят любому процессору: ChaCha20 не требует специальных инструкций аппаратного ускорения, что особенно выгодно на чипах без инструкций AES — в телефонах и роутерах.
- Короткое рукопожатие: один пакет туда, один обратно — и можно передавать данные, установка соединения почти без ожидания.
- Мало кода: путь короткий, и все возможные оптимизации сосредоточены на нескольких ключевых шагах.
- Учтите: всё это о накладных расходах самого протокола и реализации. Реальная скорость на трансграничных линиях гораздо больше зависит от потерь пакетов на линии и от того, как оператор относится к UDP.
История: от проекта одного человека до ядра Linux
- Около 2015 года: Джейсон Доненфельд начинает разработку и публикует WireGuard — сначала как отдельный модуль ядра Linux.
- 2017 год: статья с описанием его устройства выходит на конференции по сетевой безопасности NDSS, после чего протокол проходит несколько независимых формальных верификаций. Примерно тогда же VPN-провайдеры вроде Mullvad начинают предлагать подключение по WireGuard.
- 2018 год: создатель Linux Линус Торвальдс хвалит его код в списке рассылки и говорит, что по сравнению с OpenVPN и IPsec это настоящее произведение искусства, — после этой фразы о нём узнали все разработчики.
- 2019 год: Cloudflare выпускает реализацию в пространстве пользователя на Rust — BoringTun — и использует WireGuard в своём WARP; NordVPN запускает NordLynx на базе WireGuard; примерно тогда же стартует Tailscale с WireGuard в качестве канала передачи данных.
- Март 2020 года: WireGuard официально входит в основную ветку ядра вместе с Linux 5.6, одновременно выходит версия 1.0. С тех пор основные дистрибутивы Linux поставляются с WireGuard, отдельно ставить модуль не нужно. В том же году его добавляют в ядро OpenBSD.
- 2021 год: для Windows выходит реализация в режиме ядра — WireGuardNT, заметно быстрее прежней реализации в пространстве пользователя; затем своя реализация в ядре появляется и у FreeBSD.
- Сейчас: официальные клиенты есть для Windows, macOS, Linux, iOS и Android, системы роутеров и NAS вроде OpenWrt и Synology обычно поддерживают его из коробки, а большинство коммерческих VPN указывают его как протокол по умолчанию или на выбор.
Чего он не делает и какие из этого ограничения
- Не распределяет ключи: каждое новое устройство нужно прописать открытым ключом в конфигурации остальных. Когда устройств много, это становится неподъёмным — именно поэтому существуют инструменты вроде Tailscale.
- Не выдаёт адреса динамически: внутренний адрес каждого собеседника жёстко записан в конфигурации, механизма «подключился — получил адрес», как в OpenVPN, нет. Коммерческие VPN, использующие его, достраивают этот слой сами.
- Вопросы приватности: чтобы отвечать, сервер должен помнить последний публичный адрес каждого собеседника. VPN-провайдерам, обещающим «никаких логов», обычно приходится делать дополнительную обработку (например, периодическую очистку или двойную трансляцию адресов).
- Только UDP: в сетях, где UDP блокируют или ограничивают по скорости, он не работает или работает очень медленно. Чтобы пустить его по TCP или через порт 443, нужно оборачивать его в какой-то другой инструмент.
- Нет маскировки: формат и длина пакетов рукопожатия и данных имеют фиксированные признаки, их легко распознать. Его цель — безопасность и простота, а не обход цензуры.
- Нет учётных записей: в протоколе нет понятий логина, пароля или срока действия, он признаёт только открытые ключи.
Сравнение с OpenVPN и IPsec
- Объём кода: ядро WireGuard — несколько тысяч строк; OpenVPN вместе с TLS-библиотекой, от которой он зависит, и различные реализации IPsec — порядка сотен тысяч строк.
- Транспорт: у WireGuard только UDP; OpenVPN умеет и то и другое и может работать через TCP 443, смешиваясь с HTTPS-трафиком на этом порту; IPsec использует свой номер протокола и UDP 500 / 4500.
- Настройка: у WireGuard на собеседника несколько строк; у OpenVPN в конфигурации много параметров, зато он гибкий; IPsec сложнее всех.
- Производительность: в чистой сети WireGuard обычно самый быстрый и экономный; у OpenVPN в новых версиях появилось ускорение в ядре (DCO), и разрыв сокращается.
- Возможности: вход по логину и паролю, динамическая выдача адресов и маршрутов, работа через TCP — у OpenVPN это встроено, а WireGuard всё это должен получать от внешних систем.
- Поддержка устройств: у OpenVPN долгая история, его понимают почти все старые роутеры, NAS и встраиваемые устройства; WireGuard за последние годы стал повсеместным на новых системах, но на старых устройствах может отсутствовать.
Что выросло на основе WireGuard
- Tailscale: добавляет к WireGuard вход в аккаунт, распределение ключей, проход через NAT и ретрансляцию, превращая его в автоматическую сеть между устройствами, см. Как устроен Tailscale. Headscale — его сервер управления с открытым кодом.
- Netmaker, NetBird, Firezone и другие: такие же продукты для объединения устройств в сеть или для модели нулевого доверия — «WireGuard передаёт данные, а управление своё».
- Cloudflare WARP: клиент WireGuard для обычных пользователей, отправляющий трафик в сеть Cloudflare.
- Собственные обёртки коммерческих VPN: NordLynx и другие — поверх WireGuard добавлен слой выдачи адресов и защиты приватности.
- AmneziaWG и другие варианты: меняют заголовки пакетов и добавляют заполнение, чтобы скрыть фиксированные признаки WireGuard в строго контролируемых сетях; со стандартными клиентами WireGuard они несовместимы.
В сетях Китая
- Будет ли работать, сначала зависит от UDP: многие домашние и мобильные сети ограничивают скорость для больших объёмов UDP — сразу после подключения всё быстро, через некоторое время замедляется, или заметно тормозит вечером.
- Прямое трансграничное подключение легко распознаётся: у пакетов рукопожатия WireGuard фиксированные признаки, на трансграничных каналах их могут опознать и начать мешать — рукопожатие не проходит или через какое-то время трафик пропадает. Это прямое следствие отсутствия маскировки.
- Сеть между устройствами внутри Китая (офис и дом, телефон и NAS) не проходит через трансграничный канал, и этой проблемы обычно нет — влияют только ограничения UDP и то, удаётся ли пробить NAT.
- Поэтому он лучше подходит для объединения устройств в сеть и удалённого доступа; для долгой стабильной работы через границу нужен способ с маскировкой или работающий через TCP / TLS, сравнение протоколов — в статье Сравнение VPN-протоколов.
Где WireGuard используется в LeoTun
Раздел «Приватная» в LeoTun работает на Tailscale, а канал передачи данных у него — WireGuard: туннели между вашими устройствами и туннели до узлов выхода в разных регионах шифрует и передаёт именно он. Генерировать ключи и писать конфигурацию не нужно — после входа аккаунтом сайта клиент всё сделает сам. Как пользоваться — в статье Что такое «Приватная» (Tailscale), вход — на странице «Приватная».
Кроме «Приватной», на том же аккаунте есть способы, которые не зависят от UDP: Cisco (AnyConnect) работает через TLS, OpenVPN может работать через TCP, а Hiddify (Hysteria2) создан специально против потерь пакетов. Если в вашей сети «Приватная» медленная и нестабильная, просто смените способ, см. Какой способ подключения для какой ситуации.
FAQ
Что лучше: WireGuard или OpenVPN?
В чистой сети без ограничений UDP WireGuard быстрее, экономнее и не рвётся при смене сети; когда нужен TCP, вход по логину и паролю или устройство довольно старое, лучше подходит OpenVPN. Оба протокола открытые и проверены временем, по безопасности оба надёжны.
WireGuard безопасен?
Он использует современный и консервативный набор алгоритмов, протокол прошёл формальную верификацию, кода мало и его легко проверить; реальных способов взлома на сегодня не известно. Учтите, что хранение и распределение ключей — не его задача: если закрытый ключ утёк или открытый ключ прописан не тому собеседнику, сам протокол не поможет.
Почему WireGuard поддерживает только UDP?
Это проектный компромисс. Если гонять TCP внутри TCP-соединения, при потерях пакетов оба уровня одновременно делают повторную передачу, и производительность резко падает; к тому же на UDP легко реализовать и «молчание для чужих», и роуминг. Цена — в сетях, где UDP блокируют, он не работает.
Работает ли WireGuard в Китае?
Сеть между устройствами внутри Китая обычно работает. Прямое трансграничное подключение нестабильно: трафик не замаскирован, его легко распознать и начать мешать, к тому же на некоторых линиях ограничивают UDP. Для стабильной работы через границу нужен способ с маскировкой или через TLS.
Кто разработал WireGuard и когда он вошёл в ядро Linux?
Его спроектировал и разработал Джейсон Доненфельд, опубликован он был около 2015 года; в марте 2020 года вошёл в основную ветку ядра вместе с Linux 5.6, одновременно вышла версия 1.0.
Tailscale — это и есть WireGuard?
Нет, это разные вещи. WireGuard — протокол зашифрованного туннеля; Tailscale — система для объединения устройств в сеть, которая передаёт данные через WireGuard и дополнительно решает вход в аккаунт, распределение ключей, проход через NAT и ретрансляцию. Подробнее — в статье Как устроен Tailscale.
Нужно ли самому настраивать ключи для WireGuard?
Если пользоваться WireGuard напрямую — да: на каждом устройстве сгенерировать ключи и прописать в конфигурации открытые ключи, адреса и адреса собеседников. В клиентах Tailscale или коммерческих VPN это делает программа. В способе «Приватная» от LeoTun достаточно войти в аккаунт.