# Узлы ретранслятора

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

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

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

```
Клиент → Ретранслятор (отечественный IP) → Сервер выхода (за границей) → Internet
```

Цензоры видят трафик к отечественному IP. Ретранслятор пересылает необработанный TCP выходу; шифрование от конца к концу между клиентом и выходом, поэтому ретранслятор никогда не видит открытый текст.

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

Ретранслятор запускает [Realm](https://github.com/zhboner/realm), маленький TCP форвардер с нулевым копированием. Он слушает на портс 443 (конфигурируется) и пересылает слушателю Reality выхода. Нет Docker и нет панели работающей на ретрансляторе.

Ретрансляторы несут трафик **Reality**. XHTTP, WSS и Hysteria2 остаются на собственном адресе и домене выхода и остаются в той же подписке как альтернативы.

## Развернуть ретранслятор

Разверните выход сначала, затем укажите ретранслятор на него:

```bash
meridian relay add 203.0.113.10 --exit 198.51.100.10
```

Meridian добавляет ретранслятор в вашу топологию и применяет её:
1. Подготавливает сервер ретранслятора (пакеты, BBR, затвердевание SSH, брандмауэр, который открывает только SSH и портс ретранслятора)
2. Устанавливает Realm (версия-закреплена, SHA256-проверена) как сервис systemd
3. Указывает ретранслятор на слушатель Reality выхода
4. Публикует ретранслятор в подписке каждого клиента

### Флаги

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

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

```bash
meridian relay add 203.0.113.10 --exit 198.51.100.10 --name ru-moscow \
  --port 443 --sni dl.google.com --user ubuntu --ssh-port 2222 --yes
```

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

Существующие клиенты получают ретранслятор при следующем обновлении подписки, и их страницы подключения перечисляют его. Новые клиенты получают его автоматически:

```bash
meridian client add alice   # ретранслятор включен
```

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

```bash
meridian relay list                       # все ретрансляторы
meridian relay list --exit 198.51.100.10  # ретрансляторы для одного выхода
```

Проверьте хопы ретранслятора — каждый сервис Realm запущен, каждый хоп достигает следующего, и публичный вход принимает соединения — затем протестируйте реальный трафик через весь маршрут:

```bash
meridian check 203.0.113.10
meridian test
```

Check также измеряет каждый хоп: из каждого хопа это загружает сайт маскировки выхода через следующий хоп, отправляя тот же SNI который клиенты отправляют, и сообщает время подключения, время до первого байта и сколько байт пришло. Передача которая замёрзает между примерно 8 и 32 КБ это подпись дросселирования на том хопе и сообщается как предупреждение; обычное исправление это хост ретранслятора у другого провайдера (другая сеть или ASN). Если домашняя страница сайта маскировки меньше чем 32 КБ, проверка хопа неубедительна вместо прохождения.

Чтобы вывести ретранслятор из эксплуатации, удалите цепи через него. Meridian показывает то, что будет удалено, запрашивает подтверждение и очищает сервис Realm, правила брандмауэра и опубликованные точки входа; существующие клиенты теряют ретранслятор при следующем обновлении подписки:

```bash
meridian relay remove 203.0.113.10
```

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

Присоедините несколько ретрансляторов к одному выходу, например в разных городах или сетях:

```bash
meridian relay add 203.0.113.10 --exit 198.51.100.10 --name ru-moscow
meridian relay add 203.0.113.11 --exit 198.51.100.10 --name ru-spb
```

Клиенты получают каждый ретранслятор в их подписке. Для цепей ретранслятора с более чем одним каналом используйте `meridian setup`.

## Белые списки мобильных операторов

Во время некоторых ограничений мобильного интернета в России операторы пропускают только утверждённый список сайтов и адресов. Отчёты варьируются по оператору, региону и неделе, и ни один оператор не опубликовывает свой список. Meridian не обнаруживает или отслеживает белые списки; этот раздел охватывает что вы можете установить сегодня и что остаётся ручным.

### Что развёртыватели сообщают

- **Сети отличаются.** Некоторые, похоже, смотрят только на имя сервера (SNI) которое подключение объявляет. Другие также проверяют IP адрес назначения. Где только имя проверяется, прямой путь Reality с разрешённым именем может пройти. Где IP также проверяется, первый хоп должен быть адресом на списке.
- **Адреса облака отечественных провайдеров обычно первый хоп.** Не каждый адрес от провайдера в списке: люди описывают одну подсеть диапазона провайдера быть разрешённой пока другая из того же провайдера не является. Провайдеры могут также ограничить приватных клиентов, ограничить как часто вы можете пересоздать сервер или дротель пропускную способность.
- **Иностранные CDN адреса обычно не разрешены на мобильных сетях.** Относитесь к [режиму домена](/ru/domain-mode.md) через Cloudflare как резервный для домашних подключений, не как ответ белого списка.
- **Ссылка ретранслятора на выход может быть нарушена тоже.** Ретранслятор который достигает пользователей может всё ещё потерять его подключение к иностранному выходу.

### Ретранслятор на разрешённом адресе

Арендуйте маленький сервер на отечественном провайдере чей адрес разрешён на мобильных сетях ваших пользователей. Списки разрешённых диапазонов поддерживаемые сообществом существуют, но только тест с мобильного подключения пока ограничения активны доказывает это. Затем добавьте его как ретранслятор и дайте ему разрешённое имя:

```bash
meridian relay add 203.0.113.10 --exit 198.51.100.10 --name ru-mobile --sni allowed.example.com
```

С `--sni`, только этот вход ретранслятора в подписке объявляет то имя. Meridian добавляет имя в слушатель Reality выхода (те же ключи) и даёт ретранслятору его собственный слушатель на выходе. Он маршрутизирует только то имя в Reality, отправляет всё остальное в сайт маскировки и достижим только с последнего хопа ретранслятора. Собственная цель маскировки выхода и его другие записи не меняются. Имя не должно быть достижимо с выхода, потому что выход всё ещё представляет свою собственную цель маскировки. Зондировщик который достигает ретранслятора без действительного ключа поэтому переправлен на ту цель вместо получения ответа прокси.

Затем проверьте ретранслятор и тестируйте с сети которая имеет значение:

```bash
meridian check 203.0.113.10
meridian test
```

`meridian test` с вашей собственной машины не может сказать вам что разрешённая мобильная сеть пропускает. Попробуйте это на реальном устройстве на той сети.

### Выберите SNI выхода

`--sni` на `meridian deploy` и `meridian node add` установлено цель маскировки для прямого пути Reality выхода. Цель должна быть сайтом который выход может достичь с TLS 1.3, и deploy проверяет реальный трафик через это и останавливается если ничего не проходит. Перед разворачиванием проверьте кандидата с `meridian check IP --sni HOST`. На сети которая проверяет только имена, разрешённое имя может позволить прямому пути пройти, но будто имя работает зависит от оператора, поэтому тестируйте каждое.

### Что Meridian не делает

- Это не говорит вам либо ретранслятор IP на каком-либо списке оператора или ограничения активны.
- Это не устанавливает фронтирование через облако отечественного CDN. Режим домена построен и протестирован для Cloudflare.
- Ретранслятор несёт только Reality. XHTTP, WSS и Hysteria2 остаются на выходе.
- Это не туннель через третью сторону вызывает или сервисы сообщений.

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

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

Другой сервис использует портс слушания на ретрансляторе. Проверьте с `ss -tlnp sport = :443` и остановите его или выберите другой портс с `--port 8443`.

### Блокировка брандмауэра

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

### Выход недостижим

Ретранслятор должен достичь портс Reality выхода. Запустите `meridian test` для проверки маршрута от конца к концу и `meridian check EXIT` для проверки выхода самого.

### Сервис ретранслятора не работает

На сервере ретранслятора, выведите сервисы форвардера и прочитайте их логи. Хосты ретранслятора используют нейтральные имена (модули `netfwd-*`, конфиги `/etc/netfwd/`) так ничего на них не называет Meridian, Realm или ретранслятор:

```bash
systemctl list-units 'netfwd-*'
journalctl -u 'netfwd-*' --no-pager -n 20
```
