Публикация сайтов с 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 (разово)
- В DNS (login.tailscale.com/admin/dns) включить:
- MagicDNS
- HTTPS Certificates (Enable)
- В 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
- Локальный деплой с Mac дома работает напрямую через mDNS:
pizdeploy
- В
package.jsonпроекта указываем порт:
"pizdeploy": {
"port": 3000
}
- При каждом деплое
pizdeployатомарно обновляет релиз и перезапускает systemd-юнит на порту 3000. - Туннель трогать не нужно — сайт в интернете по адресу
https://zero.tail78e184.ts.net/сразу отдаёт обновлённую версию.