Проблема
В современном мире распределённая работа стала нормой. Сотрудники работают из дома, из командировок, из кофеен, а филиалы компании разбросаны по разным городам и даже странам. Им всем нужен безопасный и надёжный доступ к корпоративным ресурсам. Файловым серверам, базам данных, внутренним порталам.
Традиционные решения IPsec и OpenVPN имеют серьёзные недостатки. Они сложны в настройке, требовательны к ресурсам, а их производительность оставляет желать лучшего. OpenVPN, например, работает в пользовательском пространстве, что создаёт дополнительную нагрузку на процессор и увеличивает задержки. IPsec известен своей запутанной конфигурацией и проблемами совместимости между разными реализациями.
Администратору нужно решение, которое разворачивается за 10-15 минут, а не за полдня. Даёт высокую пропускную способность и минимальные задержки. Просто в поддержке и не требует постоянного «допиливания». Работает на любом оборудовании от облачного VPS до старого офисного ПК.
Решение
WireGuard это современный VPN протокол, который решает все перечисленные проблемы. Он встроен прямо в ядро Linux, работает на уровне L3 и использует современную криптографию (ChaCha20, Poly1305, Curve25519). Его кодовая база составляет всего около 4000 строк. Это делает его не только быстрым, но и безопасным. Негде спрятать уязвимости.
Ключевые преимущества WireGuard перечислены ниже.
Простота настройки. Конфигурация в формате INI с десятком параметров, а не сотни строк.
Высокая производительность. Работает в ядре, что даёт пропускную способность, близкую к пропускной способности самого канала.
Кросс-платформенность. Клиенты доступны для Windows, macOS, Linux, Android и iOS.
Автоматическое переподключение. Клиент сам восстанавливает соединение после потери связи.
Бесшумная работа. Не создаёт постоянного фонового трафика, «просыпается» только при необходимости.
В этой статье мы развернём корпоративный VPN на WireGuard в двух самых частых сценариях. Подключение удалённых сотрудников (road warrior) и объединение филиалов (site to site). В качестве сервера будем использовать Ubuntu 22.04 или 24.04 LTS. Это может быть как облачный VPS, так и физический сервер в офисе.
Пошаговая инструкция
1. Подготовка сервера
1.1. Обновление системы и установка WireGuard
text
sudo apt update && sudo apt upgrade -y
sudo apt install wireguard wireguard-tools -y
Для RHEL подобных систем.
text
sudo dnf install wireguard-tools -y
1.2. Включение IP форвардинга
Чтобы сервер мог передавать трафик между VPN клиентами и корпоративной сетью, необходимо включить пересылку пакетов.
text
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
Для постоянного применения раскомментируйте строки net.ipv4.ip_forward=1 и net.ipv6.conf.all.forwarding=1 в файле /etc/sysctl.conf, затем выполните.
text
sudo sysctl -p
1.3. Настройка брандмауэра
WireGuard использует один UDP порт (по умолчанию 51820). Откроем его в брандмауэре.
Для ufw.
text
sudo ufw allow 51820/udp
sudo ufw enable
Для firewalld.
text
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --reload
2. Генерация ключей
WireGuard использует асимметричную криптографию. Каждый участник имеет пару ключей: приватный и публичный. Приватный ключ хранится на стороне участника и никогда не передаётся. Публичным ключом участники обмениваются.
Создадим директорию для хранения ключей и сгенерируем их для сервера.
text
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
Аналогично для каждого клиента (на сервере, чтобы потом сразу скопировать конфигурацию).
text
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
Важно. Приватные ключи (*_private.key) должны оставаться на своих устройствах и не передаваться по сети.
3. Настройка сервера
Создадим конфигурационный файл /etc/wireguard/wg0.conf.
text
[Interface]
PrivateKey = <содержимое server_private.key>
Address = 10.0.0.1/24
ListenPort = 51820
SaveConfig = false
# NAT для клиентов (если нужно дать им доступ в интернет через сервер)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Пояснение параметров.
Address IP адрес сервера внутри VPN (10.0.0.1/24). Клиенты получат адреса из этой же подсети.
ListenPort порт, на котором сервер ожидает подключений.
PostUp и PostDown команды, выполняемые при поднятии и опускании интерфейса. В данном случае разрешаем пересылку пакетов через интерфейс VPN и настраиваем NAT, чтобы клиенты могли выходить в интернет.
Официальная документация. Подробное описание всех параметров конфигурации доступно на сайте WireGuard.
4. Настройка клиента (сценарий «удалённый сотрудник»)
Для каждого удалённого сотрудника создаётся отдельный конфигурационный файл.
4.1. Добавление клиента в конфигурацию сервера
В файл /etc/wireguard/wg0.conf добавляем секцию для клиента.
text
[Peer]
PublicKey = <публичный ключ клиента>
AllowedIPs = 10.0.0.2/32
Параметр AllowedIPs определяет, какие IP адреса будут направляться через VPN. Для удалённого сотрудника указываем его VPN адрес в формате /32.
Важно. Для нескольких клиентов нужно указывать разные VPN адреса. 10.0.0.2/32, 10.0.0.3/32 и так далее.
4.2. Конфигурационный файл для клиента
Создаём файл client1.conf.
text
[Interface]
PrivateKey = <приватный ключ клиента>
Address = 10.0.0.2/24
DNS = 8.8.8.8
[Peer]
PublicKey = <публичный ключ сервера>
Endpoint = <публичный IP сервера>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Address VPN адрес клиента (должен совпадать с указанным в AllowedIPs на сервере).
DNS DNS сервер, который будет использоваться при активном VPN.
Endpoint публичный IP адрес и порт сервера.
AllowedIPs = 0.0.0.0/0 весь трафик клиента направляется через VPN. Если нужно, чтобы через VPN шёл только трафик к корпоративной сети, а интернет трафик напрямую (split tunneling), указываем только нужные подсети. Например AllowedIPs = 10.0.0.0/24, 192.168.1.0/24.
PersistentKeepalive интервал отправки keepalive пакетов для поддержания соединения. Особенно актуален для клиентов за NAT.
4.3. Импорт конфигурации на клиенте
Windows и macOS. Скачать официальное приложение WireGuard с официального сайта, затем импортировать конфигурационный файл через интерфейс.
Linux. Скопировать файл в /etc/wireguard/wg0.conf и запустить sudo wg-quick up wg0.
Android и iOS. Установить приложение WireGuard из магазина приложений и импортировать конфигурацию через QR код (для этого нужно сгенерировать QR код с помощью утилиты qrencode).
5. Объединение филиалов (site to site VPN)
Этот сценарий используется, когда нужно соединить две и более локальные сети (например, главный офис и филиал) через защищённый туннель.
5.1. Предварительные требования
В каждом офисе должен быть выделенный шлюз (роутер или сервер), который будет выступать в роли WireGuard пира.
Локальные подсети в офисах не должны пересекаться. Например, главный офис 192.168.1.0/24, филиал 192.168.2.0/24.
На обоих шлюзах должен быть доступен UDP порт для WireGuard.
5.2. Конфигурация шлюза главного офиса (site A)
Файл /etc/wireguard/wg0.conf.
text
[Interface]
PrivateKey = <приватный ключ site A>
Address = 10.0.0.1/24
ListenPort = 51820
[Peer]
PublicKey = <публичный ключ site B>
AllowedIPs = 192.168.2.0/24, 10.0.0.2/32
Endpoint = <публичный IP филиала>:51820
PersistentKeepalive = 25
5.3. Конфигурация шлюза филиала (site B)
Файл /etc/wireguard/wg0.conf.
text
[Interface]
PrivateKey = <приватный ключ site B>
Address = 10.0.0.2/24
ListenPort = 51820
[Peer]
PublicKey = <публичный ключ site A>
AllowedIPs = 192.168.1.0/24, 10.0.0.1/32
Endpoint = <публичный IP главного офиса>:51820
PersistentKeepalive = 25
5.4. Настройка маршрутизации
Чтобы компьютеры в локальных сетях могли «видеть» друг друга, необходимо выполнить следующие действия.
На каждом шлюзе добавить статические маршруты, указывающие, что трафик в удалённую подсеть нужно направлять через WireGuard интерфейс. Это можно сделать через PostUp в конфигурации.
text
PostUp = ip route add 192.168.2.0/24 dev wg0
PostDown = ip route del 192.168.2.0/24 dev wg0
Включить пересылку пакетов на обоих шлюзах (уже сделано на шаге 1.2).
Настроить NAT (если компьютеры в локальной сети не имеют прямых маршрутов до друг друга). Если оба офиса используют приватные подсети, достаточно включить IP форвардинг. NAT не требуется. Однако если компьютеры в подсетях используют шлюз по умолчанию, необходимо добавить правило NAT.
text
PostUp = iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wg0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 192.168.1.0/24 -o wg0 -j MASQUERADE
Убедиться, что брандмауэр на обоих шлюзах разрешает пересылку пакетов между интерфейсами.
text
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
Эти правила также можно добавить в PostUp и PostDown.
Официальный пример. Документация Ubuntu содержит подробный пример настройки site to site VPN с WireGuard и пояснениями по маршрутизации.
6. Split tunneling (частичный проброс трафика)
Split tunneling это режим, при котором через VPN направляется только трафик к корпоративной сети, а интернет трафик идёт напрямую через провайдера. Это снижает нагрузку на сервер и уменьшает задержки для интернет трафика.
Для настройки split tunneling достаточно изменить параметр AllowedIPs в конфигурации клиента.
text
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
Вместо 0.0.0.0/0 указываются только нужные подсети. При этом важно, чтобы на клиенте не было конфликтующих маршрутов.
Рекомендация. Для удалённых сотрудников, которым нужен доступ только к внутренним ресурсам, split tunneling оптимальный выбор. Для администраторов, которые управляют серверами через VPN, часто удобнее полный туннель, чтобы исключить утечку трафика.
7. Запуск и управление
Запуск VPN на сервере.
text
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
Проверка статуса.
text
sudo wg show
Вывод должен показывать интерфейс, приватный ключ, порт, а также список пиров с их публичными ключами, последним временем handshake и количеством переданных байт.
Остановка VPN.
text
sudo wg-quick down wg0
Перезагрузка конфигурации без остановки соединений.
text
sudo wg syncconf wg0 <(wg-quick strip wg0)
Устранение распространённых проблем
ПроблемаВероятная причинаРешениеНет handshake (wg show показывает latest handshake: none)Не совпадают публичные ключи, неверный порт или IP адрес endpoint, брандмауэр блокирует UDP портПроверить совпадение ключей на сервере и клиенте. Убедиться, что сервер доступен по указанному IP и порту (nc -vzu <IP> 51820). Открыть порт в брандмауэре.Клиенты не пингуют друг друга или серверНе настроена пересылка пакетов (IP forwarding), клиентский firewall блокирует ICMPВключить IP форвардинг (sysctl net.ipv4.ip_forward=1). Проверить правила iptables, добавить -A FORWARD -i wg0 -j ACCEPT.Есть handshake, но нет доступа к локальным ресурсамОтсутствуют маршруты на клиенте или сервере, не настроен NAT для локальной сетиПроверить таблицу маршрутизации (ip route). Убедиться, что в AllowedIPs указаны нужные подсети. Добавить статические маршруты на шлюзах локальных сетей.VPN работает, но интернет на клиенте пропалAllowedIPs = 0.0.0.0/0 направляет весь трафик через VPN, но на сервере не настроен NAT для выхода в интернетДобавить правило NAT на сервере (iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE). Убедиться, что IP форвардинг включён.Низкая скорость или периодические обрывыMTU слишком большой для данного канала (особенно на мобильных сетях)Уменьшить MTU до 1280 или 1420. Добавить в секцию [Interface] строку MTU = 1280.Ошибка Operation not permitted при запуске wg-quickНедостаточно прав, SELinux блокируетЗапускать с sudo. На RHEL системах установить политику: sudo setsebool -P domain_can_mmap_files 1.
Итог
WireGuard это современный, быстрый и простой в настройке VPN протокол, который идеально подходит для корпоративного использования. Мы разобрали два основных сценария. Подключение удалённых сотрудников (road warrior) и объединение филиалов (site to site). Настройка занимает 10-15 минут, а производительность WireGuard приближается к пропускной способности самого канала.
Настройка VPN на WireGuard сводится к нескольким шагам. Генерация ключей, создание конфигурационных файлов, включение IP форвардинга и настройка брандмауэра. Split tunneling позволяет гибко управлять тем, какой трафик идёт через VPN, снижая нагрузку на сервер. При возникновении проблем достаточно проверить ключи, порты и таблицы маршрутизации. В отличие от OpenVPN, WireGuard не скрывает диагностическую информацию.
Для масштабирования решения на десятки и сотни клиентов рекомендуется использовать централизованные системы управления ключами (например, wg-dynamic или специализированные панели), а также интегрировать аутентификацию с существующим LDAP или Active Directory через скрипты и обёртки вокруг wg set.