Время на прочтение10 мин
Количество просмотров35K
Введение в BoringTun
В начале 2019 года компания Cloudflare представила BoringTun, реализацию WireGuard протокола, написанную на языке Rust. Код проекта распространяется под лицензией BSD-3-Clause и состоит из двух основных частей:
-
Исполняемый файл boringtun с реализацией WireGuard для Linux и macOS в пространстве пользователя
-
Библиотеку, которая может использоваться для интеграции функциональности клиента WireGuard в произвольные приложения для любых платформ, включая iOS и Android. Библиотека реализует только протокол WireGuard без сопутствующих механизмов туннелирования, которые зависят от целевой платформы.
К настоящему времени BoringTun пережил пару релизов и лёг в основу собственного VPN сервиса от Cloudflare под названием WARP.
WireGuard VPN клиенты для Windows
На настоящий момент под Windows доступны две «универсальные» реализации WireGuard (специализированные решения различных VPN провайдеров мы здесь не рассматриваем):
-
Официальный WireGuard for Windows. Может использоваться как качестве клиента, так и в качестве сервера (неофициально). До последнего времени был построен на основе wireguard-go (реализация протокола WireGuard в пространстве пользователя, написанная на языке Go) и виртуального сетевого интерфейса WinTun. Начиная с августа 2021 года эта реализация постепенно вытеснялась новой версией, реализованной полностью в режиме ядра — WireGuardNT. Последний представляет собой виртуальный сетевой интерфейс, в драйвере которого реализован WireGuard протокол, а в качестве транспорта используются Windows Kernel Sockets (WSK).
-
TunSafe — реализация в пространстве пользователя, которая может быть использована только в качестве клиента. Написана на C++ с использованием ассемблера в наиболее критичных к производительности функциях шифрования. В качестве виртуального сетевого интерфейса использует NDIS 6 TAP-Windows драйвер, тот же самый, который используется в OpenVPN.
Оба вышеупомянутых WireGuard клиента используют таблицу маршрутизации для перенаправления сетевого трафика на виртуальный VPN интерфейс с последующим шифрованием, инкапсуляцией и отправкой серверу через UDP сокет. Аналогичный подход используется в подавляющем большинстве VPN клиентов…
Стоит однако, упомянуть и некоторые свойственные ему ограничения:
-
Отсутствие возможности разделить локальные приложения, какие нам бы хотелось маршрутизировать через VPN, а какие пропускать минуя туннель. Это, вообще говоря, довольно популярная тема вопросов на Интернет форумах. Например, одному пользователю необходимо, чтобы один из браузеров, например Firefox, подключался бы только через VPN, а Google Chrome наоборот. Другому, использовать VPN исключительно для qBittorrent, и ещё желательно так, чтобы последний при неактивном VPN не мог бы подключиться к сети и т.д. и т.п..
-
Если необходимо исключить туннелирование для каких-либо сетей из глобального ‘0.0.0.0/0, ::0/0’, то нельзя просто указать параметр вида ‘DisallowedIPs’, нужно рассчитать адреса сетей для AllowedIPs с учетом исключённых сетей. Не критично, но не очень удобно. К слову, чтобы избежать ошибок при сложных вычислениях, можно воспользоваться готовым калькулятором.
Так возникла идея «прозрачного» клиента для WireGuard, который бы использовал надежную реализацию протоколов WireGuard, позволял определять правила для приложений, по возможности не вносил изменений в сетевую конфигурацию, и при этом был бы достаточно производительным и совместимым с «референсной» реализацией WireGuard.
Построй свой мир
Несмотря на кажущуюся сложность задачи, собрать готовое решение в виде консольного приложения (сервиса) под Windows оказалось не слишком сложно. Все основные компоненты лежат на GitHub, осталось только расположить их в правильном порядке и связать между собой.
Для перехвата сетевых пакетов воспользуемся библиотекой Windows Packet Filter. Если сильно не вдаваться в детали, то на системах начиная с Windows Vista она представляет собой NDIS 6.0 Filter Driver с API, которое позволяет приложению работающему в пользовательском режиме забирать пакеты из сетевого стека, при необходимости менять их и возвращать обратно. А поддержку VPN протоколов WireGuard нам обеспечит вышеупомянутая библиотека BoringTun.
Единственное, что меня несколько смущает в интерфейсе библиотеки BoringTun, и что хотелось бы отдельно отметить, это отсутствие возможности передать параметр PresharedKey в функцию new_tunnel (см. ниже). А поскольку PresharedKey по умолчанию используется большинством скриптов для автоматического конфигурирования WireGuard на Linux, это создаёт определенные неудобства. Так что некоторое время назад я отправил pull request, исправляющий данную ситуацию. Однако, постепенно складывается впечатление, что мейнтейнерам это не особенно интересно. Не знаю наверняка, но возможно причина в том, что в WARP PresharedKey не используется.
Раз уж я упомянул PresharedKey, то стоит кратко пояснить роль, которую он играет в протоколе WireGuard . Допустим, случилось «невероятное» и алгоритмы шифрования с открытым ключом построенные на эллиптических кривых оказались недостаточно стойкими. Помимо резкого обрушения биткойна и хаоса на криптовалютных биржах под угрозой окажутся и все SSH/TLS/VPN сессии, которые использовали криптографию с открытым ключом на эллиптических кривых и были заботливо записаны и сохранены провайдерами как раз для такого случая. Для того, чтобы избежать подобной малоприятной ситуации в будущем, в WireGuard и был добавлен 256-битный симметричный ключ обеспечивающий еще один дополнительный уровень криптографической стойкости.
Итак, для начала нам понадобятся статические сборки библиотеки BoringTun:
-
Добавим несколько строк в .cargo/config:
[build]
rustflags = [
"-C", "llvm-args=-slp-recursion-max-depth=1024",
"--emit", "asm", # For whatever reason rustc produces faster code when this flag is enabled
]
[target.x86_64-pc-windows-msvc]
rustflags = ["-Ctarget-feature=+crt-static"]
[target.i686-pc-windows-msvc]
rustflags = ["-Ctarget-feature=+crt-static"]
[target.'cfg(unix)']
runner = 'sudo -E'
-
Собрать все необходимые конфигурации библиотеки можно из командной строки или с помощью простого скрипта:
cargo build --target=i686-pc-windows-msvc --lib
cargo build --target=i686-pc-windows-msvc --lib --release
cargo build --target=x86_64-pc-windows-msvc --lib
cargo build --target=x86_64-pc-windows-msvc --lib --release
В результате мы получим статическую библиотеку, предоставляющую все необходимые функции для создания WireGuard туннеля, генерации handshake сообщений, шифрования и инкапсуляции исходящих сетевых пакетов, декапсуляции и дешифрования входящих сетевых пакетов (принадлежащих WireGuard туннелю), а так же поддержания туннеля в актуальном состоянии (генерация handshake каждые две минуты, отправка keepalive пакетов).
API библиотеки BoringTun выглядит следующим образом (см. boringtun/src/wireguard_ffi.h):
// Allocate a new tunnel
struct wireguard_tunnel *new_tunnel(const char *static_private,
const char *server_static_public,
const char *preshared_key,
uint16_t keep_alive, // Keep alive interval in seconds
uint32_t index, // The 24bit index prefix to be used for session indexes
void (*log_printer)(const char *),
enum log_level log_level);
// Deallocate the tunnel
void tunnel_free(struct wireguard_tunnel *);
struct wireguard_result wireguard_write(struct wireguard_tunnel *tunnel,
const uint8_t *src,
uint32_t src_size,
uint8_t *dst,
uint32_t dst_size);
struct wireguard_result wireguard_read(struct wireguard_tunnel *tunnel,
const uint8_t *src,
uint32_t src_size,
uint8_t *dst,
uint32_t dst_size);
struct wireguard_result wireguard_tick(struct wireguard_tunnel *tunnel,
uint8_t *dst,
uint32_t dst_size);
struct wireguard_result wireguard_force_handshake(struct wireguard_tunnel *tunnel,
uint8_t *dst,
uint32_t dst_size);
struct stats wireguard_stats(struct wireguard_tunnel *tunnel);
Назначение каждой функции в целом понятно из ее названия. Но поскольку документация для BorinTun доступна только для Rust, то кратенько пройдёмся, что к чему.
new_tunnel — создаёт и инициализирует WireGuard туннель. В текущей версии BoringTun, отсутствует параметр PresharedKey, поэтому приведённая выше функция является небольшим расширением оригинальной функции.
tunnel_free — освобождает существующий WireGuard туннель.
wireguard_write — принимает на вход IP пакет, шифрует и добавляет заголовок WireGuard протокола. Важное замечание, передаваемые в функцию буфера памяти не должны накладываться.
wireguard_read — принимает на вход пакет WireGuard протокола, декапсулирует его (убирает WireGuard заголовок) и расшифровывает. Замечание относительно наложения входных и выходных буферов памяти для этой функции так же справедливо.
wireguard_tick — данная функция должна периодически быть вызываема для каждого активного WireGuard туннеля. Рекомендуемый разработчиками интервал составляет 100ms. Функция может вернуть handshake (каждые две минуты) или keepalive пакет (в зависимости от значения параметра PersistentKeepalive), который надлежит отправить серверу.
wireguard_force_handshake — генерирует пакет WireGuard handshake. Функция обычно используется при первом подключении к серверу (в дальнейшем handshake пакеты генерирует функция wireguard_tick) или когда необходимо переподключиться к серверу в следствие изменения сетевого подключения, IP адреса и т.д. и т.п..
wireguard_stats — запрашивает текущую статистику по туннелю, которая включает в себя время происшедшее с последнего handshake, количество принятых/отправленных байт, оценочное значение потерь пакетов и RTT (Round-trip delay time).
Поскольку Windows Packet Filter включает достаточное количество примеров того, как можно организовать фильтрацию пакетов на определенном сетевом интерфейсе, я не буду останавливаться на этом подробно. Например, можно воспользоваться готовым C++ классом simple_packet_filter передав ему две лямбда функции для обработки входящих и исходящих пакетов соответственно. В дальнейшем будем считать, что у нас есть две такие функции фильтрующие сетевой интерфейс подключённый к Интернет .
Таким образом, для того чтобы создать и поддерживать WireGuard туннель необходимо сделать следующее:
-
Вызвать функцию new_tunnel и передать ей параметры полученные из файла конфигурации.
-
Вызвать функцию wireguard_force_handshake и отправить handshake в UDP пакете серверу WireGuard.
-
Создать поток периодически вызывающий функцию wireguard_tick и отправляющий результат ее работы (handshake и keepalive сообщения) серверу WireGuard.
-
Запустить фильтрацию входящих и исходящих сетевых пакетов:
-
Для исходящих пакетов (упрощённый workflow):
-
Проверяем должен ли данный пакет быть отправлен через VPN туннель.
-
Если нет то сразу возвращаем его сетевому стеку, берём следущий пакет и возращаемся к предыдущему пункту. Если да, то переходим к следующему шагу.
-
Меняем IP адрес источника на IP адрес указанный в конфигурационном файле и пересчитываем необходимые контрольные суммы пакета.
-
Передаём пакет функции wireguard_write, добавляем к полученному результату UDP и IP заголовки, подсчитываем контрольные суммы и возвращаем изменённый пакет сетевому стеку.
-
-
Для входящих пакетов (упрощенный workflow):
-
Проверяем, принадлежит ли полученный WireGuard пакет нашему туннелю.
-
Если нет то сразу возвращаем его сетевому стеку, берём следущий пакет и возращаемся к предыдущему пункту. Если да, то переходим к следующему шагу.
-
Извлекаем из UDP пакета полезную нагрузку и передаём ее функции wireguard_read. Если пакет успешно расшифрован, то меняем в нем IP адрес назначения на IP адрес сетевого интерфейса, пересчитываем контрольные суммы и возвращаем изменённый таким образом пакет сетевому стеку.
-
-
Приведённая обобщенная схема клиента опускает ряд деталей реализации, подробное изложение которых вышло бы чрезмерно объемным и могло бы утомить читателя. На мой взгляд, куда интереснее посмотреть, сможет ли клиент построенный на основе библиотеки BoringTun и работающий в пространстве пользователя обеспечить производительность сравнимую с существующими решениями. Или же он представляет чисто теоретический интерес. Кстати, для тех, кто заинтересовался, текущую версию консольного WireGuard клиента можно взять отсюда.
Citius, altius, fortius
Для сравнительных тестов на стороне клиента я использовал Intel® NUC DC3217IYE (Core i3-3217u) выпущенный около девяти лет назад. Такое относительно устаревшее железо было выбрано из тех соображений, что на нем легко увидеть разницу в производительности VPN клиентов уже на гигабитной сети. Для сравнительных тестов с современными CPU потребовалась бы как минимум 10-гигабитная сеть, которой под рукой к сожалению не оказалось. В таблице ниже приведены лучшие результаты из серий по 10 тестовых прогонов используя четыре параллельных TCP потока (по одному на каждый поток процессора), для максимальной нагрузки CPU.
iperf3 -c 10.66.66.1 -P 4 |
iperf3 -c 10.66.66.1 -R -P 4 |
|
WireSock VPN Client v1.0.46 |
879 Mbits/sec |
892 Mbits/sec |
WireGuard for Windows |
892 Mbits/sec |
719 Mbits/sec |
WireGuard for Windows |
288 Mbit/sec |
325 Mbits/sec |
TunSafe v1.4 |
435 Mbits/sec |
284 Mbits/sec |
Признаться, я и сам был несколько удивлён результатом. WireGuard клиент работающий в пространстве пользователя по своей пропускной способности оказался способен сравняться с представленной в августе реализацией референсного клиента в режиме ядра (WireGuardNT). И по всей видимости, не в последнюю очередь благодаря библиотеке BoringTun, которая служит прекрасной иллюстрацией того, где и как может использоваться Rust в современных реалиях.
Помимо впечатляющей производительности, новый клиент может предложить и некоторые полезные на мой взгляд функциональные расширения:
-
Выборочное туннелирование приложений посредством дополнительного параметра AllowedApps секции Peer.
-
Исключение указанных адресов сетей из туннеля посредством дополнительного параметра DisallowedIPs секции Peer.
-
Совместимость с Windows 10 Mobile Hotspot. Клиенты подключённые к точке доступа будут работать через VPN туннель сконфигурированный на хосте.
-
В комбинации с референсным WireGuard for Windows возможно организовать вложенный двойной VPN полностью на стороне клиента без необходимости конфигурировать сервера. Впрочем, если добавить немного кода, то и без референсного клиента в этой схеме можно вполне обойтись. Всегда есть к чему стремиться…
В заключение, я хотел бы продемонстрировать конфигурацию (значения ключей и порта изменены), которую сам использую для того, чтобы Google Chrome, подключался через VPN ко всем IP адресам за исключением локальной сети, а весь остальной трафик ходил как обычно.
[Interface]
PrivateKey = AD9GaupPbRlfjPTfhLm1/lm5qtgwvFcB1rGpKOZkXXE=
Address = 10.66.66.2/32, fd42:42:42::2/128
DNS = 94.140.14.14, 94.140.15.15
MTU = 1420
[Peer]
PublicKey = tRb3/FxzJBhinaVPY/tyoX40PS7EY1mmzFyrL/dAnwY=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = ora.sshvpn.me:51820
AllowedApps = chrome
DisallowedIPs = 192.168.1.0/24
Благодарю за внимание и терпение, всех кто дочитал до конца. Буду рад любым отзывам и замечаниям.
P.S. WARP
Работая над анголоязычной версией статьи, я решил поближе познакомиться с клиентом WARP для Windows. Как оказалось, его архитектура близка к вышеописанной (отсутствует виртуальный адаптер, трафик перехватывается), единственная отличие заключается в драйвере использованном для перехвата пакетов. Если описанный выше клиент использовал Windows Packet Filter, то WARP использует WinDivert. Вероятно, последний дает более высокую нагрузку CPU на скриншоте ниже.
This is a fully-featured WireGuard client for Windows that uses WireGuardNT. It is the only official and recommended way of using WireGuard on Windows.
If you’ve come here looking to simply run WireGuard for Windows, the main download page has links. There you will find two things:
This repository is MIT-licensed.
Copyright (C) 2018-2022 WireGuard LLC. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
Перед выполнением описанных ниже команд убедитесь, что вы используете последнюю версию WireGuard и обладаете правами администратора на вашем устройстве.
Установка
1) Скачайте текущую версию для Windows: https://www.wireguard.com/install/ и установите.
2) Запустите C:\Program Files\WireGuard\wireguard.exe и добавьте пустой туннель (мы будем настраивать серверную часть):
Добавить туннель → Добавить пустой туннель …
Регистрируем настройки:
Имя — имя сетевого подключения
Открытый ключ — открытый ключ сервера WireGuard (необходим для настройки клиентской части)
[Interface] PrivateKey = # private key of WireGuard server ListenPort = # port that WireGuard will listen to Address = # desired IP address of WireGuard server
Включить параметры, позволяющие серверу WG использовать основной сетевой интерфейс
3) Добавляем еще один пустой туннель (будем настраивать клиентскую часть): Add tunnel → Add empty tunnel
Регистрируем настройки:
Имя — имя сетевого подключения
Открытый ключ — открытый ключ клиента WireGuard (необходим для настройки серверной части)
[Interface] PrivateKey = # WireGuard client private key Address = # desired IP address of WireGuard client [Peer] PublicKey = # public key of the WireGuard server (from step 2) AllowedIPs = # specify the IP addresses for which you want to use the created WG tunnel (specifying the subnet 0.0.0.0/0 will allow you to route all traffic to the WG tunnel) Endpoint = # Server IP address (real, not WireGuard) and port that WireGuard server listens on (configured in step 2)
4) Теперь нам нужно добавить нашего клиента в серверную часть WireGuard, для этого вернитесь к шагу 2 и добавьте его конфиг:
... [Peer] PublicKey = #WireGuard client public key (from step 3) AllowedIPs = #IP user address
5) Настроим брандмауэр Windows для работы с WireGuard. Для этого:
- Создадим новое правило для входящего трафика:
-
Откройте «Windows Defender Firewall with Advanced Security» (Брандмауэр Windows с повышенной безопасностью).
-
В левой панели выберите «Inbound Rules» (Входящие правила).
-
Нажмите «New Rule…» (Создать правило).
-
- Укажем протокол (UDP) и порты (например, 51820):
-
В появившемся окне «New Inbound Rule Wizard» выберите «Port» (Порт) и нажмите «Next» (Далее).
- В разделе «Protocol and Ports» (Протокол и порты) выберите тип протокола:
-
Выберите «UDP».
-
- Укажите конкретные локальные порты (Specific local ports):
-
Например, порт WireGuard по умолчанию — 51820.
-
Если используется несколько портов, перечислите их через запятую (например: 51820, 51821).
-
-
Нажмите «Next» (Далее).
-
- Разрешим подключения:
-
В разделе «Action» (Действие) выберите «Allow the connection» (Разрешить подключение).
-
Нажмите «Next» (Далее).
-
- Сохраним правило:
- Определите профили, для которых будет применяться правило:
-
Domain (Доменный);
-
Private (Частный);
-
Public (Общий).
-
-
Нажмите «Next» (Далее).
-
Укажите понятное имя для нового правила, например: «WireGuard UDP 51820».
-
Нажмите «Finish» (Готово).
- Определите профили, для которых будет применяться правило:
Ваш брандмауэр настроен на пропуск трафика через указанные порты WireGuard
6) Теперь достаточно экспортировать файлы конфигурации Экспортировать все туннели в zip→Указатьместо для экспорта→Сохранить
Далее откройте сохраненный архив, там будут конфигурации всех наших туннелей.
Отдайте клиенту его конфигурационный файл.
7) На сервере выберите конфигурацию сервера и запустите программу
На клиенте добавьте файл конфигурации в WireGuard. Добавить туннель→Выбрать файл конфигурации клиента->Открыть
Выберите конфигурацию клиента и запустите программу
На этом настройка первого клиента завершена, аналогичным образом настраиваются остальные клиенты путем добавления их данных в конфигурацию сервера (шаг 4).
Автоматический запуск WireGuard после перезапуска сервера.
1) Добавьте файл запуска в автозапуск планировщика Windows: Пуск→taskschd.msc
Нажмите «Создать простую задачу» → Введите имя задачи (например, wireguard) → Далее
Выберите «При запуске компьютера» → Далее
Выберите «Запустить программу»→ Далее
В поле «Программа или сценарий» выберите файл для запуска WireGuard (по умолчанию это «C:\Program Files\WireGuard\wireguard.exe»).
Добавьте аргументы:
/installtunnelservice "C:\Program Files\WireGuard\wg_server.conf"
где:
C:\Program Files\WireGuard\wg_server.conf — расположение конфигурационного файла *.conf
Установите флажок «Открыть окно свойств для этой задачи после нажатия кнопки «Готово»» → Готово
В открывшемся окне отметьте пункт «Запускать с наивысшими правами»→ОК
Готово. Выполните перезагрузку, проверьте
Estimated reading: 4 minutes
1034 views
Prerequisites
WireGuard VPN Server has been installed
My WireGuard Server:
IP Address: 204.44.64.66
Listen Port: 3650
Range IP VPN : 192.168.6.0/24
Public and Private key is ready
How to configure WireGuard Client on Windows
1. Download and install the Windows MSI package from the WireGuard website.
2. Configure WireGuard Client on Window
Once installed, open the WireGuard application and click on “Add Tunnel” -> “Add empty tunnel…” as shown on the image below:
A publickey pair is automatically created .Enter a name for the tunnel and edit the configuration as follows:
[Interface] Address = IP_VPN_of_Client DNS = 8.8.8.8, 8.8.4.4 [Peer] PublicKey = Public_key_of_the_WireGuard_Server Endpoint = IP_of_the_WireGuard_Server:Port_VPN_of_the_Server AllowedIPs = Allow all traffic via VPN
Once done, click on the “Save” button.
3. Configure on the Wireguard Server
- Add the client’s public key and IP address to the server. To do that, run the following command on the Ubuntu server:
# wg set wg0 peer PublicKey_of_the_Client allowed-ips IP_VPN_of_Client
Make sure to change the CLIENT_PUBLIC_KEY
with the public key you generated on the client machine (cat /etc/wireguard/publickey
) and adjust the client IP address if it is different. Windows users can copy the public key from the WireGuard application.
- Add the following lines to the file /etc/wireguard/wg0.conf :
[Peer] ## Desktop/client VPN public key ## PublicKey = Client VPN public key ## client VPN IP address (note the /32 subnet) ## AllowedIPs = 192.168.6.10/32
Save and exit
Once done, go back to the client machine and bring up the tunneling interface.
On windows Clients
click on the “Activate” button. Once the peers are connected, the tunnel status will change to Active:
Please note: By this step your VPN is enabled on the client so it will lose connection to the client IP now. You need to temporarily deactivate Wireguard on the Window client then configure NAT on the Wireguard Server as the steps below to allow WireGuard Client to access the Internet
4. Configure NAT on the Wireguard Server
We need to configure NAT to allow WireGuard Client to access the Internet. Here we will use IPtables to configure NAT rule so that the WireGuard VPN client side can go to the internet using the Public IP of the WireGuard VPN Server.
For IPv4, we set the following Linux kernel variables to accept incoming network packets on wg0, which are routed to another network interface eth0 . The following should be done
# sysctl -w net.ipv4.ip_forward=1
- Setting up NAT firewall rules
# iptables -t nat -I POSTROUTING 1 -s {sub/net} -o {interface} -j MASQUERADE
iptables -t nat -I POSTROUTING 1 -s 192.168.6.0/24 -o eth0 -j MASQUERADE
- Accept all traffic created by wg0 interface
Allow all traffic on wg0 interface:
# iptables -I INPUT 1 -i {interface} -j ACCEPT
# iptables -I INPUT 1 -i wg0 -j ACCEPT
The above rules allows for packets destined to wg0.
- Configuring FORWARD rules
We must allow for packets being routed through the WireGuard server by setting up the FORWARD rule. The syntax is:
# iptables -I FORWARD 1 -i eth0 -o wg0 -j ACCEPT
# iptables -I FORWARD 1 -i wg0 -o eth0 -j ACCEPT
- Open WireGuard UDP port # 3650
# iptables -I INPUT 1 -i eth0 -p udp --dport 3650 -j ACCEPT
Here is how to list and display all NAT IPTables rules using the iptables command to verify that those rules are working when your wireguard client connect to the server:
# iptables -t nat -L -n -v
# iptables-save -t nat
- Reload all changes and turn on NAT routing
# systemctl restart [email protected]
5. Test the VPN connection on Client Window
Check if the IP after connecting to the VPN is the public IP of WireGuard Server VPN
This is the public IP of the WireGuard Server, so the NAT configuration process is successful, your entire connection going out to the Internet will be transmitted encrypted and securely to the WireGuard VPN Server and then out to the Internet, so when When accessing the Internet, you will only leave a trace: the Public IP address of WireGuard VPN Server and the real Public IP address of your home Internet connection will be hidden.
Good luck!
С февраля 2022 года каждый пользователь в составе своего тарифа получает возможность использования сервера WireGuard и устанавливать одно подключение к нему из сети Интернет.
Соединение WireGuard является дополнительным к вашим существующим туннелям и использование WireGuard не считается туннелем в рамках тарифного плана.
В рамах базового тарифа пользователю предоставляются 2 туннеля с протоколами PPTP, L2TP, L2TP/IPsec, IKEv2/IPsec, SSTP, OpenVPN, Openconnect и дополнительно одно соединение по протоколу WireGuard. Таким образом, каждый пользователь сможет одновременно установить три соединения к VPNKI.
Соединение WireGuard отличается еще и тем, что пока в нем нет возможности маршрутизации сетей, расположенных «за маршрутизатором», но мы планируем добавить такую возможность несколько позже.
Так как протокол WireGuard использует другую архитектуру, то логика его настройки на сервере VPNKI отличается от традиционной.
Мы хотим получить удаленный доступ к своей сети из Интернет с использованием протокола WireGuard. При этом наша сеть уже подключена к VPNKI по любому из протоколов — PPTP, L2TP/Ipsec, OpenVPN.
В качестве клиентского ПО мы будем использовать клиентское ПО WireGuard для Windows. Компьютер с клиентом WireGuard будет расположен в Интернет.
В момент подключения, в вашем клиентском ПО WireGuard будет создан туннельный интерфейс и использован адрес 172.16.0.3 сети VPNKI. Ну а хотим мы «достучаться» до сервера с адресом 192.168.1.10 в домашней сети.
Схема представлена здесь.
1. Подготовка сервера
Основная особенность WireGuard состоит в том, что у него нет понятия клиент и сервер, а все соединения равнозначны.
Однако в нашей терминологии мы будем использовать слово «Сервер» применительно к тому WireGuard, который запущен на сервере VPNKI, а термин «Клиент» будем применять к Wireguard, который запущен на вашем компьютере с Windows.
Сначала нам будет необходимо сконфигурировать сервер WireGuard на VPNKI. Этот процесс состоит из двух шагов:
- Выбор порта UDP на котором будет «слушать» ваш сервер WireGuard и ожидать подключения из сети Интернет.
- Предварительная конфигурация сервера WireGuard — назначение приватного и публичного ключей сервера.
1.1. Начнем с выбора UDP порта. На главной странице туннелей выберите галочку «Использовать доступ через WireGuard».
Сервер выберет доступный UDP порт, на которому будет «слушать» ваш сервер WireGuard.
В данном примере система выбрала порт 26005 ( у вас будет какой-то другой). После завершения выбора порта можно переходить к предварительной конфигурации сервера.
1.2. На этом шаге система подготовит публичный и приватный ключи вашего сервере WireGuard.
Приватный ключ сервера VPNKI сохранит у себя, а вот публичный ключ покажет вам. Он будет необходим для корректной конфигурации вашего клиента WireGuard на ПК с ОС Windows.
Нажмите «Создать сервер WireGuard«.
После генерации ключей система подготовила вам Публичный ключ сервера: Clu9YfM1KD8C+zl11fob2QDUiZcV1wqJzUOwihmavHA=. (у вас он будет какой-то другой).
На этом этап подготовки завершен и можно переходить к конфигурации клиента.
2. Установка клиента WireGuard
2.1. Установите ПО WireGuard на ваш ПК с ОС Windows, скачав пакет с официального сайта.
После установки вам будет необходимо создать новое соединение. Делается это в меню»Добавить туннель» и дальше нужно выбрать «Добавить пустой туннель».
После добавления пустого туннеля вам будет сгенерирован приватный и публичный ключи клиента. Эти ключи будут показаны на следующем экране. Нас будет интересовать только Публичный ключ (поле 1).
2.2. Назовите как-нибудь соединение (например VPNKI) и нажмите «Сохранить«.
Теперь у вас есть предварительно сконфигурированное подключение, но это еще не полная его конфигурация.
Мы вернемся к нему чуть позже, а пока пришло время сообщить серверу публичный ключ клиента, а клиенту сообщить публичный ключ сервера. Вроде бы просто, но путаница возникает часто.
Выделите и скопируйте в буфер обмена Публичный ключ (поле 1). Сейчас мы перейдем к серверу VPNKI и укажем его там в настройках подключения.
3. Конфигурация подключения на сервере VPNKI
3.1. Вернитесь к экрану настройки сервера Wireguard и в разделе «Данные клиента» нажмите «Создать подключение».
3.2. На следующем экране вам предложат ввести «Публичный ключ клиента».
3.3. Вставьте Публичный ключ клиента из буфера обмена (который вы скопировали туда на шаге 2.2) и нажмите «Сохранить».
!!! Обратите внимание, что ключ всегда имеет длину 44 символа, последний из которых знак равенства =.
3.4. После сохранения публичного ключа клиента на сервере запустится процесс WireGuard и он будет готов принимать подключение.
Теперь осталась одна деталь… надо окончательно сконфигурировать клиента и попробовать подключиться.
4. Завершение конфигурации клиента WireGuard на ПК с ОС Windows для подключения
4.1. Завершим конфигурацию клиента. Для этого войдем в режим редактирования ранее созданного подключения при помощи кнопки «Редактировать«.
4.2. Теперь вам нужно дозаполнить данные, которые будут описывать сервер и его данные. Это описание должно будет располагаться в месте красной рамки.
Взять эти данные для заполнения нам предстоит на сервере VPNKI. Для этого нажмите на кнопку «Конфигурация клиента».
Откроется окно с данными, которые вам будет необходимо перенести в конфигурацию вашего клиентского подключения.
На скриншоте ниже показаны два окна — окно сервера VPNKI и окно редактирования клиентского подключения. Рамкой отомечен тот текст, который вам нужно будет скопировать и вставить.
Вот так:
Нажмите «Сохранить«.
Теперь ваше клиентское подключение полностью сконфигурировано и готово к подключению. После сохранения вы увидите полную конфигурацию вашего клиента.
Однако перед нажатием кнопки подключиться давайте все еще раз проверим и поясним детали.
- В вашей настройке соединения на клиентском ПО верхняя часть описывает ваш собственный интерфейс. Хоть мы его и назвали VPNKI, но это ваш интерфейс. Он пока отключен. Его публичный ключ — OYUNru3L5zljznYR1NEHMCVFCgeIwQWal91O4Q8qwA0= IP адреса:172.16.0.3/32 это адрес, который будет использован на вашем интерфейсе после успешного подключения.
- Нижняя часть (Пир) описывает сервер. Публичный ключ сервера — Clu9YfM1KD8C+zl11fob2QDUiZcV1wqJzUOwihmavHA= Адреса, при обращении к которым, трафик вашего клиента пойдет в туннель WireGuard — 172.6.0.0/16. Это адреса вашей сети VPNKI. То есть при успешном подключении из Интернет пинг с вашего ПК, отправленный по адресу 172.16.0.1 пойдет в интерфейс WireGuard, а не куда-либо еще. По сути, это правило для таблицы маршрутизации вашего ПК. Ну и в завершении — IP адрес сервера и порт — 84.201.157.25:26005. Это то, куда ваш клиент будет подключаться из Интернет используя протокол UDP. Наверное все.
Теперь можно попробовать подключиться. Но ….
5. Подключаемся снаружи
Обратите внимание, что эта инструкция подразумевает, что ваш клиентский ПК расположен в сети Интернет. Но если сейчас ваш ПК подключен к домашней сети, которая, в свою очередь, уже подключена к VPNKI то имеет смысл выключить этот ПК из домашней сети и подключить его, например, к сотовому оператору связи.
Если ваш ПК уже в Интернет, то нажимайте Подключить и смотрите за результатом.
На скриншоте показано успешное подключение. Давайте попробуем выполнить пинг сервера VPNKI по туннелю WireGuard — ping 172.16.0.1.
Пинг успешен. Это хорошо. Но как быть если нужно выполнить пинг, например, адреса 192.168.1.1, который расположен где-то в вашей сети VPNKI.
С текущими настройками это будет невозможно. Потому что ваш клиент просто не отправляет пакеты к адресу 192.168.1.1 в интерфейс Wireguard. Вот пинг и не успешен…
Давайте добавим маршрут к вашей сети 192.168.1.0/24 через интерфейс WireGuard. Для этого остановим соединение и внесем изменение в настройки подключения на вашем клиенте. А именно …
Добавим через запятую нужные адреса сетей, которые должны быть доступны через туннель WireGuard, сохраним настройки, переподключитмся и выполним пинг 192.168.1.1 .
Вот теперь все успешно. И в завершение можно выполнить пинг адреса сервера в домашней сети — 192.168.1.10.
Теперь все.
PS: В процессе написания инструкции мы обратили внимание на некоторые странности в работе ПО WireGuard под Windows. При попытке подключения в статусе содинения может быть написано «Подключен», но при этом не появляется статистика числа переданных и полученных байт. Ну и фактически трафик по туннелю не передается. Поэтому больше доверяйте статистике, чем самому статусу подключения. Если статистика есть — значит туннель работает.
Спасибо за внимание и успехов в пингах!
*** WireGuard пока в тестовом режиме, если вдруг что-то не получилось, обращайтесь на Форум.