Перейти к основному содержанию

Миграция с Cloudflare Tunnel на FRP: опыт пошагового перехода

О чём эта статья

В этой статье рассказывается, как я перешёл с Cloudflare Tunnel на собственное решение на базе FRP (Fast Reverse Proxy). Вы узнаете:

  • Какие проблемы возникают при использовании внешних сервисов
  • Как настроить промежуточное решение через Tailscale
  • Как развернуть FRP для полной автономности
  • Пошаговую инструкцию с примерами конфигураций
  • Сравнение всех подходов по производительности и надёжности

Уровень сложности: средний. Потребуется базовое понимание сетей и умение работать с командной строкой.


Введение

Cloudflare Tunnel — удобный способ быстро опубликовать сервис в интернете без проброса портов (открытия портов на роутере) и прямого доступа к серверу.

Однако зависимость от одного провайдера и внешних факторов может обернуться проблемами. В моём случае главным триггером стала блокировка IP-адресов Cloudflare в России, из-за которой доступ к сервису стал невозможен.

Цель миграции — упростить схему, сократить точки отказа и сохранить полный контроль над соединением.


Исходная точка

  • Сервер: Synology NAS с установленным gotosocial .
  • Доступ: через Cloudflare Tunnel, без проброса портов.
  • Проблема: блокировка Cloudflare в России привела к полной потере возможности подключаться к сервису извне.

Схема работы:

[Браузер] → [Cloudflare] → [Cloudflare Tunnel на NAS] → [gotosocial]

Промежуточный шаг: Tailscale + Cloudflare Tunnel на удалённом сервере

Чтобы обойти блокировку, был развёрнут следующий вариант:

  • Tailscale — приватная mesh-сеть (сеть, где каждое устройство может напрямую связываться с любым другим) между домашним NAS и VPS в стране, где блокировок нет
  • На VPS запущен Cloudflare Tunnel, который публикует сервис в интернет.
  • DNS-записи указывали на Cloudflare.

Плюсы:

  • Работает даже за CGNAT (когда ваш интернет-провайдер не выдаёт вам публичный IP)
  • Обход блокировок.
  • Не требует проброса портов в домашней сети.

Минусы:

  • Более сложная архитектура.
  • Больше точек отказа: Tailscale, VPS, Cloudflare Tunnel.
  • Лишние задержки из-за нескольких промежуточных узлов.

Схема работы:

[Браузер] → [Cloudflare] → [CF Tunnel на VPS] ⇄ [Tailscale] ⇄ [NAS] → [gotosocial]

Переход на FRP

В качестве финального решения выбран FRP (Fast Reverse Proxy).
Теперь схема стала проще и прозрачнее:

  1. На удалённом VPS:

    • Запущен frps (FRP Server).
    • Запущен Caddy как веб-сервер и обратный прокси:
      • Принимает входящие HTTP/HTTPS-запросы.
      • Раздаёт статический контент.
      • Обеспечивает работу с SSL-сертификатами через Let’s Encrypt.
  2. Дома:

    • На NAS запущен frpc (FRP Client).
    • Пробрасывает нужные порты для gotosocial на VPS.

Схема работы:

[Браузер] → [VPS: Caddy] → [FRP Server] ⇄ [FRP Client на NAS] → [gotosocial]

Пошаговая настройка FRP

Краткое объяснение компонентов

  • FRP (Fast Reverse Proxy) — инструмент для создания туннелей
  • frps — серверная часть, работает на VPS
  • frpc — клиентская часть, работает дома
  • Caddy — веб-сервер с автоматическими SSL-сертификатами

Шаг 1: Подготовка VPS

Установите FRP сервер и Caddy:

# Скачивание FRP
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
tar -xzf frp_0.58.1_linux_amd64.tar.gz
sudo cp frp_0.58.1_linux_amd64/frps /usr/local/bin/

# Установка Caddy
curl -1sLf https://dl.cloudsmith.io/public/caddy/stable/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/caddy-stable-archive-keyring.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main" | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy

Шаг 2: Конфигурация FRP сервера

Создайте /etc/frp/frps.toml:

bindPort = 7000
vhostHTTPPort = 8080

# Логи
[log]
level = "info"
maxDays = 3

# Безопасность (опционально)
auth.method = "token"
auth.token = "ваш_сложный_пароль"

Шаг 3: Конфигурация Caddy

Создайте /etc/caddy/Caddyfile:

social.example.com {
    reverse_proxy localhost:8080
    
    # Автоматические SSL-сертификаты
    tls {
        issuer acme
    }
    
    # Логи
    log {
        output file /var/log/caddy/access.log
    }
}

Шаг 4: Настройка клиента на Synology NAS

На Synology NAS все сервисы работают через Docker. Создадим конфигурацию и запустим FRP клиент в контейнере.

Шаг 4.1: Создание конфигурации

Создайте папку для конфигураций на NAS (например, /volume1/docker/frpc/) и файл frpc.toml:

serverAddr = "ваш_vps_ip"
serverPort = 7000

# Токен должен совпадать с сервером
auth.method = "token"
auth.token = "ваш_сложный_пароль"

[[proxies]]
name = "gotosocial"
type = "http"
# Порт Docker-контейнера с gotosocial
localIP = "192.168.1.100"  # IP вашего NAS
localPort = 8080
customDomains = ["social.example.com"]

[log]
level = "info"
maxDays = 3

Шаг 4.2: Запуск через Docker Compose

Создайте docker-compose.yml в той же папке:

version: '3.8'

services:
  frpc:
    image: snowdreamtech/frpc:latest
    container_name: frpc
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./frpc.toml:/etc/frp/frpc.toml:ro
    command: ["-c", "/etc/frp/frpc.toml"]

Шаг 4.3: Альтернатива через Synology Docker UI

Если предпочитаете графический интерфейс:

  1. Откройте Docker в пакетах Synology
  2. Перейдите в Образ → Скачать → найдите snowdreamtech/frpc
  3. Создайте контейнер с параметрами:
    • Порты: используйте сеть хоста
    • Монтирование: /volume1/docker/frpc/frpc.toml → /etc/frp/frpc.toml
    • Команда: -c /etc/frp/frpc.toml

Шаг 5: Запуск сервисов

На VPS:

# Запуск FRP сервера
sudo systemctl enable frps
sudo systemctl start frps

# Запуск Caddy
sudo systemctl enable caddy
sudo systemctl start caddy

На Synology NAS:

# Переход в папку с конфигурацией
cd /volume1/docker/frpc/

# Запуск FRP клиента через Docker Compose
sudo docker-compose up -d

Шаг 6: Проверка работоспособности

# Проверка статуса сервисов
sudo systemctl status frps  # на VPS
sudo systemctl status caddy  # на VPS
sudo docker ps | grep frpc  # на Synology NAS

# Проверка портов
ss -tlnp | grep 7000  # FRP сервер
ss -tlnp | grep 8080  # FRP HTTP
ss -tlnp | grep 80    # Caddy HTTP
ss -tlnp | grep 443   # Caddy HTTPS

# Проверка доступности
curl -I https://social.example.com

Настройка systemd сервисов

Для автозапуска создайте файлы сервисов:

На VPS (/etc/systemd/system/frps.service):

[Unit]
Description=FRP Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target

На Synology NAS автозапуск обеспечивается через restart: unless-stopped в docker-compose.yml.

Если нужно создать задачу через Task Scheduler:

  1. Откройте Панель управления → Task Scheduler
  2. Создайте новую задачу:
    • Триггер: При загрузке
    • Команда: cd /volume1/docker/frpc && docker-compose up -d

Решение проблем и диагностика

Частые проблемы

1. FRP клиент не может подключиться к серверу:

  • Проверьте открыт ли порт 7000 на VPS: sudo ufw allow 7000
  • Убедитесь, что IP-адрес в конфиге frpc соответствует вашему VPS
  • Проверьте логи: sudo docker logs -f frpc

2. HTTPS не работает:

  • Убедитесь, что DNS A-запись указывает на IP вашего VPS
  • Откройте порты 80 и 443: sudo ufw allow 80 && sudo ufw allow 443
  • Проверьте логи Caddy: journalctl -u caddy -f

3. Сервис недоступен:

  • Проверьте, что локальный сервис работает: curl 192.168.1.100:8080 (замените IP на адрес вашего NAS)
  • Убедитесь, что порт в frpc.toml соответствует порту вашего сервиса

Команды для диагностики

# Проверка состояния сервисов
sudo systemctl status frps caddy  # на VPS
sudo docker ps | grep frpc  # на Synology NAS

# Просмотр логов
journalctl -u frps --since "1 hour ago"  # на VPS
sudo docker logs frpc  # на Synology NAS
journalctl -u caddy --since "1 hour ago"  # на VPS

# Проверка сетевых подключений
ss -tlnp | grep -E '(7000|8080|80|443)'

# Тест доступности
curl -v http://social.example.com
curl -v https://social.example.com

Альтернативные решения

Если FRP не подходит, рассмотрите:

  • Tailscale Funnel — простое решение для публикации сервисов, но домен будет уже не ваш
  • WireGuard — более безопасный, но сложнее в настройке
  • ngrok — коммерческое решение с простой настройкой
  • ZeroTier — альтернатива Tailscale

Практические рекомендации

Требования к VPS

Минимальные характеристики:

  • CPU: 1 ядро
  • RAM: 512 МБ (для Caddy + FRP)
  • Место на диске: 10 ГБ
  • Пропускная способность: зависит от трафика

Примерная стоимость в месяц:

  • VPS в Европе: $3-5
  • VPS в Азии: $2-4
  • Домен: $10-15 в год

Безопасность

Обязательные меры:

# Настройка firewall
sudo ufw enable
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 7000/tcp

# Обновление системы
sudo apt update && sudo apt upgrade -y

# Используйте ключи SSH вместо паролей
# Настройте fail2ban для защиты от брутфорса
sudo apt install fail2ban

Дополнительные рекомендации:

  • Используйте сильные токены для FRP аутентификации
  • Мониторьте логи сервера
  • Регулярно обновляйте FRP и Caddy

Сравнение подходов

КритерийCloudflare TunnelTailscale + CF TunnelFRP + Caddy
ЛатентностьСредняяВыше из-за двух туннелейМинимальная
ПростотаОчень простая настройкаСредняяПростая
КонтрольМинимальныйСреднийПолный
ЗависимостиCloudflareTailscale, VPS, CloudflareVPS

Заключение и рекомендации

Основные выводы

Переход с Cloudflare Tunnel на собственное решение FRP + Caddy показал ряд важных преимуществ:

  • Полная независимость от внешних сервисов и блокировок
  • Минимальная латентность за счёт прямого соединения
  • Полный контроль над конфигурацией и сертификатами
  • Минимальная стоимость — только VPS и домен

Когда стоит использовать каждое решение

Cloudflare Tunnel подходит, если:

  • Нужно быстро опубликовать сервис (минутная настройка)
  • Не важны зависимости от внешних сервисов
  • Нет ограничений на использование Cloudflare в регионе

Tailscale + Cloudflare Tunnel целесообразен, если:

  • Есть блокировки Cloudflare, но нужно оставить привычный инструмент
  • Нет жёстких требований к скорости и латентности
  • Важна простота настройки

FRP + Caddy лучший выбор, если:

  • Нужен полный контроль над системой
  • Важна минимальная латентность
  • Есть опыт администрирования Linux-систем
  • Необходима независимость от внешних сервисов

Персональный опыт

Промежуточное решение через Tailscale помогло обойти блокировки, но добавило сложности. FRP с Caddy оказался более простым и надёжным решением для долгосрочного использования.

Помните: лучшее решение — то, которое соответствует вашим конкретным потребностям и уровню экспертизы.