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

Содержание
Схема: кто сервер, кто клиент и что нужно от провайдера
Задача типичная: вы в поездке или на работе и хотите открыть домашний 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 13 | wireguard (тянет wireguard-tools) | sudo apt install wireguard |
| Fedora 44 | wireguard-tools | sudo dnf install wireguard-tools |
| Arch Linux | wireguard-tools | sudo pacman -S wireguard-tools |
| Raspberry Pi OS | wireguard | sudo 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/32NAT нужен, чтобы домашние устройства отвечали клиентам 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. Если рукопожатия нет, проблема в доставке пакетов или ключах. Если есть, но домашние адреса не пингуются, проблема в маршрутизации.
- Доходят ли пакеты до сервера. Запустите
sudo tcpdump -ni eth0 udp port 51820и подключитесь с телефона через мобильный интернет. Тишина означает, что не работает проброс порта на роутере или провайдер не даёт белый адрес. - Ключи. Самая частая ошибка - в секцию Peer вставили закрытый ключ вместо открытого или перепутали клиентов местами. Сверьте
wg showна обеих сторонах. - Пересылка.
sysctl net.ipv4.ip_forwardдолжен вернуть 1, правило NAT должно быть вsudo nft list ruleset. - Имя интерфейса. В конфиге указан eth0, а на сервере сетевой интерфейс называется enp3s0 или end0. Проверьте командой
ip -br link. - 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, чтобы она не вернулась после перезапуска.
Документация и источники
- WireGuard, ArchWiki, 2026
- Quick Start, WireGuard, 2026
- wg-quick(8), WireGuard, 2026
Читайте также
- Nftables: понятный firewall для домашнего компьютера и сервера
- Домашний сервер на Raspberry Pi 5: практическая сборка от железа до Docker
- Домашний сервер на Linux: хранение, резервные копии и сервисы
- Как подключиться по SSH из Linux и Windows: от первого входа до туннелей
- Защита SSH-сервера в Linux: ключи, ограничения и журналирование
Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.