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 = 60Info
В данном случае адресная зона сети выходит
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, а не ваш домашний сервер.
Готово! При правильной конфигурации, проксировать таким образом можно любые сервисы. Главное, чтобы у них не было своих уязвимостей ;)