Настройка WireGuard VPN на Debian: полное руководство по установке и конфигурации

Подробное руководство по установке и настройке WireGuard VPN на Debian 10-12: генерация ключей, конфигурация сервера и клиента, NAT, DNS, безопасность и устранение неполадок.

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

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

По производительности WireGuard стабильно обходит OpenVPN и IPsec в тестах пропускной способности. Туннель работает как обычный сетевой интерфейс (wg0, wg1), а конфигурация занимает менее 15 строк. WireGuard поддерживает все основные платформы: Linux, BSD, macOS, Windows, Android, iOS и OpenWRT. Он идеально подходит для мобильных устройств, так как позволяет переключаться между Wi-Fi и мобильной сетью без разрыва соединения. Протокол был включен в ядро Linux начиная с версии 5.6, поэтому на современных системах не требуется установка дополнительных модулей.

Подготовка сервера Debian к установке WireGuard

Перед установкой WireGuard необходимо подготовить сервер. Убедитесь, что у вас есть VPS или выделенный сервер с Debian 10, 11 или 12, доступом root или пользователем с правами sudo, а также публичным IP-адресом. Важно, чтобы порт UDP 51820 был открыт в файрволе хостинг-провайдера или в облачной группе безопасности.

Для Debian 11 и 12 WireGuard доступен в стандартных репозиториях. Для Debian 10 потребуется добавить репозиторий buster-backports. Обновите список пакетов и установите необходимые компоненты:

sudo apt update
sudo apt install wireguard wireguard-tools linux-headers-$(uname -r)

На Debian 10 сначала добавьте репозиторий:

echo "deb http://deb.debian.org/debian buster-backports main" | sudo tee /etc/apt/sources.list.d/buster-backports.list
sudo apt update
sudo apt -t buster-backports install wireguard wireguard-tools wireguard-dkms linux-headers-$(uname -r)

Пакет wireguard-tools предоставляет утилиты wg и wg-quick для управления туннелем. Убедитесь, что модуль ядра загружен:

sudo modprobe wireguard && echo "WireGuard module loaded"

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

WireGuard использует асимметричные ключи, похожие на SSH. Каждый пир (сервер или клиент) имеет закрытый и открытый ключ. Закрытый ключ должен храниться в секрете, а открытый можно свободно распространять.

Сгенерируйте ключи сервера:

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

Установите права только для чтения root:

sudo chmod 600 /etc/wireguard/server_private.key

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

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

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

Конфигурация сервера WireGuard

Создайте файл конфигурации сервера /etc/wireguard/wg0.conf. Используйте редактор nano или vim:

sudo nano /etc/wireguard/wg0.conf

Минимальная конфигурация для сервера:

[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.10.0.2/32

Здесь Address — это VPN-IP сервера в выбранной подсети (например, 10.10.0.0/24). ListenPort — UDP-порт, по умолчанию 51820. PrivateKey — закрытый ключ сервера. В блоке [Peer] указывается открытый ключ клиента и его разрешенный IP-адрес. AllowedIPs для клиента обычно задается как /32, чтобы ограничить его одним адресом.

Установите права 600 на файл конфигурации:

sudo chmod 600 /etc/wireguard/wg0.conf

Для добавления нескольких клиентов просто добавьте дополнительные блоки [Peer] с уникальными IP-адресами.

Включение IP-пересылки и настройка NAT

Чтобы VPN-сервер мог маршрутизировать трафик от клиентов в интернет, необходимо включить IP-пересылку. Отредактируйте файл /etc/sysctl.conf или создайте отдельный файл в /etc/sysctl.d/:

echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf

Проверьте, что параметры применились:

sysctl net.ipv4.ip_forward

Далее настройте NAT (маскарадинг), чтобы пакеты из туннеля выходили в интернет с IP-адресом сервера. Это можно сделать через правила iptables в конфигурации WireGuard. Добавьте в раздел [Interface] следующие строки, заменив eth0 на имя вашего основного сетевого интерфейса (узнать его можно командой ip addr):

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

Эти команды выполняются при поднятии и опускании туннеля. Если вы используете UFW, добавьте аналогичные правила через ufw route allow, как показано в следующем разделе.

Настройка брандмауэра UFW для WireGuard

UFW (Uncomplicated Firewall) — удобный интерфейс для iptables, часто используемый в Debian. Установите и включите его, если еще не сделали этого:

sudo apt install ufw -y
sudo ufw allow OpenSSH
sudo ufw enable

Откройте порт WireGuard:

sudo ufw allow 51820/udp

Для корректной работы NAT и пересылки трафика необходимо изменить политику пересылки по умолчанию. Отредактируйте файл /etc/default/ufw и установите:

DEFAULT_FORWARD_POLICY="ACCEPT"

Затем перезагрузите UFW:

sudo ufw reload

Если вы используете правила PostUp/PostDown в wg0.conf, они будут работать вместе с UFW. Альтернативный подход — добавить правила в файл /etc/ufw/before.rules, как описано в некоторых руководствах, но это менее удобно. Убедитесь, что правила NAT не конфликтуют с политиками UFW.

Настройка DNS-сервера на VPN-сервере

Если вы хотите, чтобы клиенты использовали VPN-сервер в качестве DNS-резолвера, необходимо установить и настроить DNS-сервер, например BIND9. Это предотвращает утечки DNS и обеспечивает конфиденциальность запросов.

Установите BIND9:

sudo apt install bind9 -y

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

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

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

OPTIONS="-u bind -4"

Перезапустите службу:

sudo systemctl restart bind9

Откройте порт 53 в UFW для VPN-клиентов:

sudo ufw insert 1 allow in from 10.10.0.0/24

В конфигурации клиента укажите DNS = 10.10.0.1 (или другой IP сервера). Если вы предпочитаете использовать публичные DNS-резолверы, такие как Cloudflare (1.1.1.1) или Quad9 (9.9.9.9), можно указать их напрямую, но тогда запросы будут видны вашему интернет-провайдеру.

Запуск и управление службой WireGuard

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

sudo wg-quick up wg0

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

sudo wg show

Вы должны увидеть интерфейс wg0, закрытый ключ (скрыт), порт прослушивания и список пиров. Для автоматического запуска при загрузке используйте systemd:

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

Остановить туннель можно командой:

sudo wg-quick down wg0

Если вы изменили конфигурацию, перезапустите службу:

sudo systemctl restart wg-quick@wg0

Для добавления пиров без перезапуска можно использовать команду wg set, но изменения не сохранятся в файле. Чтобы сохранить, выполните wg-quick save wg0.

Настройка клиента WireGuard на разных платформах

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

[Interface]
Address = 10.10.0.2/32
PrivateKey = CLIENT_PRIVATE_KEY
DNS = 10.10.0.1, 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

Address — VPN-IP клиента, /32 указывает на одиночный хост. DNS — серверы, которые будут использоваться при активном туннеле. AllowedIPs = 0.0.0.0/0 означает, что весь трафик пойдет через VPN (полный туннель). Для раздельного туннелирования укажите только нужные подсети, например 10.10.0.0/24. Endpoint — публичный IP и порт сервера. PersistentKeepalive необходим для поддержания соединения за NAT, отправляет keepalive-пакеты каждые 25 секунд.

На Windows и macOS установите официальное приложение WireGuard с сайта wireguard.com, импортируйте .conf файл или вставьте конфигурацию вручную. На Android и iOS используйте приложения из магазинов, импорт через QR-код — удобный способ. Сгенерируйте QR-код на сервере:

sudo apt install qrencode
qrencode -t ansiutf8 < client1.conf

Затем отсканируйте его камерой телефона.

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

После запуска туннеля на клиенте проверьте связь с сервером по VPN-IP:

ping -c 4 10.10.0.1

Проверьте, что ваш публичный IP изменился на IP сервера:

curl -s https://ifconfig.me

Если вывод показывает IP сервера, значит полный туннель работает. На сервере выполните sudo wg show, чтобы увидеть время последнего рукопожатия и счетчики трафика. Если поле latest handshake отсутствует, клиент не подключился.

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

  • Порт UDP 51820 закрыт файрволом — проверьте правила UFW и настройки хостинга.
  • Неправильные ключи — убедитесь, что открытый ключ пира соответствует закрытому ключу другой стороны.
  • IP-пересылка не включена — проверьте sysctl net.ipv4.ip_forward.
  • Конфликт подсетей — если домашняя сеть использует 10.10.0.0/24, выберите другой диапазон, например 10.20.0.0/24.
  • Проблемы с DNS — проверьте, что BIND запущен и разрешает рекурсивные запросы.

Используйте tcpdump на сервере для диагностики:

sudo tcpdump -i wg0

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

Какие версии Debian поддерживают WireGuard?

WireGuard доступен в стандартных репозиториях Debian 11 (Bullseye) и Debian 12 (Bookworm). Для Debian 10 (Buster) необходимо добавить репозиторий buster-backports и установить пакет wireguard-dkms. Начиная с ядра Linux 5.6, модуль WireGuard встроен в ядро, поэтому на Debian 11 и 12 дополнительная установка модулей не требуется.

В чем разница между полным и раздельным туннелированием в WireGuard?

Полный туннель (AllowedIPs = 0.0.0.0/0) направляет весь интернет-трафик клиента через VPN-сервер, что обеспечивает максимальную конфиденциальность, но увеличивает задержку и нагрузку на сервер. Раздельный туннель (например, AllowedIPs = 10.10.0.0/24) направляет через VPN только трафик к указанным подсетям, оставляя остальной трафик напрямую. Раздельный туннель полезен для доступа к корпоративным ресурсам без потери скорости для остального интернета.

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

Для каждого клиента сгенерируйте отдельную пару ключей. На сервере в файле /etc/wireguard/wg0.conf добавьте новый блок [Peer] с открытым ключом клиента и уникальным IP-адресом из вашей VPN-подсети, например AllowedIPs = 10.10.0.3/32. После добавления перезапустите службу wg-quick@wg0 или используйте команду wg set для динамического добавления без перезапуска. Убедитесь, что IP-адреса не конфликтуют.

Как защитить WireGuard от утечек DNS?

Утечки DNS возникают, когда DNS-запросы отправляются напрямую через обычный интерфейс, а не через VPN. Чтобы избежать этого, укажите в конфигурации клиента DNS-сервер, доступный через туннель, например IP-адрес VPN-сервера (10.10.0.1) или публичный резолвер (1.1.1.1). Убедитесь, что на клиенте настроен resolvconf или systemd-resolved для корректного применения DNS. Также можно использовать правила файрвола, блокирующие исходящие DNS-запросы не через туннель.

Можно ли использовать WireGuard для сайт-ту-сайт соединений?

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

Какие порты нужно открыть для работы WireGuard?

WireGuard использует один UDP-порт, по умолчанию 51820. Этот порт должен быть открыт на сервере в брандмауэре (UFW, iptables, firewalld) и в панели управления хостинг-провайдера или облачной платформы. Если вы используете нестандартный порт, укажите его в ListenPort на сервере и в Endpoint на клиенте. Также убедитесь, что порт 53 (DNS) открыт для VPN-подсети, если используете собственный DNS-сервер.

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

Используйте systemd-службу wg-quick@wg0. Выполните команды:

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

Это создаст симлинк в /etc/systemd/system/multi-user.target.wants/ и запустит туннель при каждой загрузке. Убедитесь, что файл конфигурации /etc/wireguard/wg0.conf существует и имеет корректные права доступа (600).