TL;DR: я устанавливаю Wireguard на VPS, подключаюсь к нему с домашнего роутера на OpenWRT, и получаю доступ к домашней подсети с телефона.
Если вы держите на домашнем сервере личную инфраструктуру или у вас дома множество девайсов управляемых по IP, то вы наверняка хотите иметь к ним доступ с работы, из автобуса, поезда и метрo. Чаще всего для аналогичных задач приобретается IP у провайдера, после чего порты каждого сервиса пробрасываются наружу.
Вместо этого я настроил VPN с доступом в домашнюю локалку. Плюсы такого решения:
Прозрачность: чувствую себя как дома при любых обстоятельствах.
Простота: настроил и забыл, не надо думать о пробросе каждого порта.
Цена: у меня уже есть VPS, для таких задач современный VPN почти бесплатен по ресурсам.
Безопасность: ничего не торчит наружу, можно оставить MongoDB без пароля и никто не утащит данные.
Как всегда, есть и минусы. Во-первых, вам придётся настраивать каждый клиент по отдельности, в том числе, на стороне сервера. Может быть неудобно при наличии большого числа устройств, с которых хочется иметь доступ к сервисам. Во-вторых, у вас на работе может оказаться совпадающая по диапазону локалка — придётся разрешать эту проблему.
Домашний сервер с каким-нибудь веб-сервисом для проверки.
Прямые руки.
В качестве технологии VPN я буду использовать Wireguard. Это решение также имеет сильные и слабые стороны, я их не буду описывать. Для VPN я использую подсеть 192.168.99.0/24, а дома у меня 192.168.0.0/24.
Конфигурация VPS
Для дела хватит даже самого нищенского VPS за 30 рублей в месяц, если вам повезёт такой урвать.
Все операции на сервере я выполняю от рута на чистой машине, при необходимости добавьте `sudo` и адаптируйте инструкции.
Wireguard не успели завезти в стейбл, поэтому я выполняю `apt edit-sources` и добавляю бэкпорты двумя строчками в конец файла:
deb http://deb.debian.org/debian/ buster-backports main
# deb-src http://deb.debian.org/debian/ buster-backports main
Пакет устанавливается привычным образом: apt update && apt install wireguard.
Далее генерируем пару ключей: wg genkey | tee /etc/wireguard/vps.private | wg pubkey | tee /etc/wireguard/vps.public. Эту операцию повторите ещё дважды для каждого девайса-участника схемы. Поменяйте пути к файлам с ключами для другого устройства и не забудьте о безопасности приватных ключей.
Теперь готовим конфиг. В файл /etc/wireguard/wg0.conf помещается конфиг:
В секции [Interface] указываются настройки самой машины, а в [Peer] — настройки для тех, кто будет к ней подключаться. В AllowedIPs через запятую прописываются подсети, которые будут маршрутизироваться в соответствующего пира. Из-за этого пиры устройств-«клиентов» в подсети VPN должны иметь маску /32, всё остальное будет маршрутизироваться сервером. Так как домашняя сеть будет маршрутизироваться через OpenWRT, в AllowedIPs соответствующего пира дописываем домашнюю подсеть. В PrivateKey и PublicKey разложите приватный ключ сгенерированный для VPS и публичные ключи пиров соответственно.
На VPS осталось только запустить команду, которая поднимет интерфейс и добавит его в автозапуск: systemctl enable --now wg-quick@wg0. Текущий статус соединений можно проверить командой wg.
Конфигурация OpenWRT
Всё, что нужно для этого этапа есть в модуле luci (веб-интерфейс OpenWRT). Залогиньтесь в нём и в меню System откройте вкладку Software. OpenWRT не хранит кэш на машине, поэтому надо обновить список доступных пакетов, нажав на зелёную кнопку Update lists. После завершения в фильтр вбиваете luci-app-wireguard и, глянув на окошко с красивым деревом зависимостей, устанавливаете этот пакет.
В меню Networks выбираете Interfaces и жмёте зелёную кнопку Add New Interface под списком уже имеющихся. После ввода имени (так же wg0 в моём случае) и выбора протокола WireGuard VPN открывается форма настроек с четырьмя вкладками.
На вкладке General Settings надо вбить приватный ключ и IP адрес заготовленный для OpenWRT вместе с подсетью.
На вкладке Firewall Settings заводите интерфейс в локальную сеть. Так соединения из VPN будут свободно попадать в локалку.
На вкладке Peers жмёте единственную кнопку, после чего в обновленной форме заполняете данные VPS-сервера: публичный ключ, Allowed IPs (надо всю VPN-подсеть замаршрутизировать в сервер). В Endpoint Host и Endpoint Port вводите соответственно IP адрес VPS с портом в ранее указанным в директиве ListenPort. Отметьте Route Allowed IPs, чтобы были созданы маршруты. И обязательно заполните Persistent Keep Alive, иначе туннель туннель от VPS к роутеру будет обрываться, если последний за NAT.
После этого можно сохранить настройки, а затем на странице со списком интерфейсов нажать Save and apply. При необходимости явно запустите интерфейс кнопкой Restart.
Настраиваем смартфон
Вам потребуется клиент Wireguard, он доступен в F-Droid, Google Play и App Store. Открыв приложение жмёте плюсик и в секции Interface вводите имя соединения, приватный ключ (публичный сгенерируется автоматически) и адрес телефона с маской /32. В секции Peer указываете публичный ключ VPS, пару адрес: порт VPN-сервера в качестве Endpoint и маршруты до VPN- и домашней подсети.
Жирный скриншот с телефона
Жмёте на дискетку в углу, включаете и…
Готово
Теперь вы можете получить доступ к домашнему мониторингу, менять настройки роутера, или делать что угодно на уровне IP.