Mesh-сеть для homelab за CGNAT и DPI
Как я оставил homelab доступным с ноутбуков и старого 32-битного Android-телефона, который одновременно должен держать VPN для обхода DPI.
Начиналось все с простой задачи: я хотел стабильно попадать в свой homelab из любой сети.
На практике сеть оказалась не такой дружелюбной. Домашний интернет сидит за CGNAT. Публичные VPN-протоколы периодически ломаются из-за DPI. А главный мобильный клиент — старый 32-битный Android-телефон: современные mesh-инструменты почти не собираются под такой ARM, и при этом Android дает ему только один VPN-слот.
В итоге задача стала конкретнее:
- не открывать порты на домашнем роутере
- нормально жить за CGNAT
- не зависеть от VPN-протокола, который легко режется фильтрацией
- не заставлять телефон постоянно переключать VPN-профили
- оставить поддержку старого 32-битного ARM-клиента
Получилась не красивая схема из одного клика, а рабочая. В моем случае это важнее.
Общая Схема
В качестве публичной точки входа я использую небольшой VPS. Homelab сам подключается к нему через DPI-устойчивый туннель. А уже поверх этого приватная mesh-сеть связывает устройства, которым нужно видеть друг друга.
Самое важное здесь — направление подключения. Никто не должен стучаться напрямую в домашнюю сеть. Homelab сам поднимает соединение наружу, VPS остается доступным из интернета, а клиенты подключаются к приватной сети откуда угодно.
После этого CGNAT почти перестает быть проблемой. Проброс портов на роутере тоже. Даже если провайдер что-то меняет у себя, публичная часть схемы остается на VPS.
Почему Не Просто VPN
Обычный VPN был бы очевидным решением, если бы сеть была нормальной.
Но она не нормальная.
Некоторые протоколы работают какое-то время, а потом пропадают за фильтрацией. OpenVPN может быть медленным или заблокированным. WireGuard прекрасен, когда UDP проходит без проблем, но на это не всегда можно рассчитывать. Мне нужен был транспорт, который выглядит достаточно скучно для фильтров и не требует постоянного присмотра.
Поэтому публичный транспорт и приватная mesh-сеть у меня разделены.
DPI-bypass туннель доставляет homelab до VPS. Mesh отвечает за идентичность устройств, маршруты и нормальные имена. Это разные задачи, и когда они не смешаны в одну большую VPN-конфигурацию, систему проще понимать и чинить.
Mesh-Слой
Для mesh-сети я использую Headscale. Он дает свой control plane без зависимости от внешнего сервиса координации, но при этом сохраняет привычную Tailscale-логику: устройства подключаются, имена резолвятся, маршруты читаются без угадывания.
VPS становится местом, где mesh может встретиться. Homelab анонсирует нужные маршруты. Ноутбуки и телефон заходят в ту же приватную сеть и обращаются к сервисам по mesh-адресу или имени, а не по публичным IP.
В ежедневном использовании это сильно снижает трение. Я не хочу помнить, в какой сети сейчас нахожусь и где физически живет конкретный сервис. Я хочу открыть один и тот же адрес и получить один и тот же результат.
Самое Сложное Здесь — Телефон
Проблемное устройство в этой схеме — не отдельный клиент и не запасная плата. Это тот же телефон, который я ношу с собой.
Из-за этого у него сразу два независимых ограничения. Во-первых, это 32-битный Android-телефон на armv7, под который многие современные сборки уже просто не выпускаются. Во-вторых, на нём всё равно должен работать VPN для обхода DPI, потому что без него обычный интернет тоже часто превращается в лотерею. А Android разрешает держать VPN-интерфейс только одному приложению за раз.
Сначала я прошёл по очевидным вариантам Tailscale. Готовые бинарники, пакетные сборки и простой cross-compile ломались по-разному. Экосистема в основном уже предполагает 64-битный ARM, и в 2026 году это понятно, но не очень помогает, когда старый телефон всё ещё живой и лежит в руке.
Практический вывод: телефон нужно считать главным ограничением, а не странным исключением в конце. Mesh должен работать с одним Android VPN-слотом, а не заставлять меня каждый раз выбирать между нормальным интернетом и доступом к homelab.
Один Телефон, Один VPN
Если на телефоне одновременно нужны отдельное VPN-приложение для обхода DPI и отдельное mesh VPN-приложение, одно из них проигрывает. Это не баг ни в одном из приложений; так устроен Android VpnService.
Рабочее решение — перестать пытаться заводить сам телефон в mesh напрямую. Телефон продолжает держать DPI-bypass туннель, который ему и так нужен. А VPS на другом конце этого туннеля становится участником mesh. После этого исходящие соединения с VPS могут дойти до homelab по приватной mesh-сети.
В итоге телефон остаётся просто телефоном с одним активным VPN. Когда мне нужен домашний сервис, путь уже есть: телефон до DPI-bypass VPS, потом VPS до homelab через mesh.
Именно этот сдвиг делает схему пригодной для жизни. Старый 32-битный Android-телефон — не отдельная проблема рядом с ограничением VPN-слота; это одно и то же устройство, которое одновременно создаёт оба ограничения.
NFS И Трюк С Сертификатом
Приятный побочный эффект: локальные сервисы могут оставаться локальными.
Например, NFS не нужно превращать в публичный сервис. Приватный трафик идет через mesh. Для веб-инструментов можно поставить небольшой HTTPS-слой спереди и использовать wildcard-сертификат там, где это уместно.
Снаружи в интернете почти ничего не видно. Внутри приватной сети все остается удобным. Это и был нужный баланс.
Что В Этой Схеме Хорошо
Она скучная в правильных местах.
У VPS есть публичный адрес. Homelab подключается наружу. Mesh дает идентичность устройств и стабильные имена. DPI-устойчивый туннель занимается транспортом через недружелюбную сеть. У каждой части одна понятная работа.
Когда что-то ломается, вопросы тоже простые:
- жив ли туннель от дома до VPS?
- доступен ли mesh control plane?
- подключился ли клиент к mesh?
- анонсируется ли нужный маршрут?
Это гораздо приятнее, чем разбирать одну огромную VPN-конфигурацию, где транспорт, идентичность, маршрутизация и совместимость устройств смешаны в один узел.
Компромиссы
Компромиссы есть.
VPS становится важной точкой отказа. Если он падает, удаленный доступ тоже падает. Движущихся частей больше, чем в обычном домашнем VPN. Поддержка старого 32-битного Android добавляет обслуживание, которое большинству людей, честно говоря, не нужно.
Для меня эти расходы оправданы. Я получаю стабильный удаленный доступ, не открываю порты дома, могу пользоваться телефоном без постоянного переключения VPN и не выбрасываю устройство только потому, что оно старое.
В этом и смысл. Homelab полезен удаленно не тогда, когда сеть идеальная, а когда до него можно добраться в плохих условиях.