Запустить туннель бесплатно
☰
Дом без белого IP

Домашний сервер без белого IP: сайт, Nextcloud и Jellyfin

Домашний сервер без белого IP: как открыть в интернет сайт, Nextcloud и Jellyfin через туннель, что поправить в их настройках и где у схемы пределы.

Домашний сервер можно открыть в интернет и без белого IP. Клиент fxTunnel на домашней машине сам подключается к серверу fxTunnel и получает публичный адрес вида https://mycloud.fxtun.ru с готовым сертификатом. Роутер и провайдер при этом не участвуют: соединение исходящее, NAT ему не мешает. Одна команда на сервис: fxtunnel http 80 для Nextcloud, fxtunnel http 8096 для Jellyfin. Ниже по шагам, с настройками, без которых Nextcloud откроется криво, и с честным разговором о том, чего домашний канал не выдержит.

Что можно держать дома

Любую программу, у которой есть веб-интерфейс или сетевой порт. Чаще всего это:

  • сайт: личный блог, портфолио, тестовая версия проекта;
  • Nextcloud: свои файлы, календарь и контакты вместо облака;
  • Jellyfin: медиатека, фильмы и музыка с домашнего диска на телефоне;
  • Home Assistant: умный дом. Ему посвящён отдельный разбор: Home Assistant через туннель.

Сервером может быть старый ноутбук, мини-ПК или Raspberry Pi. Главное условие одно: машина включена, и на ней запущен клиент. Выключили компьютер, и сайт перестал отвечать.

Если вы ещё не знаете, серый у вас адрес или белый, начните со статьи «Серый IP: как узнать и что делать». А если порт на роутере открыть не получается по другим причинам, загляните в «Как открыть порты, если открыть их нельзя».

Как это работает без белого IP

Обычная схема с белым адресом: интернет стучится в ваш роутер, роутер пробрасывает порт на сервер. За NAT провайдера этот стук до роутера не доходит.

Туннель работает наоборот. Клиент fxtunnel сам открывает исходящее соединение к серверу fxTunnel и держит его. Посетитель приходит на https://mycloud.fxtun.ru, сервер fxTunnel передаёт запрос по уже открытому соединению, а клиент отдаёт его локальной программе.

интернетбраузер или приложениеmycloud.fxtun.ru
сервер fxTunnelпубличный адрес*.fxtun.ru
дом за CGNATклиент fxtunnelfxtunnel http 80
локальноNextcloudlocalhost:80
Рис. 1. HTTPS заканчивается на сервере fxTunnel, дальше запрос идёт по соединению, которое открыл ваш домашний клиент.

Из схемы следуют две вещи, которые понадобятся дальше. Сертификат для *.fxtun.ru уже есть на сервере fxTunnel, так что выпускать свой не нужно. А до вашей программы запрос доходит обычным HTTP с адреса 127.0.0.1: именно так её видит клиент туннеля.

Установка клиента

На сервере с Linux или macOS:

BASH
curl -fsSL https://fxtun.ru/install.sh | sh
fxtunnel login

На Windows установка — irm https://fxtun.ru/install.ps1 | iex в PowerShell, вход тот же. fxtunnel login откроет браузер для входа в аккаунт, делается это один раз.

Сайт на домашнем компьютере

Проверим схему на самом простом сайте. Любая папка с index.html превращается в сайт встроенным сервером Python:

BASH
python3 -m http.server 8080

Во втором окне терминала:

BASH
fxtunnel http 8080
CONSOLE
Connecting to fxtunnel server...
Tunnel established!
HTTP:  http://lemon.fxtun.ru
HTTPS: https://lemon.fxtun.ru
Forwarding to localhost:8080
Ready to receive connections

Адрес из строки HTTPS: откроется с любого устройства. Для настоящего сайта вместо http.server будет nginx, Apache или ваше приложение, а команда туннеля та же, с его портом.

Поддомен здесь случайный, и при следующем запуске он сменится. Для сервера это неудобно, поэтому дальше будем задавать имя флагом --domain. О том, как закрепить имя за собой, ниже в разделе про постоянный адрес.

Nextcloud через туннель

Допустим, Nextcloud уже стоит и открывается дома по адресу http://localhost (веб-сервер слушает порт 80). Открываем туннель с постоянным именем:

BASH
fxtunnel http 80 --domain mycloud

Если Nextcloud запущен в Docker с публикацией -p 8080:80, туннель открывается на порт хоста: fxtunnel http 8080 --domain mycloud.

Откройте https://mycloud.fxtun.ru, и Nextcloud скорее всего откажется работать с сообщением о недоверенном домене. Это нормально, его нужно донастроить.

Три параметра config.php

Nextcloud пускает только по адресам из списка trusted_domains. Локальные адреса вроде localhost доверенные всегда, а новое имя надо добавить (документация Nextcloud).

Второй момент связан с HTTPS. Посетитель открывает сайт по HTTPS, но шифрование заканчивается на сервере fxTunnel, и до Nextcloud запрос доходит обычным HTTP. Сервер fxTunnel к тому же передаёт заголовок X-Forwarded-Proto: http. Без подсказки Nextcloud решит, что работает по HTTP, и начнёт строить ссылки и редиректы на http://. Для прокси, который сам завершает TLS, документация Nextcloud велит выставить overwriteprotocol в https. Там же описан overwrite.cli.url: базовый адрес для ссылок, которые Nextcloud формирует из командной строки и фоновых задач.

Сначала посмотрите, какие домены уже в списке:

BASH
cd /var/www/nextcloud
sudo -E -u www-data php occ config:system:get trusted_domains

Затем добавьте новое имя под следующим свободным номером. Если в списке один элемент (номер 0), новый будет 1:

BASH
sudo -E -u www-data php occ config:system:set trusted_domains 1 --value=mycloud.fxtun.ru
sudo -E -u www-data php occ config:system:set overwriteprotocol --value=https
sudo -E -u www-data php occ config:system:set overwrite.cli.url --value=https://mycloud.fxtun.ru

Команды occ и синтаксис с номером элемента взяты из справки по occ. Путь /var/www/nextcloud и пользователь www-data типичны для Debian и Ubuntu; в Fedora пользователь веб-сервера apache, в Arch http. В Docker-образе Nextcloud те же команды выполняются через docker exec --user www-data <контейнер> php occ ….

В итоге в config.php появится примерно такое:

PHP
'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => 'mycloud.fxtun.ru',
  ),
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://mycloud.fxtun.ru',

Если Nextcloud открывают ещё и из домашней сети по http://192.168.…, ограничьте подмену протокола запросами через туннель. Параметр overwritecondaddr из той же документации включает overwrite* только для запросов с адреса, подходящего под регулярное выражение, а клиент туннеля подключается с 127.0.0.1:

BASH
sudo -E -u www-data php occ config:system:set overwritecondaddr --value='^127\.0\.0\.1$'

Обновите страницу, и Nextcloud откроется по HTTPS. Тот же адрес https://mycloud.fxtun.ru вводится в приложениях Nextcloud на телефоне и компьютере.

Имя mycloud вписано в настройки, поэтому менять его потом хлопотно. Выбирайте один раз и закрепите за собой, об этом ниже.

Jellyfin: порт 8096

По документации Jellyfin сервер слушает HTTP на TCP-порту 8096, HTTPS на 8920 и UDP-порт 7359 для поиска серверов в локальной сети. Для туннеля нужен только первый:

BASH
fxtunnel http 8096 --domain mymedia

HTTPS даёт сервер fxTunnel, поэтому порт 8920 открывать не нужно. Порт 7359 работает только внутри домашней сети, через интернет он не нужен. В приложениях Jellyfin на телефоне или телевизоре укажите адрес сервера https://mymedia.fxtun.ru.

Документация Jellyfin прямо называет открытие порта в интернет небезопасным и советует обратный прокси, VPN или VPS. Туннель ближе всего к обратному прокси: ваш домашний адрес никто не видит. Но сам Jellyfin всё равно доступен из интернета, так что пароли у всех пользователей нужны длинные.

Страница-предупреждение на *.fxtun.ru

У адресов *.fxtun.ru есть защита от фишинга. Когда человек впервые открывает туннель в браузере, вместо сайта он видит страницу fxTunnel: сайт работает через туннель разработчика, содержимое не проверено. После кнопки «Продолжить» браузер получает cookie на 12 часов, и страница пропадает (документация).

Показывается она при трёх условиях сразу: запрос методом GET, ваш сервер ответил HTML, адрес на поддомене fxtun.ru. Что это значит для домашних сервисов:

  • В браузере страница появится при первом входе в Nextcloud или Jellyfin и дальше раз в 12 часов, на каждом устройстве и в каждом браузере отдельно. Экран входа у обоих отвечает HTML.
  • Запросы к API отвечают JSON, а загрузки файлов в Nextcloud идут методом PUT. Их страница не трогает.
  • Вход в приложениях Nextcloud идёт через веб-страницу. По описанию Login Flow клиент открывает её во встроенном окне (Login Flow v1) или в системном браузере (v2, рассчитан прежде всего на десктоп). Значит, там можно увидеть ту же страницу с кнопкой «Продолжить».
  • Приложения Jellyfin, которые показывают веб-интерфейс сервера внутри себя, тоже могут её показать. Клиенты, которые общаются с сервером только через API, её не получают.
  • HTML-файлы в Nextcloud. Если клиент синхронизации скачивает файл .html и сервер отдаёт его с типом text/html, по правилу выше вместо файла может прийти страница-предупреждение. У программы синхронизации нет cookie из браузера.

Мы не проверяли каждое приложение для каждой платформы, поэтому пишем то, что следует из правила. Надёжное решение одно: на своём домене страницы нет вовсе. Для Nextcloud с мобильными клиентами и синхронизацией лучше сразу подключить свой домен.

Несколько сервисов сразу

Сайт, Nextcloud и Jellyfin — это три туннеля. На бесплатном тарифе одновременно работает один, три и больше открываются с тарифа Base: там пять туннелей и пять резервируемых поддоменов.

Держать под каждый туннель окно терминала на сервере неудобно. Опишите их в файле fxtunnel.yaml:

YAML
# fxtunnel.yaml
tunnels:
  - name: site
    type: http
    local_port: 8080
    subdomain: myhome
  - name: cloud
    type: http
    local_port: 80
    subdomain: mycloud
  - name: media
    type: http
    local_port: 8096
    subdomain: mymedia

И поднимите всё в фоне одной командой из папки с файлом:

BASH
fxtunnel up

Команда вернёт терминал и напечатает адреса. fxtunnel status покажет, что работает, fxtunnel down всё остановит. Чтобы туннели поднимались вместе с сервером после перезагрузки, клиент оформляют службой systemd. Всё это по шагам разобрано в статье «fxtunnel up: все туннели в фоне по одному конфигу».

Постоянный адрес и свой домен

Флаг --domain mycloud и поле subdomain работают на любом тарифе, но с оговоркой: пока ваш туннель выключен, имя может занять кто-то другой. Для сервера, чьё имя вписано в trusted_domains и в приложения на телефонах, это риск. Закрепить имя за собой можно резервом с тарифа Base:

BASH
fxtunnel domains add mycloud

Следующий шаг — свой домен вида cloud.example.com. На нём нет страницы-предупреждения, а адрес не зависит от поддомена fxtun.ru. На тарифе Base подключается один свой домен, сертификат сервер выпускает сам. Порядок такой: зарезервировать поддомен, добавить домен командой fxtunnel domains custom add cloud.example.com --target mycloud, прописать у регистратора TXT- и CNAME-записи и подтвердить домен. Подробно, с записями DNS, это описано в статье «Постоянный адрес туннеля».

Для Nextcloud после перехода на свой домен добавьте его в trusted_domains и поменяйте overwrite.cli.url теми же командами occ.

Честно о нагрузке и надёжности

Туннель снимает проблему серого IP, но домашний сервер остаётся домашним.

Скорость упирается в ваш канал. Всё, что уходит из дома, идёт через исходящий канал провайдера, а у домашних тарифов он часто медленнее входящего. Фильм в Jellyfin для двух-трёх человек обычно проходит, для целой компании одновременно может не хватить. Плюс весь трафик идёт через сервер fxTunnel, а не напрямую.

У туннеля есть лимиты частоты. Для HTTP-туннеля это 3600 запросов в минуту на туннель и 360 в минуту с одного IP; сверх лимита сервер отвечает 429 Too Many Requests (лимиты). Для семьи этого хватает с запасом, для публичного сайта с заметной посещаемостью уже нет.

Сервис живёт, пока живёт дом. Отключили свет, перезагрузился роутер, провайдер ушёл на профилактику: сервис недоступен. Клиент после обрыва переподключается сам и просит тот же поддомен, но пока дома нет интернета, снаружи сервис не увидеть. Бэкапы Nextcloud держите на другом диске, а лучше и вне дома.

Программа видит всех с адреса 127.0.0.1. К Nextcloud и Jellyfin подключается клиент туннеля на той же машине. Поэтому в их журналах и в правилах, завязанных на IP, будет локальный адрес, а не адрес посетителя. Ограничивать доступ по IP удобнее на самом туннеле флагом --allow-ip: сервер fxTunnel проверяет настоящий адрес посетителя и остальных отбрасывает. Как это устроено, вместе с паролем на туннель, разобрано в статье «Пароль и список IP для туннеля».

Если нужно попадать во всю домашнюю сеть целиком, со всеми устройствами, удобнее VPN вроде WireGuard. Туннель открывает конкретные сервисы по одному, и для сайта, облака и медиатеки этого обычно достаточно.

Что дальше

Когда нужен TCP или несколько туннелей

TCP и UDP доступны на платных тарифах: Base — 210 ₽/мес и 5 туннелей одновременно, Pro — 420 ₽/мес и 15 туннелей, Business — 630 ₽/мес и 50 туннелей. Free включает один HTTP-туннель с HTTPS.

Выберите клиент на странице скачивания: GUI для работы через графический интерфейс или CLI для терминала.

$ curl -fsSL https://fxtun.ru/install.sh | sh
@mephistofx

Пишу fxTunnel — туннели для разработчиков без белого IP. Рассказываю, как это устроено изнутри.

Написать в Telegram →

Читайте дальше