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

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

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

WireGuard — это современный VPN-протокол, работающий на уровне ядра Linux. Его кодовая база составляет всего около 4000 строк, что в десятки раз меньше, чем у OpenVPN или IPsec. Такой минимализм упрощает аудит безопасности и снижает вероятность ошибок. Протокол использует только современные криптографические примитивы: Curve25519 для обмена ключами, ChaCha20 для шифрования, Poly1305 для аутентификации и BLAKE2s для хеширования. Отсутствие выбора шифров исключает атаки понижения версии.

WireGuard работает как сетевой интерфейс уровня 3 (например, wg0) и не требует сложных сертификатов или фаз согласования, как IPsec. Конфигурация обычно занимает менее 15 строк. Благодаря работе в ядре, WireGuard обеспечивает более высокую пропускную способность и низкую задержку по сравнению с пользовательскими реализациями OpenVPN. Это делает его идеальным выбором для маршрутизации всего трафика (full tunnel) или организации защищённых соединений между сетями.

Предварительные требования для развёртывания

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

  • Сервер с Ubuntu 24.04, доступный по SSH с правами sudo.
  • Публичный IPv4-адрес на сервере (или корректный NAT, если сервер за файрволом).
  • Открытый UDP-порт 51820 на всех уровнях файрвола (включая облачные security groups).
  • Клиентское устройство: Linux, macOS, Windows, Android или iOS.
  • Выбранная VPN-подсеть, не пересекающаяся с существующими сетями (например, 10.90.90.0/24).
  • DNS-резолвер для клиентов (например, 1.1.1.1 или 8.8.8.8).

Важно проверить, что имя публичного интерфейса (eth0, ens3, enp1s0) определено корректно, так как оно используется в правилах NAT. Для этого выполните ip -4 route show default и найдите интерфейс в выводе.

Установка WireGuard на Ubuntu 24.04

WireGuard доступен в стандартных репозиториях Ubuntu 24.04. Установите пакеты wireguard и wireguard-tools (последний входит в состав первого, но для надёжности можно указать явно):

sudo apt update
sudo apt install -y wireguard wireguard-tools

Проверьте установку:

wg --version
wg-quick --help | head

Ядро Ubuntu 24.04 (версии 5.6 и новее) уже включает модуль WireGuard, поэтому дополнительная установка DKMS не требуется. Для диагностики можно загрузить модуль вручную:

sudo modprobe wireguard
lsmod | grep '^wireguard'

Если модуль не загружается, убедитесь, что ядро обновлено.

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

WireGuard использует асимметричные ключи, аналогично SSH. Сгенерируйте ключи сервера:

sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/wg0.key'
sudo sh -c 'wg pubkey < /etc/wireguard/wg0.key > /etc/wireguard/wg0.pub'

Установите правильные права: приватный ключ должен быть доступен только root (chmod 600), публичный — можно оставить 644. Никогда не передавайте приватный ключ по сети и не храните его в репозиториях.

Для клиентов рекомендуется генерировать ключи на самом клиентском устройстве, чтобы приватный ключ не покидал его. Однако для централизованного управления можно сгенерировать на сервере. Пример генерации ключей клиента:

wg genkey | tee client1_private.key | wg pubkey > client1_public.key

Каждому клиенту нужен уникальный ключ и уникальный IP-адрес в VPN-подсети.

Настройка сервера WireGuard

Создайте файл конфигурации /etc/wireguard/wg0.conf. Пример для full-tunnel (весь трафик клиента через VPN):

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

PostUp = iptables -I FORWARD 1 -i %i -o eth0 -s 10.90.90.0/24 -j ACCEPT
PostUp = iptables -I FORWARD 1 -i eth0 -o %i -d 10.90.90.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -s 10.90.90.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -o eth0 -s 10.90.90.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i eth0 -o %i -d 10.90.90.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.90.90.0/24 -o eth0 -j MASQUERADE

Замените eth0 на фактическое имя публичного интерфейса. Директива PostUp добавляет правила iptables при запуске интерфейса, PostDown — удаляет их при остановке. Правила ограничены подсетью 10.90.90.0/24, чтобы не маскировать другой трафик сервера.

Установите права 600 на файл конфигурации. Если вы используете UFW, добавьте правило ufw route allow in on wg0 out on eth0 в PostUp и соответствующее удаление в PreDown (как показано в одном из источников).

Включение IP-форвардинга и настройка NAT

Для маршрутизации трафика между VPN-клиентами и интернетом необходимо включить IP-форвардинг. Создайте файл /etc/sysctl.d/70-wireguard-routing.conf:

net.ipv4.ip_forward = 1

Примените настройку:

sudo sysctl -p /etc/sysctl.d/70-wireguard-routing.conf

Проверьте значение: sysctl net.ipv4.ip_forward должно вернуть 1. Без этого пакеты с интерфейса wg0 будут отбрасываться.

NAT (MASQUERADE) в PostUp позволяет клиентам выходить в интернет через публичный IP сервера. Важно, чтобы правило NAT было ограничено VPN-подсетью, иначе оно может затронуть другие сервисы.

Настройка файрвола (UFW и другие)

Если на сервере активен UFW, необходимо разрешить UDP-порт 51820:

sudo ufw allow 51820/udp comment 'WireGuard'

Также нужно разрешить форвардинг. Отредактируйте /etc/default/ufw и измените DEFAULT_FORWARD_POLICY на ACCEPT. После этого перезагрузите UFW:

sudo ufw reload

Важно: не включайте UFW вслепую, если он неактивен, особенно при удалённом SSH-доступе. Убедитесь, что SSH-порт разрешён, и держите запасную сессию или консоль.

Для RHEL-подобных систем (Rocky Linux, AlmaLinux) используйте firewalld:

sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --reload

Настройка клиентов и подключение

Создайте конфигурацию клиента, например /etc/wireguard/wg0.conf на Linux-клиенте:

[Interface]
Address = 10.90.90.2/32
PrivateKey = <приватный_ключ_клиента>
DNS = 1.1.1.1, 9.9.9.9

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

AllowedIPs = 0.0.0.0/0 означает full-tunnel — весь трафик идёт через VPN. Для split-tunnel укажите только нужные подсети, например 10.90.90.0/24. PersistentKeepalive необходим для клиентов за NAT, чтобы поддерживать соединение.

Добавьте клиента на сервер в /etc/wireguard/wg0.conf:

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

Запустите интерфейс на сервере и клиенте:

sudo wg-quick up wg0

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

sudo systemctl enable wg-quick@wg0

На мобильных устройствах можно импортировать конфигурацию через QR-код, сгенерированный с помощью qrencode.

Проверка работы и устранение неполадок

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

sudo wg show

Вы должны увидеть пира с недавним handshake и ненулевыми счётчиками трафика. Если handshake отсутствует, проверьте, что UDP-порт 51820 доступен и клиент правильно настроен.

С клиента проверьте публичный IP:

curl -s https://ifconfig.me

Он должен совпадать с IP сервера. Также проверьте DNS: dig @1.1.1.1 example.com.

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

  • Нет handshake: проверьте файрвол, Endpoint, ключи.
  • Интернет не работает: проверьте IP-форвардинг и правила NAT.
  • DNS не резолвится: убедитесь, что DNS указан в конфигурации клиента и не перехватывается локальным резолвером.
  • Медленная загрузка сайтов: возможно, MTU проблемы — попробуйте уменьшить MTU на интерфейсе.
  • IPv6 утечка: если клиент имеет IPv6, настройте отдельный туннель или отключите IPv6.

Дополнительные сценарии: site-to-site и управление пирами

WireGuard поддерживает не только клиент-сервер, но и site-to-site соединения. Для этого обе стороны настраиваются как пиры, и каждая рекламирует свою локальную подсеть через AllowedIPs. Например, офисная сеть 192.168.1.0/24 может быть связана с облачной VPC 172.16.0.0/24.

Для добавления или удаления клиентов без перезапуска интерфейса используйте команду wg set:

sudo wg set wg0 peer <публичный_ключ_клиента> allowed-ips 10.90.90.3/32

Чтобы сохранить изменения в конфигурационном файле, выполните sudo wg-quick save wg0 (если SaveConfig = true).

При отзыве клиента удалите его пир из конфигурации и выполните wg set wg0 peer <ключ> remove.

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

Какой порт использует WireGuard по умолчанию?

По умолчанию WireGuard слушает UDP-порт 51820. Этот порт должен быть открыт на сервере и в файрволе. Вы можете изменить порт, указав другое значение в ListenPort в конфигурации сервера, но тогда его нужно будет изменить и в конфигурациях клиентов (в Endpoint).

Что такое AllowedIPs и как он влияет на маршрутизацию?

AllowedIPs определяет, какие IP-адреса и подсети разрешено отправлять через туннель. Для full-tunnel (весь трафик через VPN) используется 0.0.0.0/0, ::/0. Для split-tunnel указываются только нужные подсети, например 10.90.90.0/24. На сервере AllowedIPs для пира задаёт его VPN-адрес, что также используется для крипто-маршрутизации.

Нужно ли включать IP-форвардинг на сервере?

Да, обязательно. Без net.ipv4.ip_forward = 1 сервер не сможет пересылать пакеты между интерфейсом wg0 и публичным интерфейсом. Это настраивается в /etc/sysctl.d/ и применяется командой sysctl -p.

Как добавить нового клиента без перезапуска сервера?

Используйте команду sudo wg set wg0 peer <публичный_ключ_клиента> allowed-ips /32. Это добавит пира в текущую конфигурацию интерфейса. Чтобы изменения сохранились после перезагрузки, добавьте пира в файл /etc/wireguard/wg0.conf или выполните sudo wg-quick save wg0 (если SaveConfig = true).

Почему клиент не может получить доступ к интернету через VPN?

Проверьте несколько моментов: 1) IP-форвардинг включён (sysctl net.ipv4.ip_forward = 1); 2) правило MASQUERADE в PostUp присутствует и использует правильный интерфейс; 3) UFW или другой файрвол разрешает форвардинг (в UFW измените DEFAULT_FORWARD_POLICY на ACCEPT); 4) DNS настроен в конфигурации клиента. Также убедитесь, что AllowedIPs на клиенте включает 0.0.0.0/0.

Как защитить приватный ключ WireGuard?

Приватный ключ должен храниться в файле с правами 600 (только root). Используйте chmod 600 /etc/wireguard/wg0.key. Никогда не передавайте приватный ключ по незащищённым каналам, не вставляйте его в чаты и не коммитьте в Git. Для клиентов рекомендуется генерировать ключи на самом устройстве, чтобы приватный ключ не покидал его.

Можно ли использовать WireGuard для site-to-site VPN?

Да, WireGuard отлично подходит для соединения двух сетей. В этом случае обе стороны настраиваются как пиры, и каждая указывает локальную подсеть в AllowedIPs. Например, офисный шлюз с сетью 192.168.1.0/24 и облачный сервер с VPC 172.16.0.0/24. Не забудьте включить IP-форвардинг и настроить NAT, если требуется доступ в интернет.