Удалённый доступ к домашней сети нужен для управления NAS, камерами, умным домом, внутренними сервисами и файлами. VPN создаёт зашифрованный туннель между удалённым устройством и домашним роутером (или выделенным сервером), после чего клиент получает доступ к локальным адресам так, будто находится внутри сети.
Для домашней сети WireGuard — оптимальный вариант по соотношению простоты, скорости и безопасности. Он работает поверх UDP, использует современную криптографию (Curve25519, ChaCha20-Poly1305, BLAKE2s) и настраивается через один конфигурационный файл на каждой стороне. В отличие от OpenVPN, здесь нет отдельного механизма распределения ключей или push-конфигураций: обе стороны заранее обмениваются публичными ключами, как в SSH.
Альтернативы:
Типичная схема для домашнего доступа:
Сервер разворачивается на устройстве внутри домашней сети: роутере с OpenWrt, Raspberry Pi, NAS или любом Linux-хосте. Клиент — на ноутбуке, телефоне или планшете.
Ключевые требования к серверу:
Сервер слушает фиксированный порт и знает публичные ключи всех клиентов. Для каждого клиента задаётся
Здесь
Клиент указывает
Если WireGuard-сервер — не роутер, а отдельный хост в LAN, нужно убедиться, что:
Для постоянной активации — строка
где
Большинство домашних провайдеров выдают динамический IP за NAT. Варианты решения:
WireGuard автоматически обновляет endpoint пира при получении аутентифицированного пакета. Если клиент за NAT и не отправляет данные, NAT-таблица может протухнуть. Параметр
Если домашняя LAN использует 10.0.0.0/24, а VPN-туннель тоже 10.0.0.0/24 — маршруты конфликтуют. Решение: выбирайте для VPN подсеть, не пересекающуюся ни с LAN, ни с подсетями, которые могут встретиться в публичных сетях (избегайте 10.0.0.0/8 в целом, если нет уверенности).
Клиент пингует сервер по адресу 10.8.0.1, но не видит устройства в 192.168.1.0/24. Причина: роутер домашней сети не знает, что 10.8.0.0/24 доступен через WireGuard-хост. Проверяйте таблицу маршрутизации на роутере.
Клиент указал
VPN поднимается, IP-адреса доступны, но
Пакеты приходят на wg0, но не форвардятся в eth0. Проверяйте:
Убедитесь, что есть правило, разрешающее FORWARD с wg0 в LAN-интерфейс.
Пошаговая проверка при проблемах:
Выбор протокола
Для домашней сети WireGuard — оптимальный вариант по соотношению простоты, скорости и безопасности. Он работает поверх UDP, использует современную криптографию (Curve25519, ChaCha20-Poly1305, BLAKE2s) и настраивается через один конфигурационный файл на каждой стороне. В отличие от OpenVPN, здесь нет отдельного механизма распределения ключей или push-конфигураций: обе стороны заранее обмениваются публичными ключами, как в SSH.
Альтернативы:
| Протокол | Когда уместен | Ограничения |
|---|---|---|
| WireGuard | Домашний сервер, роутер с поддержкой | Требует статического порта или DDNS |
| OpenVPN | Если нужен TCP-туннель через restrictive firewall | Медленнее, сложнее конфигурация |
| IPsec/IKEv2 | Корпоративные сценарии, встроенная поддержка в iOS/macOS | Сложная настройка, больше surface area |
| AmneziaWG | Если DPI-фильтрация блокирует обычный WireGuard | См. AmneziaWG: настройка собственного VPN-сервера с защитой от DPI |
Архитектура: сервер и клиент
Типичная схема для домашнего доступа:
Код:
[Интернет] ←→ [Роутер / NAT] ←→ [WireGuard-сервер] ←→ [Домашняя LAN 192.168.1.0/24]
↑
wg0: 10.8.0.1/24
[Удалённый клиент] ←→ wg0: 10.8.0.2/24
Сервер разворачивается на устройстве внутри домашней сети: роутере с OpenWrt, Raspberry Pi, NAS или любом Linux-хосте. Клиент — на ноутбуке, телефоне или планшете.
Ключевые требования к серверу:
- Возможность пробросить UDP-порт извне (или наличие белого IP).
- IP forwarding включён, если сервер не является самим роутером.
- Маршрут обратно к клиенту через wg0.
Конфигурация сервера
Сервер слушает фиксированный порт и знает публичные ключи всех клиентов. Для каждого клиента задаётся
AllowedIPs — список адресов, которые этот клиент может использовать как источник, и одновременно список назначений, которые будут маршрутизироваться к нему.
INI:
[Interface]
PrivateKey = <приватный_ключ_сервера>
ListenPort = 51820
Address = 10.8.0.1/24
[Peer]
## Клиент: ноутбук
PublicKey = <публичный_ключ_клиента_1>
AllowedIPs = 10.8.0.2/32
[Peer]
## Клиент: телефон
PublicKey = <публичный_ключ_клиента_2>
AllowedIPs = 10.8.0.3/32
Здесь
AllowedIPs = 10.8.0.2/32 означает: сервер принимает пакеты от этого пира только с source IP 10.8.0.2 и отправляет к нему пакеты, destined для 10.8.0.2. Это и есть Cryptokey Routing — привязка маршрутов к криптографическим ключам.Конфигурация клиента
Клиент указывает
Endpoint (внешний адрес сервера) и AllowedIPs — какие адреса маршрутизировать через туннель.Split tunnel: доступ только к домашней сети
INI:
[Interface]
PrivateKey = <приватный_ключ_клиента>
Address = 10.8.0.2/24
[Peer]
PublicKey = <публичный_ключ_сервера>
Endpoint = 203.0.113.50:51820
AllowedIPs = 10.8.0.0/24, 192.168.1.0/24
AllowedIPs = 10.8.0.0/24, 192.168.1.0/24 — через туннель идут только пакеты к VPN-подсети и к домашней LAN. Весь остальной трафик (интернет) идёт через обычный шлюз. Это предпочтительный режим для доступа к домашним ресурсам без потери скорости на остальном трафике.Full tunnel: весь трафик через VPN
INI:
[Peer]
PublicKey = <публичный_ключ_сервера>
Endpoint = 203.0.113.50:51820
AllowedIPs = 0.0.0.0/0
0.0.0.0/0 — wildcard, весь исходящий трафик клиента шифруется и уходит через туннель. На сервере при этом должен быть настроен NAT (masquerade) для интерфейса wg0, иначе клиент не получит доступ в интернет.Маршрутизация и IP forwarding
Если WireGuard-сервер — не роутер, а отдельный хост в LAN, нужно убедиться, что:
- IP forwarding включён:
Bash:
sysctl net.ipv4.ip_forward=1
Для постоянной активации — строка
net.ipv4.ip_forward = 1 в /etc/sysctl.d/99-forward.conf.- NAT для full tunnel (если клиент должен выходить в интернет через домашний канал):
Bash:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
где
eth0 — интерфейс с доступом в LAN/интернет.- Обратный маршрут на роутере. Домашний роутер должен знать, что адреса 10.8.0.0/24 доступны через IP WireGuard-сервера в LAN. Если сервер сам является роутером (OpenWrt), этот шаг не нужен.
Доступ через NAT и динамический IP
Большинство домашних провайдеров выдают динамический IP за NAT. Варианты решения:
- Белый IP от провайдера. Самый надёжный вариант: пробрасываете UDP-порт на роутере к серверу.
- DDNS. Если IP динамический, но белый — сервис вроде DuckDNS или No-IP обновляет доменное имя. Клиент указывает домен в
Endpoint.
- Обратный туннель. Если IP серый (за CGNAT), сервер сам устанавливает исходящее соединение к внешнему VPS с белым IP, а клиент подключается к VPS. WireGuard поддерживает roaming: сервер обнаруживает новый endpoint клиента автоматически при получении аутентифицированного пакета.
- AmneziaWG. Если DPI блокирует UDP-туннели, см. AmneziaWG: настройка собственного VPN-сервера с защитой от DPI.
Безопасность
Управление ключами
- Приватный ключ (
PrivateKey) никогда не покидает устройство, на котором сгенерирован.
- Публичные ключи передаются любым out-of-band способом (мессенджер, email, QR-код).
- При компрометации клиента — удаляете его
[Peer]-блок из конфигурации сервера. WireGuard не имеет механизма отзыва ключей; доступ контролируется исключительно списком пиров.
Минимизация exposure
ListenPortсервера — единственная открытая дыра в файрволе. Ограничьте доступ к нему по IP, если клиент имеет статический адрес.
- Не выставляйте в
AllowedIPsклиента подсеть0.0.0.0/0на сервере, если это не требуется: это позволит клиенту отправлять пакеты с любым source IP через туннель.
- Используйте отдельные подсети для VPN (10.8.0.0/24, 10.9.0.0/24), не пересекающиеся с LAN.
Keepalive и roaming
WireGuard автоматически обновляет endpoint пира при получении аутентифицированного пакета. Если клиент за NAT и не отправляет данные, NAT-таблица может протухнуть. Параметр
PersistentKeepalive = 25 в конфигурации клиента решает это: каждые 25 секунд отправляется keepalive-пакет, удерживающий NAT-маппинг.
INI:
[Peer]
PublicKey = <публичный_ключ_сервера>
Endpoint = 203.0.113.50:51820
AllowedIPs = 10.8.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25
Типичные ошибки маршрутизации
1. Конфликт подсетей
Если домашняя LAN использует 10.0.0.0/24, а VPN-туннель тоже 10.0.0.0/24 — маршруты конфликтуют. Решение: выбирайте для VPN подсеть, не пересекающуюся ни с LAN, ни с подсетями, которые могут встретиться в публичных сетях (избегайте 10.0.0.0/8 в целом, если нет уверенности).
2. Забытый обратный маршрут
Клиент пингует сервер по адресу 10.8.0.1, но не видит устройства в 192.168.1.0/24. Причина: роутер домашней сети не знает, что 10.8.0.0/24 доступен через WireGuard-хост. Проверяйте таблицу маршрутизации на роутере.
3. AllowedIPs слишком узкие на клиенте
Клиент указал
AllowedIPs = 10.8.0.0/24, но забыл добавить 192.168.1.0/24. Пакеты к домашним устройствам не идут через туннель, а уходят в локальную сеть клиента (где их, разумеется, нет).4. DNS не резолвит внутренние имена
VPN поднимается, IP-адреса доступны, но
nas.local не резолвится. Решение: указать DNS-сервер домашней сети в конфигурации клиента или добавить записи в /etc/hosts.5. Файрвол на сервере блокирует forwarding
Пакеты приходят на wg0, но не форвардятся в eth0. Проверяйте:
Bash:
iptables -L FORWARD -n -v
Убедитесь, что есть правило, разрешающее FORWARD с wg0 в LAN-интерфейс.
Диагностика
Пошаговая проверка при проблемах:
Bash:
## 1. Статус интерфейса и handshake
wg show
## 2. Таблица маршрутизации — куда идут пакеты
ip route show
## 3. Пинг до VPN-адреса сервера
ping 10.8.0.1
## 4. Пинг до устройства в LAN
ping 192.168.1.10
## 5. Проверка forwarding на сервере
sysctl net.ipv4.ip_forward
## 6. Счётчики iptables (если есть NAT)
iptables -t nat -L POSTROUTING -n -v
wg show выводит latest handshake для каждого пира. Если handshake старше нескольких минут при активном использовании — проблема с NAT или файрволом между клиентом и сервером.Чек-лист развёртывания
- Сгенерировать ключи на сервере и каждом клиенте (
wg genkey,wg pubkey).
- Настроить
[Interface]и[Peer]на обеих сторонах.
- Пробросить UDP-порт на роутере к серверу (или настроить обратный туннель).
- Включить
ip_forwardна сервере.
- Добавить обратный маршрут на роутере (если сервер не роутер).
- Настроить NAT/masquerade, если нужен full tunnel.
- Убедиться, что подсети VPN и LAN не пересекаются.
- Проверить
wg showи пинг до устройств в LAN.
- Добавить
PersistentKeepaliveна клиентах за NAT.
