WireGuard VPN-сервер на Linux: готовая инструкция для удалённого доступа в офис
Меня зовут Семёнов Евгений Сергеевич, я директор АйТи Фреш. За 15+ лет работы админом я поднял десятки VPN-серверов — IPsec на Cisco, OpenVPN на pfSense, SoftEther, Strongswan на Linux. С 2020 года все мои новые проекты — только WireGuard. Он быстрее на порядок, конфиг занимает десять строк, а клиент ставится на телефон сотрудника за две минуты. В этой статье я покажу, как развернуть WireGuard-сервер на Ubuntu так, чтобы он пережил сотню пользователей и не развалился при смене сети на мобильнике бухгалтера.
Чем WireGuard отличается от OpenVPN и IPsec
WireGuard — это VPN-протокол, написанный Джейсоном Доненфельдом в 2016 году и принятый в ядро Linux 5.6 весной 2020-го. Его ключевые отличия от старых решений:
- Код в ядре, а не в userspace. Пакеты не копируются между ядром и процессом демона — скорость растёт в 3–10 раз. На Dell Xeon Platinum 8280 в нашем дата-центре МТС один WireGuard-сервер обслуживает 8 Гбит/с шифрованного трафика без потери пакетов.
- Современная криптография. ChaCha20 для шифрования, Poly1305 для MAC, Curve25519 для Diffie-Hellman, BLAKE2s для хеша. Никаких устаревших алгоритмов.
- Короткий код. Около 4000 строк против 600 000 у OpenVPN — аудит реальный, ошибок мало.
- Stateless с точки зрения пользователя. Сменили Wi-Fi на мобильный — тоннель не упал, первый пакет с нового IP восстановит сессию.
- Простой конфиг. INI-формат, десять строк на сервер и пять на клиента.
Подготовка сервера: Ubuntu 22.04 LTS
Базовая конфигурация под WireGuard: любая VPS или домашний сервер с публичным IP. Для офиса на 50 пользователей хватает 2 vCPU и 2 ГБ RAM. Я обычно беру Ubuntu Server 22.04 LTS или Debian 12 — оба идут с ядром 5.15+, где WireGuard уже встроен.
apt update && apt upgrade -y
apt install -y wireguard wireguard-tools qrencode iptables-persistent
# Включаем форвардинг пакетов
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.conf
sysctl -p
Проверяем версию ядра — должна быть 5.6+ для встроенного модуля:
uname -r
modprobe wireguard && echo "Модуль загружен"
Генерация ключей и конфиг сервера
WireGuard работает на парах ключей Curve25519. Сервер имеет свою пару, каждый клиент — свою, и они обмениваются только публичными частями. Начинаем с сервера:
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
cat server_private.key
cat server_public.key
Создаём основной конфиг /etc/wireguard/wg0.conf:
[Interface]
PrivateKey = СЮДА_СОДЕРЖИМОЕ_server_private.key
Address = 10.88.88.1/24
ListenPort = 51820
SaveConfig = false
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Клиентов добавляем ниже блоками [Peer]
Запускаем тоннель и включаем автозапуск:
systemctl enable --now wg-quick@wg0
wg show
ip a show wg0
Добавление клиентов
Для каждого пользователя генерируем свою пару ключей. Я всегда держу отдельную папку с именем клиента, чтобы не путаться:
mkdir -p /etc/wireguard/clients/ivanov
cd /etc/wireguard/clients/ivanov
wg genkey | tee ivanov.key | wg pubkey > ivanov.pub
wg genpsk > ivanov.psk # Дополнительный pre-shared key для квантовой устойчивости
В конфиг сервера добавляем блок Peer:
[Peer]
# Иванов И.И. - ноутбук
PublicKey = СОДЕРЖИМОЕ_ivanov.pub
PresharedKey = СОДЕРЖИМОЕ_ivanov.psk
AllowedIPs = 10.88.88.10/32
И применяем без рестарта:
wg syncconf wg0 <(wg-quick strip wg0)
Конфиг клиента и QR-код
Теперь готовим файл клиента ivanov.conf:
[Interface]
PrivateKey = СОДЕРЖИМОЕ_ivanov.key
Address = 10.88.88.10/32
DNS = 10.88.88.1, 8.8.8.8
[Peer]
PublicKey = СОДЕРЖИМОЕ_server_public.key
PresharedKey = СОДЕРЖИМОЕ_ivanov.psk
Endpoint = vpn.example.ru:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Если клиент нужен только для доступа к офисной сети — в AllowedIPs ставим локальную подсеть вместо 0.0.0.0/0. Например, 192.168.10.0/24, 10.88.88.0/24. Тогда интернет идёт напрямую, а офисные ресурсы — через тоннель. Это экономит трафик и быстрее работает.
Для мобильного клиента генерируем QR:
qrencode -t ansiutf8 < ivanov.conf
# Пользователь сканирует с телефона через WireGuard app
Firewall и безопасность
WireGuard сам по себе молчалив — без валидной handshake-попытки порт не отвечает, его не видно в сканах Shodan. Но базовые правила firewall всё равно нужны. Открываем только UDP-порт WireGuard и SSH:
| Правило | Порт/протокол | Источник |
|---|---|---|
| SSH админа | 22/TCP | Только офисный IP |
| WireGuard | 51820/UDP | Любой |
| ICMP echo | ICMP | Только из VPN |
| Всё остальное | DROP | — |
ufw default deny incoming
ufw default allow outgoing
ufw allow from 203.0.113.10 to any port 22
ufw allow 51820/udp
ufw route allow in on wg0 out on eth0
ufw enable
Реальный кейс: миграция офиса с OpenVPN
В марте 2026 года клиент — юридическая компания на 28 сотрудников — обратился с жалобой: OpenVPN на pfSense постоянно отваливался у юристов, работающих из поездок. Смена 4G на Wi-Fi в кафе = переподключение на 30 секунд, потеря видеосвязи, слетевший сеанс 1С. Я предложил перевести их на WireGuard. Работы заняли два дня: сутки на сервер на Debian 12 (2 vCPU, 2 ГБ в МТС-облаке), сутки на миграцию пользователей. Скорость внутри тоннеля выросла с 45 до 310 Мбит/с. За месяц после миграции ноль заявок «отвалился VPN». Стоимость проекта — 48 000 руб., включая настройку роутинга до 1С-сервера и мониторинг. У нас на практике WireGuard окупается уже на третьем мобильном пользователе — за счёт снижения потока в саппорт.
Мониторинг и обслуживание
Штатный мониторинг — команда wg show. Показывает последний handshake и счётчики трафика на каждого клиента. Для Zabbix/Prometheus я пишу простой парсер:
# Последний handshake по каждому клиенту
wg show wg0 dump | awk 'NR>1 { print $4, $5 }'
# Алерт, если последний handshake старше 10 минут для активного юзера
Чек-лист обслуживания:
- Раз в квартал — ротация ключей клиентов, которые увольняются или меняют устройство.
- Раз в неделю — проверка логов syslog на нестандартные handshake-попытки.
- Раз в месяц — apt upgrade и рестарт тоннеля в техокно.
- Бэкап /etc/wireguard в сейф раз в неделю — потеря приватных ключей = перевыпуск всех клиентов.
- Мониторинг свободных IP в подсети — при росте компании переходим с /24 на /22.
Типичные грабли при настройке
- Забыли включить ip_forward. Тоннель поднялся, клиент подключается, но интернет через него не идёт. Проверка:
sysctl net.ipv4.ip_forwardдолжен быть 1. - Неправильный AllowedIPs на сервере. Если у двух клиентов пересекаются AllowedIPs — второй пакет маршрутизируется неправильно, тоннель «мигает».
- MTU по умолчанию. В некоторых мобильных сетях 1420 (дефолт WireGuard) фрагментирует пакеты. Если пользователь жалуется на обрывы видеозвонков — ставим
MTU = 1380. - Нет PersistentKeepalive. За NAT клиент теряет соединение через 2–3 минуты простоя. Ставим 25 секунд — проблема уходит.
- Всё через 0.0.0.0/0. Если клиенту нужен только доступ к офису — не гоняйте весь интернет через сервер, это медленно и лишний трафик.
- Не отключили SaveConfig. При SaveConfig=true любое изменение ключей в рантайме пишется обратно в файл и переформатирует его — комментарии теряются. Ставим false, редактируем руками.
Настроим корпоративный WireGuard-сервер за один день
Я лично поднимаю WireGuard на Ubuntu или Debian с готовым firewall, роутингом до офисной сети и клиентскими QR-конфигами для каждого сотрудника. Подключение через Telegram-бот для самообслуживания, мониторинг в Zabbix, автоматическая ротация ключей. От двух часов на простой сервер и до дня на офис 50+ человек с 1С и RDP.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы по WireGuard
- Чем WireGuard лучше OpenVPN?
- WireGuard работает в пространстве ядра, в десятки раз быстрее, короткий код (около 4000 строк против 600 000 у OpenVPN), современная криптография ChaCha20+Poly1305+Curve25519, мгновенное переподключение после смены сети и простой конфиг.
- Какой порт использовать для WireGuard?
- По умолчанию 51820/UDP. На практике меняем на нестандартный из диапазона 50000–60000, чтобы не светиться сканами. Работает только UDP, TCP-режима нет.
- Как подключить пользователя без копания в консоли?
- Генерируем конфиг клиента на сервере, преобразуем в QR-код утилитой qrencode и отдаём пользователю — в клиенте для Android или iOS он сканирует и получает готовое подключение.
- Надо ли делать NAT на сервере?
- Если вы хотите, чтобы клиенты ходили в интернет через VPN — да, настраиваем iptables MASQUERADE и включаем net.ipv4.ip_forward. Если нужен только доступ к внутренней сети — MASQUERADE не обязателен.
- WireGuard держит тоннель при смене Wi-Fi и мобильной сети?
- Да, это одно из ключевых преимуществ. Тоннель не привязан к IP клиента, первый же пакет с нового адреса автоматически восстанавливает соединение — пользователь ничего не замечает.