Wireguard сеть может быть полезна в разных случаях. Некоторые до сих пор используют его для организации proxy, часто корпоративные решения виртуальных сетей основаны на wg. В моем случае wg используется для создания своего аналога cloudflare tunnel. Конечно использовать решение cloudflare может быть надежнее, однако ситуация с cloudflare на территории РФ весьма нестабильна, поэтому такое решение может оказаться несколько ненадежным.

Чтобы организовать wireguard сеть для реверс-проксирования своих домашних сервисов нужны лишь VPS и немного выполнить несколько команд. Однако предполагается, что для этого у вас уже имеется свой домен и полный доступ к его настройкам DNS.

Для чего?

Одна из основных целей селф-хостинга каких-либо сервисов на вашем домашнем сервере это приватность и конфиденциальность ваших данных, однако крайне неудобно иметь доступ к этим сервисам исключительно из локальной сети или через VPN. При наличии своего домена можно открыть эти сервисы во внешнюю сеть, указав в DNS адрес вашего домашнего сервера, но это потенциально небезопасно, так как проверить IP адрес по домену может кто угодно.

Решением этой проблемы является использование reverse tunnel. Ваш домашний сервер самостоятельно подключается к приватной сети, сохраняя при этом все порты на вашем роутере закрытыми. В DNS при этом будет находиться IP адрес вашего VPS. Таким образом запросы для вашего self-hosted сервиса будут идти на VPS, а он уже будет проксировать их по wireguard сети с вашего домашнего сервера.

Установка

На обоих хостах потребуется установить wireguard. На debian-based дистрибутивах это можно сделать командой sudo apt install wireguard. Все операции стоит производить под root пользователем на обоих серверах, чтобы избежать проблем с разрешениями.

Начало конфигурации на VPS

# переход на root пользователя
sudo su -
 
wg genkey > /etc/wireguard/private.key # генерация приватного ключа
chmod go= /etc/wireguard/private.key
wg pubkey < /etc/wireguard/private.key > /etc/wireguard/public.key # генерация публичного ключа
# здесь мы выполняем wg pubkey, считывая перед этим файл private.key, и записываем результат в public.key

После выполненных действий нужно заполнить файл /etc/wireguard/wg0.conf

[Interface]
Address = 10.10.20.1/29 # адрес wireguard сети
SaveConfig = false
ListenPort = 51820
PrivateKey = <содержимое /etc/wireguard/private.key>
 
[Peer]
PublicKey = <это поле нужно будет заполнить содержимым файла /etc/wireguard/public.key с вашего домашнего сервера после генерации на нем ключей>
AllowedIPs = 10.10.20.1/29
PersistentKeepalive = 60

Info

В данном случае адресная зона сети выходит 10.10.20.1/29 - это адресная зона, допускающая только два адреса. Эта зона вполне подходит для создания reverse tunnel подключения, но если вам требуется wireguard сеть с большим количеством клиентов, то зону придется поменять, а количество пиров в конфигурации увеличить.

Конфигурация на домашнем сервере

# переход на root пользователя
sudo su -
 
wg genkey > /etc/wireguard/private.key # генерация приватного ключа
chmod go= /etc/wireguard/private.key
wg pubkey < /etc/wireguard/private.key > /etc/wireguard/public.key # генерация публичного ключа

Сгенерировав ключи, заполняем файл /etc/wireguard/wg0.conf

[Interface]
Address = 10.10.20.2
SaveConfig = false
ListenPort = 31250
PrivateKey = <содержимое /etc/wireguard/private.key>
 
[Peer]
PublicKey = <содержимое /etc/wireguard/public.key на VPS>
AllowedIPs = 10.10.20.1/29
Endpoint = <адрес VPS>:51820
PersistentKeepalive = 60

Теперь можно запустить wireguard туннель и включить его автозапуск:

systemctl enable --now wg-quick@wg0.service

Завершение конфигурации на VPS

Не забудьте заполнить поле PublicKey содержимым файла /etc/wireguard/public.key, сгенерированного на вашем домашнем сервере. Запускаем wireguard и включаем автозапуск:

systemctl enable --now wg-quick@wg0.service

Проверка

После запуска сервиса wg-quick@wg0 на обоих хостах можно проверить работоспособность туннеля следующими коммандами:

# команда wg show должна показать, что пир подключен.
$ wg show
interface: wg0
  public key: XXXXXXXXXXXXXXXXXXX
  private key: (hidden)
  listening port: 31250
 
peer: XXXXXXXXXXXXXXXXXXXXX
  endpoint: XXX.XXX.XXX.XXX:51820
  allowed ips: 10.10.20.0/29
  latest handshake: 1 minute, 9 seconds ago
  transfer: 1.43 MiB received, 10.63 MiB sent
  persistent keepalive: every 1 minute
  
# при успешной установке подключения должен проходить ping между обоими клиентами сети
 
$ ping 10.10.20.1 # на стороне домашнего сервера
PING 10.10.20.1 (10.10.20.1) 56(84) bytes of data.
64 bytes from 10.10.20.1: icmp_seq=1 ttl=64 time=19.7 ms
64 bytes from 10.10.20.1: icmp_seq=2 ttl=64 time=17.7 ms
64 bytes from 10.10.20.1: icmp_seq=3 ttl=64 time=17.6 ms
64 bytes from 10.10.20.1: icmp_seq=4 ttl=64 time=17.3 ms
64 bytes from 10.10.20.1: icmp_seq=5 ttl=64 time=17.7 ms
 
$ ping 10.10.20.2 # на стороне VPS
PING 10.10.20.2 (10.10.20.2) 56(84) bytes of data.
64 bytes from 10.10.20.2: icmp_seq=1 ttl=64 time=16.3 ms
64 bytes from 10.10.20.2: icmp_seq=2 ttl=64 time=17.4 ms
64 bytes from 10.10.20.2: icmp_seq=3 ttl=64 time=17.2 ms
64 bytes from 10.10.20.2: icmp_seq=4 ttl=64 time=16.6 ms
64 bytes from 10.10.20.2: icmp_seq=5 ttl=64 time=17.0 ms

Туннелирование сервисов

Чтобы туннелировать ваши сервисы достаточно на стороне VPS указать в конфигурации web-сервера (Caddy, Nginx, Apache, etc.) адрес вашего домашнего сервера в wireguard сети. Пример в Caddy:

# здесь ваш домен
domain.example.com {
    reverse_proxy 10.10.20.2:8080
}

Само собой, сертификатами при этом должен заниматься именно VPS, а не ваш домашний сервер.

Готово! При правильной конфигурации, проксировать таким образом можно любые сервисы. Главное, чтобы у них не было своих уязвимостей ;)