LinuxRuLinux без лишней теории
Домашняя сеть

WireGuard в Linux: свой VPN до домашней сети за полчаса

Редакция LinuxRu7 мин чтенияИнструкции

WireGuard в Linux поднимает личный VPN до домашней сети за полчаса: на домашнем сервере ставится wireguard-tools, генерируются ключи, в /etc/wireguard/wg0.conf описываются клиенты, а на роутере пробрасывается UDP-порт 51820. Нужен белый IP-адрес, иначе понадобится промежуточный VPS.

WireGuard в Linux: свой VPN до домашней сети за полчаса
Фото: Santhan 31, Public domain, Wikimedia Commons
Содержание
  1. Схема сети
  2. Установка и ключи
  3. Конфиг сервера
  4. Клиент Linux
  5. Телефон и Windows
  6. Диагностика
  7. Нет белого IP
  8. Обслуживание
  9. Частые вопросы

Схема: кто сервер, кто клиент и что нужно от провайдера

Задача типичная: вы в поездке или на работе и хотите открыть домашний NAS, камеры, Home Assistant или зайти по SSH на домашний компьютер, не выставляя всё это в интернет. WireGuard решает её одним UDP-портом и парой текстовых файлов.

Схема в этой статье такая:

  • сервер - любая Linux-машина в домашней сети, которая работает круглосуточно: мини-ПК, старый ноутбук, Raspberry Pi (сборку такого сервера мы описали в статье про Raspberry Pi как домашний сервер). Пусть её адрес в локальной сети 192.168.1.10, интерфейс eth0;
  • туннельная сеть 10.8.0.0/24: сервер получает 10.8.0.1, ноутбук 10.8.0.2, телефон 10.8.0.3;
  • домашняя сеть 192.168.1.0/24, к которой клиенты получают доступ через сервер;
  • роутер пробрасывает UDP-порт 51820 с внешнего адреса на 192.168.1.10.

От провайдера нужен внешний (белый) IP-адрес. Если провайдер выдаёт адрес из серой сети за CGNAT, входящие подключения до вас не дойдут, и понадобится промежуточный сервер, об этом ниже. Если IP динамический, заведите бесплатное DDNS-имя: многие роутеры обновляют его сами.

Важное ограничение: домашняя подсеть не должна совпадать с сетью, из которой вы подключаетесь. Если и дома, и в кафе 192.168.1.0/24, маршруты перепутаются. Поэтому дома лучше использовать что-то менее типичное, например 192.168.77.0/24.

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

Модуль WireGuard входит в ядро Linux с версии 5.6, ставить нужно только пользовательские утилиты wg и wg-quick.

ДистрибутивПакетКоманда
Ubuntu 26.04, Debian 13wireguard (тянет wireguard-tools)sudo apt install wireguard
Fedora 44wireguard-toolssudo dnf install wireguard-tools
Arch Linuxwireguard-toolssudo pacman -S wireguard-tools
Raspberry Pi OSwireguardsudo apt install wireguard

У каждого участника своя пара ключей: закрытый остаётся на устройстве, открытый отдаётся второй стороне. Генерируем на сервере ключи для него и для клиентов:

sudo -i
cd /etc/wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee laptop.key | wg pubkey > laptop.pub
wg genkey | tee phone.key | wg pubkey > phone.pub
# дополнительный общий ключ для каждой пары, по желанию
wg genpsk > laptop.psk

Команда umask 077 нужна, чтобы файлы ключей сразу создавались с правами только для root. Клиентские закрытые ключи после настройки удалите с сервера или храните в надёжном месте.

Настройка сервера: wg0.conf, пересылка и NAT

Создайте файл /etc/wireguard/wg0.conf. Вместо строк в угловых скобках подставьте содержимое соответствующих файлов ключей:

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <содержимое server.key>
# NAT: пакеты из туннеля уходят в домашнюю сеть от имени сервера
PostUp = nft add table ip wgnat; nft add chain ip wgnat post '{ type nat hook postrouting priority 100; }'; nft add rule ip wgnat post oifname eth0 ip saddr 10.8.0.0/24 masquerade
PostDown = nft delete table ip wgnat

[Peer]
# ноутбук
PublicKey = <содержимое laptop.pub>
PresharedKey = <содержимое laptop.psk>
AllowedIPs = 10.8.0.2/32

[Peer]
# телефон
PublicKey = <содержимое phone.pub>
AllowedIPs = 10.8.0.3/32

NAT нужен, чтобы домашние устройства отвечали клиентам VPN без дополнительных маршрутов на роутере. Альтернатива без маскарадинга - прописать на роутере статический маршрут 10.8.0.0/24 через 192.168.1.10, тогда в журналах NAS будут видны настоящие адреса клиентов.

Включаем пересылку пакетов и запускаем интерфейс как службу:

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
sudo systemctl enable --now wg-quick@wg0
sudo wg show

Если на сервере работает файрвол, откройте порт и разрешите пересылку. В Ubuntu с ufw: sudo ufw allow 51820/udp и sudo ufw route allow in on wg0 out on eth0. В Fedora с firewalld: sudo firewall-cmd --permanent --add-port=51820/udp, затем sudo firewall-cmd --reload. Своё правило на nftables удобно держать вместе с остальными, как описано в статье про nftables. Как управлять службой и читать её журнал, смотрите в материале про systemctl.

Клиент на Linux: только домашняя сеть или весь трафик

На ноутбуке создайте /etc/wireguard/home.conf:

[Interface]
Address = 10.8.0.2/24
PrivateKey = <содержимое laptop.key>
# DNS = 192.168.1.1

[Peer]
PublicKey = <содержимое server.pub>
PresharedKey = <содержимое laptop.psk>
Endpoint = myhome.example.net:51820
AllowedIPs = 10.8.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25

Строка AllowedIPs на клиенте определяет, какой трафик пойдёт в туннель: wg-quick сам добавит маршруты к этим сетям. В примере через VPN идёт только домашняя сеть, а интернет остаётся прямым. Если хотите, чтобы весь трафик шёл через дом (полезно в открытых Wi-Fi), поставьте AllowedIPs = 0.0.0.0/0, ::/0 и раскомментируйте DNS. Для строки DNS wg-quick использует resolvconf: в системах с systemd-resolved это обычно работает сразу, в минимальных установках Debian может потребоваться пакет resolvconf или openresolv.

sudo wg-quick up home
ping -c 3 192.168.1.10
sudo wg-quick down home

В KDE Plasma и GNOME удобнее импортировать конфиг в NetworkManager, тогда VPN включается из системного трея:

sudo nmcli connection import type wireguard file /etc/wireguard/home.conf
nmcli connection up home

Телефон, планшет и Windows: конфиг по QR-коду

Официальные приложения WireGuard есть для Android, iOS, Windows и macOS. Проще всего передать настройки на телефон QR-кодом. Соберите на сервере файл phone.conf по образцу клиента выше (свой адрес 10.8.0.3, свой закрытый ключ) и выведите код прямо в терминал:

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

В приложении нажмите добавить туннель, выберите сканирование QR-кода и наведите камеру на экран. После этого удалите phone.conf и phone.key с сервера: закрытый ключ телефона больше нигде не нужен.

В Windows клиент импортирует тот же текстовый файл через кнопку импорта туннеля из файла. Если на ноутбуке с Windows вам нужен ещё и SSH до домашних машин, настройка клиента описана в статье как подключиться по SSH.

Не подключается: разбираем по шагам

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

  1. Доходят ли пакеты до сервера. Запустите sudo tcpdump -ni eth0 udp port 51820 и подключитесь с телефона через мобильный интернет. Тишина означает, что не работает проброс порта на роутере или провайдер не даёт белый адрес.
  2. Ключи. Самая частая ошибка - в секцию Peer вставили закрытый ключ вместо открытого или перепутали клиентов местами. Сверьте wg show на обеих сторонах.
  3. Пересылка. sysctl net.ipv4.ip_forward должен вернуть 1, правило NAT должно быть в sudo nft list ruleset.
  4. Имя интерфейса. В конфиге указан eth0, а на сервере сетевой интерфейс называется enp3s0 или end0. Проверьте командой ip -br link.
  5. MTU. Если пинг проходит, а сайты и SMB зависают, добавьте на клиенте в секцию Interface строку MTU = 1380 и проверьте снова.

Проверяйте подключение снаружи, а не из домашнего Wi-Fi. Многие роутеры не умеют NAT loopback, и из локальной сети обращение к собственному внешнему адресу не работает, хотя снаружи всё в порядке. Самый быстрый тест - телефон с выключенным Wi-Fi.

Если провайдер не даёт внешний адрес

Узнать, за CGNAT ли вы, просто: сравните адрес WAN в интерфейсе роутера с тем, что показывают сайты проверки IP. Если они разные, а WAN начинается с 100.64-100.127 или 10., входящие подключения невозможны.

Варианты решения:

  • Заказать у провайдера статический или просто белый IP. Часто это платная опция, но самая надёжная.
  • Арендовать недорогой VPS и сделать его центральным узлом WireGuard: и домашний сервер, и клиенты подключаются к нему, а он пересылает трафик между ними. Домашний сервер в этом случае сам инициирует соединение, поэтому ему важен PersistentKeepalive.
  • Использовать mesh-сети поверх WireGuard вроде Tailscale или его открытого сервера координации Headscale. Они пробивают NAT сами, но это уже сторонняя инфраструктура.

Безопасность и обслуживание туннеля

WireGuard молчит в ответ на пакеты без правильного ключа, поэтому сканеры портов его практически не видят. Но несколько привычек всё равно стоит завести:

  • Один ключ на одно устройство. Потеряли телефон - удалите его пир, остальные продолжат работать: sudo wg set wg0 peer <открытый ключ телефона> remove, затем уберите секцию из wg0.conf.
  • Минимальные AllowedIPs на сервере. У каждого клиента ровно один адрес /32, иначе один клиент сможет выдавать себя за другого.
  • Резервная копия каталога /etc/wireguard в зашифрованном виде. Без ключа сервера придётся заново раздавать конфиги всем клиентам.
  • Доступ к сервисам за VPN. Туннель не отменяет паролей и обновлений. SSH на домашних машинах всё так же стоит закрыть ключами, смотрите статью про защиту SSH-сервера.

Полное описание параметров есть в man-страницах wg(8) и wg-quick(8), а также в ArchWiki: WireGuard.

Частые вопросы

Какой порт открыть для WireGuard?

Один UDP-порт, который указан в ListenPort на сервере, по умолчанию 51820. TCP-порты открывать не нужно.

Работает ли WireGuard без белого IP?

Входящие подключения к дому за CGNAT невозможны. Решения: заказать белый IP у провайдера, сделать центральным узлом недорогой VPS или использовать Tailscale и Headscale.

Как пустить через VPN только домашнюю сеть?

На клиенте в AllowedIPs укажите туннельную и домашнюю подсеть, например 10.8.0.0/24, 192.168.1.0/24. Для всего трафика используйте 0.0.0.0/0, ::/0.

Как добавить WireGuard в NetworkManager?

Командой sudo nmcli connection import type wireguard file /путь/к/файлу.conf. Имя подключения возьмётся из имени файла.

Как отключить потерянное устройство?

Выполните на сервере sudo wg set wg0 peer ОТКРЫТЫЙ_КЛЮЧ remove и удалите секцию Peer из wg0.conf, чтобы она не вернулась после перезапуска.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.