Строим VPN-туннель в локальную сеть с помощью «WireGuard»
Безопасный удаленный доступ к сервисам в локальной сети.
VPN (англ. Virtual Private Network, «виртуальная частная сеть») — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например Интернет).
Наиболее популярные решения с открытым исходным кодом для построения виртуальных частных сетей — «OpenVPN» и «IPSec». В релиз ядра Linux 5.6, который состоялся 30 марта 2020 года, вошла еще одна реализация технологии VPN — «WireGuard». Это молодой набирающий популярность проект.
Основные преимущества «WireGuard»:
- Высокая производительность (бенчмарки можно посмотреть тут)
- Простая настройка
- Современная криптография
- Качественный код
В этой инструкции мы настроим VPN-туннель в локальную сеть с помощью «WireGuard» и обеспечим доступ из интернета к узлам LAN с различных устройств.
Адресация в LAN - 192.168.100.0/24, VPN-сети назначим диапазон 10.0.0.0/24.
Настройка сервера
Для размещения сервера потребуется VPS. При выборе необходимо обратить внимание на технологию виртуализации: предпочтительно KVM, можно XEN, а вот OpenVZ следует избегать. Дело в том, что в WireGuard реализован как модуль ядра, а в OpenVZ ядро очень старое. Я буду использовать самый дешевый виртуальный сервер c операционной системой Ubuntu 20.04 (KVM 512 МБ RAM 20 ГБ SSD 1 CPU - такая конфигурация вполне подойдет).
Залогинимся на сервер с правами пользователя root и выполним следующие команды:
Создадим конфигурационный файл /etc/wireguard/wg0.conf со следующим содержимым:
Параметры PostUp/PostDown содержат правила iptables, которые будут применены при запуске/остановке сервиса. Обратите внимание на название сетевого интерфейса — оно должно соответствовать общедоступному сетевому адаптеру, в моем случае это eth0. Вывести список адаптеров можно командой:
Выберите из списка тот, которому соответствует внешний IP-адрес. <SERVER_PRIVATE_KEY> - заменяем содержимым файла /etc/wireguard/privatekey.
Запустим VPN-сервис и добавим его в автозагрузку:
Убедимся, что служба запустилась корректно:
Настройка клиента в LAN
Если ваш роутер поддерживает WireGuard (Zyxel KeeneticOS >=3.3, Mikrotik RouterOS >=7.1beta2, OpenWRT) — можно настроить VPN-клиент прямо на нем. Я буду использовать для этой цели сервер Ubuntu 20.04 (локальный адрес 192.168.100.7).
Первый этап настройки аналогичен конфигурации серверной части. Выполняем с правами root-пользователя:
Редактируем /etc/wireguard/wg0.conf:
<PEER_LAN_PRIVATE_KEY> — заменяем содержимым /etc/wireguard/privatekey, <SERVER_PUBLIC_KEY> — /etc/wireguard/publickey с сервера, <SERVER_IP> — внешний IP-адрес сервера. Правила iptables в PostUp/PostDown необходимы для того, чтобы наш клиент выступал в роли шлюза в LAN. Указываем в правилах тот сетевой интерфейс, на который назначен локальный адрес (192.168.100.7, в моем случае это wlp2s0). Уточните его путем исполнения команды:
В параметре AllowedIPs задаются адреса, маршрутизация к которым будет осуществляться через VPN-интерфейс. В поле PersistentKeepalive — периодичность проверки доступности соединения в секундах. Запускаем службу и добавляем в автозагрузку:
На сервере добавляем в файл /etc/wireguard/wg0.conf блок:
Где <PEER_LAN_PUBLIC_KEY> — /etc/wireguard/publickey клиента. Перезапустим службу и убедимся, что все настроено корректно:
Проверим теперь с клиента:
Настройка удаленных клиентов
Сборки WireGuard доступны для основных платформ: Linux, Windows, Mac, Android, FreeBSD, OpenWRT и др. Рассмотрим настройку VPN-клиента на десктопах под управлением Linux и Windows, а так же на Android-смартфоне.
Удаленный Linux клиент
На клиенте выполняем с правами root:
Конфигурационный файл /etc/wireguard/wg0.conf:
<PEER_1_PRIVATE_KEY> — заменяем содержимым /etc/wireguard/peer_1_privatekey, <SERVER_PUBLIC_KEY> — /etc/wireguard/publickey с сервера.
Обратите внимание на строку «AllowedIPs = 0.0.0.0/0» - в данной конфигурации весь трафик будет маршрутизироваться через VPN-адаптер. Это может понадобиться для сокрытия реального IP при работе в интернет или для защиты трафика при подключении к недоверенным сетям (например публичные Wi-Fi точки доступа). В этом случае указываем «DNS = 8.8.8.8» (8.8.8.8 - DNS-сервер Google), чтобы DNS-запросы выполнялись через защищенное VPN-соединение.
Если VPN-туннель необходим только для доступа к LAN 192.168.100.0/24 - убираем строчку «DNS = 8.8.8.8» и в параметре AllowedIPs меняем «0.0.0.0/0» на «10.0.0.0/24, 192.168.100.0/24».
На сервере в конфигурационный файл /etc/wireguard/wg0.conf добавляем блок:
Где <PEER_1_PUBLIC_KEY> — содержимое файла /etc/wireguard/peer_1_publickey клиента и перезапускаем службу:
Возвращаемся на клиент и проверяем доступность узлов в LAN через VPN-туннель:
Удаленный Windows клиент
Скачиваем WireGuard для Windows с официального сайта и устанавливаем.
На сервере сгенерируем ключи для Windows-клиента:
Добавим блок Peer в файл /etc/wireguard/wg0.conf:
Перезапустим сервер:
Конфигурационный файл windows.conf:
В приложении WireGuard открываем конфигурационный файл и нажимаем кнопку «подключение».
Конфигурационные файлы можно генерировать и на клиентах, а после отправлять открытые части ключей на сервер.
Удаленный Android клиент
Приложение для Android доступно в Google Play.
Генерируем ключи для клиента и добавляем Peer в конфигурационный файл сервера.
/etc/wireguard/wg0.conf:
Не забываем перезапускать сервер после каждого изменения конфигурации:
Создадим конфигурационный файл для Android клиента mobile.conf:
Устанавливаем пакет qrencode:
И генерируем QR-код с конфигурацией для PEER_3:
В Android-приложении выбираем пункт меню «сканировать QR-код»:
И подключаемся к VPN-туннелю:
Распространенные проблемы
1. Соединение не устанавливается, «0 B received»
Возможные причины и решения:
- Сетевое соединение блокируется межсетевым экраном - проверьте настройки iptables на сервере и Linux клиентах, брандмауэра Windows, межсетевого экрана маршрутизатора;
- UDP трафик блокируется интернет провайдером - WireGuard не поддерживает TCP, в этом случае стоит рассмотреть альтернативные решения, например openVPN в режиме TCP (либо туннелировать UDP, что не всегда целесообразно);
- Ошибка в IP-адресе или PORT сервера - проверьте значение параметра «Endpoint» в конфигурационном файле;
- Ошибка в ключах - проверьте ключи, в конфигурации сервера - открытые части ключей клиентов и приватная часть ключа сервера, в конфигурации клиентов - открытая часть ключа сервера, приватная часть ключа клиента.
2. При указании параметра DNS возникает ошибка «resolvconf: command not found»
Установите пакет openresolv:
WireGuard - оптимальное решение для организации удаленного доступа к сетям малых офисов и домашним сетям. Он прост в настройке, работает на всех распространенных платформах и обладает хорошей производительностью.