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


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

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

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

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

---

## Введение

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

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

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

---

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

- **Сервер**: Synology NAS с установленным [gotosocial](https://gotosocial.org/).  
- **Доступ**: через Cloudflare Tunnel, без проброса портов.  
- **Проблема**: блокировка Cloudflare в России привела к полной потере возможности подключаться к сервису извне.  

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

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

---

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

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

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

**Плюсы**:

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

**Минусы**:

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

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

```plain
[Браузер] → [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.

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

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

---

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

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

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

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

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

```bash
# Скачивание 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`:

```toml
bindPort = 7000
vhostHTTPPort = 8080

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

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

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

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

```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`:

```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` в той же папке:

```yaml
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:

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

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

На Synology NAS:

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

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

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

```bash
# Проверка статуса сервисов
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`):

```ini
[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 соответствует порту вашего сервиса

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

```bash
# Проверка состояния сервисов
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 в год

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

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

```bash
# Настройка 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 оказался более простым и надёжным решением для долгосрочного использования.

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

