← к списку статей

Публикация сайтов с Raspberry Pi в интернет через Tailscale Funnel (в обход CGNAT и РКН)

Проблема

Нужно выставить сайт (например, на порту 3000), крутящийся на Raspberry Pi Zero, в публичный интернет бесплатно, без покупки белого IP и без своего домена.

При попытке использовать классический DuckDNS + Port Forwarding на роутере (например, ZTE GPON от МГТС/МТС) подключение сбрасывается: kex_exchange_identification: Connection closed by remote host

Причина: Провайдер выдаёт CGNAT (серый IP 100.64.0.0/10). В админке роутера в статусе WAN светится адрес вроде 100.83.x.x. DuckDNS видит внешний шлюз пула провайдера (92.60.x.x), но входящие пакеты из интернета глушатся на шлюзе провайдера и до домашнего роутера физически не доходят.


Решение: Tailscale Funnel

Tailscale Funnel бесплатно даёт постоянный публичный адрес с валидным HTTPS-сертификатом (Let's Encrypt): https://<node-name>.<tailnet>.ts.net/ Любой человек из интернета может открыть сайт через обычный браузер без установки Tailscale. Роутер и белый IP не нужны, так как малинка сама держит защищённый исходящий туннель.


Грабли и пошаговая настройка

1. Обход блокировки Tailscale со стороны РКН

В РФ домены tailscale.com и WireGuard-хэндшейки глушатся ТСПУ. Прямой curl https://tailscale.com/install.sh падает по таймауту (curl: (28)).

Если на малинке уже крутится локальный прокси (sing-box / Xray / V2Ray на портах 1081 HTTP и 10808 SOCKS5), ставим через него:

https_proxy=http://127.0.0.1:1081 curl -fsSL https://tailscale.com/install.sh | https_proxy=http://127.0.0.1:1081 sh

Чтобы сам демон tailscaled ходил в обход блокировок, прописываем прокси в конфиг сервиса:

echo 'ALL_PROXY="socks5://127.0.0.1:10808"' | sudo tee -a /etc/default/tailscaled
sudo systemctl restart tailscaled

Авторизуем малинку в аккаунте:

sudo tailscale up

Переходим по выведенной ссылке в браузере и жмём Authorize.


2. Настройка прав в панели Tailscale (разово)

  1. В DNS (login.tailscale.com/admin/dns) включить:
    • MagicDNS
    • HTTPS Certificates (Enable)
  2. В Access Controls (ACL) (login.tailscale.com/admin/acls) добавить блок разрешений для Funnel:
   "nodeAttrs": [
       {
           "target": ["autogroup:member"],
           "attr":   ["funnel"]
       }
   ]

3. Публикация локального порта в интернет

На малинке запускаем проброс нужного локального порта (например, 3000):

sudo tailscale funnel --bg 3000

Команда выведет готовый публичный URL:

Available on the internet:
https://zero.tail78e184.ts.net/
|-- proxy http://127.0.0.1:3000

Проверить текущий статус туннелей:

tailscale funnel status

Выключить публикацию при необходимости:

sudo tailscale funnel --https=443 off

4. Связка с деплоем через pizdeploy

  pizdeploy
  "pizdeploy": {
    "port": 3000
  }

решения-проблем #raspberry #tailscale #сеть #pizdeploy #devops #cgnat