# Ретрансляторы

> Маршрутизация трафика через внутренний сервер для устойчивости к блокировке IP.

## Что решают ретрансляторы

Когда IP вашего exit-сервера блокируется, клиенты теряют доступ. Узел-ретранслятор даёт им отечественную точку входа, которую сложнее блокировать:

```
Клиент → Ретранслятор (отечественный IP) → Exit-сервер (за границей) → Интернет
```

Цензоры видят трафик на отечественный IP. Ретранслятор пересылает чистый TCP на exit-сервер — всё шифрование end-to-end между клиентом и exit-сервером. Ретранслятор никогда не видит открытый текст.

## Как работают ретрансляторы

Ретранслятор использует [Realm](https://github.com/zhboner/realm) — лёгкий TCP-forwarder с нулевым копированием (~5МБ бинарный файл Rust). Он слушает порт 443 (настраивается) и пересылает весь трафик на порт 443 exit-сервера. Нет Docker, нет VPN-ПО, нет управляющей панели.

Все протоколы работают через ретранслятор:
- **Reality** — end-to-end handshake, ретранслятор полностью прозрачен
- **XHTTP** — маршрутизация через ретранслятор с явным параметром `sni=`
- **WSS** — режим домена, маршрутизация с `sni=domain&host=domain`

## Развёртывание ретранслятора

Сначала разверните exit-сервер нормально. Затем разверните ретранслятор, указав на него:

```bash
meridian relay deploy RELAY_IP --exit EXIT_IP
```

Provisioner:
1. Устанавливает требуемые пакеты и включает BBR
2. Настраивает firewall UFW (разрешение SSH + порт ретранслятора)
3. Загружает бинарный файл Realm (версия закреплена, SHA256-проверен)
4. Пишет конфиг Realm и запускает systemd-сервис
5. Проверяет связь ретранслятор → exit

### Флаги

| Флаг | По умолчанию | Описание |
|------|---------|-------------|
| `--exit/-e EXIT` | (требуется) | IP или имя exit-сервера |
| `--name NAME` | (авто) | Дружественное имя ретранслятора (например, `ru-moscow`) |
| `--port/-p PORT` | 443 | Порт прослушивания на ретрансляторе |
| `--user/-u USER` | root | SSH-пользователь на ретрансляторе |
| `--yes/-y` | | Пропустить подтверждающие подсказки |

### Пример со всеми параметрами

```bash
meridian relay deploy 10.0.0.5 --exit 1.2.3.4 --name ru-moscow --port 443 --user ubuntu
```

## Как подключаются клиенты

После развёртывания ретранслятора все существующие страницы подключения клиентов **автоматически переиспользуются**. URL-адреса ретрансляторов показаны как рекомендуемое подключение, прямые URL-адреса — как резервные.

Когда вы добавляете новых клиентов, URL-адреса ретранслятора включаются автоматически:

```bash
meridian client add alice --server 1.2.3.4   # URL-адреса ретранслятора включены
```

## Управление ретрансляторами

```bash
meridian relay list                    # все ретрансляторы на всех exit-серверах
meridian relay list --exit 1.2.3.4     # ретрансляторы для конкретного exit
meridian relay check RELAY_IP          # 4-точечная проверка здоровья
meridian relay remove RELAY_IP         # остановить сервис + удалить из конфига
```

### Проверка здоровья

`meridian relay check` тестирует четыре вещи:

| Проверка | Что тестируется |
|-------|---------------|
| SSH к ретранслятору | Можно ли подключиться к серверу ретранслятора? |
| Сервис Realm | Активен ли systemd-сервис? |
| Ретранслятор → exit TCP | Может ли ретранслятор достичь exit-сервера на порту 443? |
| Локально → ретранслятор TCP | Может ли ваша машина достичь ретранслятора на его порту прослушивания? |

### Удаление ретранслятора

```bash
meridian relay remove RELAY_IP [--exit EXIT_IP] [--yes]
```

Это остановит сервис Realm, удалит ретранслятор из учётных данных exit-сервера и переиспользует все страницы подключения клиентов (обратно только на прямые URL-адреса).

## Несколько ретрансляторов

Вы можете присоединить несколько ретрансляторов к одному exit-серверу — например, ретрансляторы в разных городах или ISP:

```bash
meridian relay deploy 10.0.0.5 --exit 1.2.3.4 --name ru-moscow
meridian relay deploy 10.0.0.6 --exit 1.2.3.4 --name ru-spb
```

Клиенты видят все варианты ретрансляторов на своей странице подключения.

## Решение проблем

### Конфликт портов

Другой сервис использует порт 443 на ретрансляторе. Проверьте с помощью `ss -tlnp sport = :443` и остановите конфликтующий сервис, или используйте другой порт с `--port 8443`.

### Блокирование firewall

Убедитесь, что порт 443 открыт на firewall облачного провайдера ретранслятора / группе безопасности, не только в UFW.

### Exit-сервер недостижим

Ретранслятор должен быть способен достичь exit-сервера на порту 443. Тестируйте с `curl -I https://EXIT_IP` из ретранслятора, или запустите `meridian relay check`.

### Сервис ретранслятора не запущен

Проверьте сервис Realm: `systemctl status meridian-relay`. Посмотрите логи: `journalctl -u meridian-relay --no-pager -n 20`.
