Миграция с 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).
Теперь схема стала проще и прозрачнее:
На удалённом VPS:
- Запущен
frps(FRP Server). - Запущен Caddy как веб-сервер и обратный прокси:
- Принимает входящие HTTP/HTTPS-запросы.
- Раздаёт статический контент.
- Обеспечивает работу с SSL-сертификатами через Let’s Encrypt.
- Запущен
Дома:
- На NAS запущен
frpc(FRP Client). - Пробрасывает нужные порты для gotosocial на VPS.
- На NAS запущен
Схема работы:
[Браузер] → [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
Если предпочитаете графический интерфейс:
- Откройте Docker в пакетах Synology
- Перейдите в Образ → Скачать → найдите
snowdreamtech/frpc - Создайте контейнер с параметрами:
- Порты: используйте сеть хоста
- Монтирование:
/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:
- Откройте Панель управления → Task Scheduler
- Создайте новую задачу:
- Триггер: При загрузке
- Команда:
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 Tunnel | Tailscale + CF Tunnel | FRP + Caddy |
|---|---|---|---|
| Латентность | Средняя | Выше из-за двух туннелей | Минимальная |
| Простота | Очень простая настройка | Средняя | Простая |
| Контроль | Минимальный | Средний | Полный |
| Зависимости | Cloudflare | Tailscale, VPS, Cloudflare | VPS |
Заключение и рекомендации
Основные выводы
Переход с Cloudflare Tunnel на собственное решение FRP + Caddy показал ряд важных преимуществ:
- Полная независимость от внешних сервисов и блокировок
- Минимальная латентность за счёт прямого соединения
- Полный контроль над конфигурацией и сертификатами
- Минимальная стоимость — только VPS и домен
Когда стоит использовать каждое решение
Cloudflare Tunnel подходит, если:
- Нужно быстро опубликовать сервис (минутная настройка)
- Не важны зависимости от внешних сервисов
- Нет ограничений на использование Cloudflare в регионе
Tailscale + Cloudflare Tunnel целесообразен, если:
- Есть блокировки Cloudflare, но нужно оставить привычный инструмент
- Нет жёстких требований к скорости и латентности
- Важна простота настройки
FRP + Caddy лучший выбор, если:
- Нужен полный контроль над системой
- Важна минимальная латентность
- Есть опыт администрирования Linux-систем
- Необходима независимость от внешних сервисов
Персональный опыт
Промежуточное решение через Tailscale помогло обойти блокировки, но добавило сложности. FRP с Caddy оказался более простым и надёжным решением для долгосрочного использования.
Помните: лучшее решение — то, которое соответствует вашим конкретным потребностям и уровню экспертизы.