WireGuard VPN на сервере Ubuntu: полное руководство по установке и настройке

Пошаговая настройка WireGuard VPN на Ubuntu: установка, генерация ключей, конфигурация сервера и клиента, маршрутизация, firewall, DNS, автозагрузка и подключение с разных устройств.

Что такое WireGuard и почему он лучше OpenVPN

WireGuard — это современный VPN-протокол с открытым исходным кодом, который работает непосредственно в ядре Linux. В отличие от OpenVPN и IPsec, WireGuard спроектирован как минималистичное и высокопроизводительное решение: его кодовая база составляет всего несколько тысяч строк, что упрощает аудит безопасности и снижает вероятность ошибок.

Основные преимущества WireGuard:

  • Скорость: шифрование выполняется на уровне ядра, что обеспечивает более высокую пропускную способность по сравнению с пользовательскими реализациями OpenVPN.
  • Простота настройки: конфигурация состоит из одного файла с понятными параметрами, без сложных сертификатов и TLS-настроек.
  • Кроссплатформенность: официальные клиенты доступны для Linux, Windows, macOS, Android, iOS, а также для маршрутизаторов OpenWRT и BSD-систем.
  • Устойчивость к смене сети: мобильные устройства могут переключаться между Wi-Fi и мобильной сетью без разрыва туннеля.
  • Современная криптография: используются протоколы ChaCha20, Poly1305, Curve25519 и BLAKE2s, обеспечивающие высокий уровень безопасности.

WireGuard позиционируется как замена OpenVPN и IPsec в большинстве сценариев, особенно когда требуется быстрое развертывание и низкие накладные расходы. Однако стоит учитывать, что WireGuard использует статические IP-адреса для клиентов внутри туннеля, что может быть неудобно для некоторых сценариев, но полезно для контроля доступа.

Подготовка сервера и требования

Перед началом настройки убедитесь, что у вас есть:

  • Сервер с Ubuntu 18.04, 20.04, 22.04 или новее (подойдёт VPS или домашний сервер с публичным IP-адресом).
  • Права root или пользователь с привилегиями sudo.
  • Открытый UDP-порт (по умолчанию 51820) на сервере и в файрволе хостинг-провайдера.
  • Обновлённая система: выполните sudo apt update && sudo apt upgrade.

Для Ubuntu 18.04 потребуется установить HWE-ядро, так как стандартное ядро 4.15 не включает модуль WireGuard. Для Ubuntu 20.04 и 22.04 модуль уже встроен, поэтому достаточно установить пользовательские утилиты.

Если вы планируете использовать сервер в качестве шлюза для всего трафика клиентов, убедитесь, что у сервера есть доступ к интернету и он не блокируется файрволом провайдера. Также рекомендуется выбрать VPS с хорошей пропускной способностью, так как весь трафик клиентов будет проходить через сервер.

Установка WireGuard на сервер и клиент

Установка WireGuard на Ubuntu выполняется одной командой:

sudo apt update
sudo apt install wireguard wireguard-tools

На Ubuntu 18.04 сначала установите HWE-ядро:

sudo apt install linux-generic-hwe-18.04-edge
sudo shutdown -r now
sudo apt install wireguard wireguard-tools wireguard-dkms

На клиентской машине (если это тоже Ubuntu) установите те же пакеты, а также openresolv для управления DNS:

sudo apt install openresolv

После установки проверьте, что модуль ядра загружен:

sudo modprobe wireguard

Если модуль не загружается, возможно, потребуется перезагрузка или установка linux-modules-extra-$(uname -r).

Генерация ключей сервера и клиента

WireGuard использует асимметричное шифрование на основе кривой Curve25519. Для каждого участника (сервера и каждого клиента) необходимо сгенерировать пару ключей: приватный и публичный.

На сервере выполните:

wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

Эта команда создаст два файла: приватный ключ сервера и соответствующий публичный ключ.

На клиенте (или на сервере, если вы генерируете ключи для клиента) выполните аналогично:

wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key

Также рекомендуется сгенерировать Pre-Shared Key (PSK) для дополнительного уровня шифрования, защищающего от будущих квантовых атак:

wg genpsk

PSK добавляется в конфигурацию обеих сторон и обеспечивает дополнительную симметричную защиту.

Важно: приватные ключи должны храниться в защищённых файлах с правами доступа только для root. Установите права:

sudo chmod 600 /etc/wireguard/*.key

Публичные ключи можно свободно распространять.

Выбор подсети и адресации

Для внутренней VPN-сети необходимо выбрать диапазон IP-адресов, который не конфликтует с локальными сетями клиентов. Рекомендуется использовать один из зарезервированных блоков:

  • 10.0.0.0/8 (например, 10.10.10.0/24)
  • 172.16.0.0/12 (например, 172.16.1.0/24)
  • 192.168.0.0/16 (например, 192.168.10.0/24)

В примерах часто используется 10.10.10.0/24 или 10.8.0.0/24. Серверу назначается первый адрес (например, 10.10.10.1/24), клиентам — последующие (10.10.10.2/24, 10.10.10.3/24 и т.д.).

Если планируется поддержка IPv6, можно сгенерировать уникальный локальный префикс (ULA) в диапазоне fd00::/8. Для этого используется алгоритм, описанный в RFC 4193: объедините текущую метку времени и machine-id сервера, хэшируйте через SHA-1 и возьмите последние 5 байт. Пример:

date +%s%N
cat /var/lib/dbus/machine-id
printf "" | sha1sum

Затем сформируйте префикс вида fdXX:XXXX:XXXX::/64 и назначьте серверу адрес ...::1/64, клиентам — ...::2/64 и т.д.

Важно: маска подсети для клиента в конфигурации WireGuard должна быть /32 для IPv4 и /128 для IPv6, чтобы указать конкретный адрес.

Создание конфигурации сервера wg0.conf

Файл конфигурации сервера создаётся в /etc/wireguard/wg0.conf. Пример базовой конфигурации:

[Interface]
PrivateKey = <приватный_ключ_сервера>
Address = 10.10.10.1/24
ListenPort = 51820
SaveConfig = true

[Peer]
PublicKey = <публичный_ключ_клиента>
PresharedKey =
AllowedIPs = 10.10.10.2/32

Параметры:

  • PrivateKey — приватный ключ сервера (из файла server_private.key).
  • Address — IP-адрес сервера в VPN-сети и маска.
  • ListenPort — UDP-порт, на котором сервер ожидает подключения (по умолчанию 51820).
  • SaveConfig — при остановке сервера сохранять изменения в конфигурацию (удобно для динамических изменений).
  • [Peer] — блок, описывающий клиента. Для каждого клиента добавляется отдельный блок.
  • PublicKey — публичный ключ клиента.
  • PresharedKey — общий секретный ключ (опционально, но рекомендуется).
  • AllowedIPs — IP-адреса, которые клиент может использовать в туннеле. Для одного клиента указывается его адрес с маской /32.

После создания файла установите права доступа:

sudo chmod 600 /etc/wireguard/wg0.conf

Если вы используете UFW или iptables, можно добавить правила маршрутизации прямо в конфигурацию через директивы PostUp и PreDown (см. следующий раздел).

Настройка маршрутизации и firewall

Чтобы сервер мог пересылать трафик между VPN-клиентами и интернетом, необходимо включить IP-переадресацию в ядре. Отредактируйте файл /etc/sysctl.conf (или создайте /etc/sysctl.d/10-forward.conf для Debian 13 и новее):

sudo nano /etc/sysctl.conf

Раскомментируйте или добавьте строки:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Примените изменения:

sudo sysctl -p

Далее настройте NAT (маскировку), чтобы исходящий трафик клиентов имел IP-адрес сервера. Это можно сделать двумя способами:

Способ 1: через UFW Отредактируйте /etc/ufw/before.rules, добавив в начало файла:

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
COMMIT

Замените eth0 на имя вашего публичного интерфейса (узнать можно командой ip route list default). Также добавьте в цепочку ufw-before-forward правила для разрешения пересылки:

-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT

Затем разрешите порт WireGuard и перезапустите UFW:

sudo ufw allow 51820/udp
sudo ufw disable && sudo ufw enable

Способ 2: через PostUp/PreDown в wg0.conf Добавьте в секцию [Interface]:

PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Этот способ автоматически добавляет и удаляет правила при запуске/остановке туннеля.

Не забудьте открыть порт 51820/udp в файрволе, если он активен.

Настройка DNS для клиентов

Для корректной работы DNS через VPN можно использовать публичные DNS-серверы (например, 1.1.1.1, 8.8.8.8) или запустить собственный DNS-резолвер на сервере. Второй вариант предпочтителен, если вы хотите избежать утечек DNS и контролировать запросы.

Вариант с публичными DNS В конфигурации клиента укажите:

DNS = 1.1.1.1, 1.0.0.1

Это самый простой способ, но трафик DNS будет идти напрямую к выбранному провайдеру, что может быть нежелательно.

Вариант с собственным DNS-сервером (BIND9) Установите BIND9 на сервере:

sudo apt install bind9

Отредактируйте /etc/bind/named.conf.options, добавив разрешение рекурсии для VPN-подсети:

allow-recursion { 127.0.0.1; 10.10.10.0/24; };

Также в /etc/default/named укажите опцию -4, чтобы BIND использовал только IPv4:

OPTIONS="-u bind -4"

Перезапустите BIND:

sudo systemctl restart bind9

В конфигурации клиента укажите DNS-сервером IP-адрес VPN-сервера:

DNS = 10.10.10.1

Это гарантирует, что все DNS-запросы клиентов будут проходить через ваш сервер и не будут видны посторонним.

Создание конфигурации клиента и подключение

Конфигурация клиента аналогична серверной, но с другими ключами и параметрами. Пример файла wg0-client.conf:

[Interface]
PrivateKey = <приватный_ключ_клиента>
Address = 10.10.10.2/24
DNS = 10.10.10.1

[Peer]
PublicKey = <публичный_ключ_сервера>
PresharedKey =
Endpoint = <публичный_IP_сервера>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

Параметры:

  • PrivateKey — приватный ключ клиента.
  • Address — IP-адрес клиента в VPN-сети.
  • DNS — DNS-сервер (можно указать несколько через запятую).
  • PublicKey — публичный ключ сервера.
  • Endpoint — публичный IP-адрес и порт сервера.
  • AllowedIPs — какие подсети направлять через VPN. 0.0.0.0/0 означает весь IPv4-трафик, ::/0 — весь IPv6.
  • PersistentKeepalive — интервал отправки keepalive-пакетов (25 секунд), необходим для поддержания NAT-соединений и работы за файрволами.

Подключение на Linux Скопируйте конфигурацию на клиентскую машину в /etc/wireguard/wg0.conf (или используйте имя интерфейса, например wg-client0). Затем запустите:

sudo wg-quick up wg0

Для автозапуска при загрузке:

sudo systemctl enable wg-quick@wg0

Подключение на Windows/macOS/Android/iOS Используйте официальные приложения WireGuard. Импортируйте файл конфигурации или отсканируйте QR-код. Для генерации QR-кода на сервере установите qrencode:

sudo apt install qrencode
qrencode -t ansiutf8 < wg0-client.conf

Проверка подключения После запуска проверьте статус интерфейса:

sudo wg show

Вы должны увидеть handshake и переданные байты. Также можно проверить IP-адрес:

curl ifconfig.me

Если всё настроено правильно, вы увидите IP-адрес вашего VPN-сервера.

Автозагрузка, управление и устранение неполадок

Для автоматического запуска WireGuard при старте системы используйте systemd:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

Проверить статус:

sudo systemctl status wg-quick@wg0

Остановить туннель:

sudo wg-quick down wg0

Типичные проблемы и их решение:

  • Нет соединения: проверьте, что порт 51820/udp открыт в файрволе сервера и у хостинг-провайдера. Используйте sudo ufw status и sudo iptables -L -n.
  • Трафик не идёт через VPN: убедитесь, что включена IP-переадресация (sysctl net.ipv4.ip_forward должен быть 1) и настроен MASQUERADE.
  • DNS не работает: проверьте, что клиент использует правильный DNS-сервер, и что BIND (если используется) разрешает рекурсию для VPN-подсети.
  • Медленное соединение: проверьте MTU. WireGuard по умолчанию использует MTU 1420, но при проблемах можно уменьшить до 1280.
  • Клиент не может подключиться после смены сети: включите PersistentKeepalive = 25 в конфигурации клиента.

Добавление новых клиентов Для каждого нового устройства сгенерируйте свою пару ключей и PSK, добавьте блок [Peer] в конфигурацию сервера с соответствующим AllowedIPs, затем создайте конфигурацию клиента. После изменения конфигурации сервера перезапустите туннель:

sudo wg-quick down wg0 && sudo wg-quick up wg0

Безопасность

  • Храните приватные ключи в защищённых файлах с правами 600.
  • Используйте PSK для защиты от квантовых атак.
  • Регулярно обновляйте систему и WireGuard.
  • Ограничьте доступ к серверу по SSH, используя ключи и fail2ban.

Вопросы и ответы

Чем WireGuard отличается от OpenVPN?

WireGuard работает в ядре Linux, что обеспечивает более высокую скорость и низкую задержку. Он использует современную криптографию (ChaCha20, Curve25519) и имеет минималистичный код, что упрощает аудит. Настройка WireGuard проще: не нужны сертификаты и TLS, достаточно обмена ключами. Однако WireGuard использует статические IP-адреса для клиентов, что может быть неудобно для некоторых сценариев.

Можно ли использовать WireGuard на Windows и мобильных устройствах?

Да, WireGuard имеет официальные клиенты для Windows, macOS, Android и iOS. Для подключения достаточно импортировать файл конфигурации или отсканировать QR-код. Настройка на этих платформах аналогична: указываются приватный ключ, адрес, DNS и параметры пира.

Как добавить нового клиента к существующему серверу WireGuard?

Сгенерируйте для нового клиента пару ключей и PSK. Добавьте блок [Peer] в конфигурацию сервера с публичным ключом клиента и его IP-адресом в AllowedIPs. Затем создайте конфигурацию клиента с приватным ключом, адресом, DNS, публичным ключом сервера и Endpoint. Перезапустите туннель на сервере и импортируйте конфигурацию на устройство.

Что такое Pre-Shared Key и зачем он нужен?

Pre-Shared Key (PSK) — это дополнительный секретный ключ, который добавляется к основному шифрованию. Он обеспечивает защиту от будущих квантовых атак и повышает устойчивость к компрометации ключей. PSK должен быть одинаковым на обеих сторонах и храниться в секрете. Рекомендуется генерировать уникальный PSK для каждой пары сервер-клиент.

Как настроить WireGuard для доступа только к определённым подсетям?

В конфигурации клиента укажите в AllowedIPs конкретные подсети, например 10.0.0.0/8, 192.168.1.0/24. Тогда через VPN будет идти только трафик к этим сетям, а остальной — напрямую. На сервере в блоке [Peer] укажите IP-адрес клиента с маской /32, чтобы ограничить его адрес в туннеле.

Почему не работает DNS после подключения к WireGuard?

Проверьте, что в конфигурации клиента указан корректный DNS-сервер. Если используется собственный DNS на сервере, убедитесь, что BIND разрешает рекурсию для VPN-подсети и что сервер доступен по IP-адресу из туннеля. Также проверьте, что файрвол не блокирует DNS-запросы (порт 53).

Как обеспечить автозапуск WireGuard при загрузке системы?

Используйте systemd: sudo systemctl enable wg-quick@wg0. Это создаст службу, которая запускает туннель при старте. Убедитесь, что файл конфигурации называется /etc/wireguard/wg0.conf (имя интерфейса wg0). Для остановки автозапуска выполните sudo systemctl disable wg-quick@wg0.