Перейти к содержимому

Серверный роутинг (мост)

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

  • Два направления. Русские и зарубежные сайты видят разные IP, и вы выбираете, какой адрес видит каждая сторона.
  • Транспорт Shadowsocks. Один туннель chacha20-ietf-poly1305 между серверами, весь трафик, включая UDP.
  • Всё через панель. Профили, сквады и служебный пользователь создаются автоматически через API.
  • Нода не нужна заранее. Скрипт поставит её сам по SSH, вместе с Docker и портом в ufw.
  • Второй тип моста: VLESS Route. Каждый пользователь сам выбирает выход: у профиля появляется дополнительный хост в подписке.

Пункт находится в меню скрипта: 4. Расширения ноды → Серверный роутинг. Внутри выбирается тип: «Мост через Shadowsocks» (разделение по странам, описан ниже) или «Мост через VLESS Route» (свой выход для каждого, отдельный раздел). Нужна панель на этой машине и вторая машина.

пользователь → входная нода ─┬─ RU-сайты и IP → напрямую (IP входа)
└─ остальное → SS-туннель → машина выхода

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

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

Режим «Через мост». Зарубежные сайты видят чистый иностранный IP входа, а русские сервисы получают родной российский адрес машины выхода. Капч «вы заходите из-за границы» на русских сервисах нет.

Сервис Видит IP
yandex.ru/internet и RU-сайты машину выхода
ifconfig.me и зарубежные входную ноду

Режим можно поменять в любой момент одним прогоном «Настроить заново», и направление переключится без переустановки: объекты переиспользуются.

  1. Машина выхода. Выбирается из машин с настроенным SSH-доступом (или вводится адрес вручную, и тогда скрипт сам предложит настроить доступ).
  2. Порт моста. По умолчанию 9999, EnterEnterEnter оставит его.
  3. Направление трафика. Таблица выше.
  4. Название моста. Одно имя для всех объектов в панели, EnterEnterEnter подставит название SSH-машины: сквад Kazan bridge, служебный пользователь bridge-kazan, нода и профиль Kazan-bridge.
  5. Нода на второй машине. Если её там нет, скрипт предложит установить всё удалённо: Docker (с зеркалами на случай блокировок), контейнер ноды, регистрацию в панели и открытие порта в ufw. Машине выхода не нужны ни домен, ни сертификаты: она просто слушает порт и завершает туннель.
  6. Профиль входной ноды. В него добавляется исходящий и правила. Позже можно подключить ещё профили, например когда появится вторая входная нода.

В конце мастер настройки проверяет связность живьём: подключена ли нода к панели, отвечает ли порт моста, и напоминает, как проверить результат с клиента.

Под капотом: правила в профиле

В режим «Через мост» в конфиг профиля добавляется исходящий и такие правила:

{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" },
{ "ip": ["geoip:ru"], "outboundTag": "SR_BRIDGE_SS" },
{ "domain": ["geosite:category-ru"], "outboundTag": "SR_BRIDGE_SS" }

В режиме «Напрямую со входной ноды» у geoip:ru и geosite:category-ru меняется outboundTag на DIRECT, и добавляется замыкающее правило: весь остальной трафик профиля уходит в SR_BRIDGE_SS. При расширенных RU-списках в конец добавляется ещё одно правило с ext:geosite-ruex.dat:ru-available-only-inside, ему всегда назначается мост.

Серверный роутинг → Kazan
Серверный роутинг (мост): Kazan
Мост: 203.0.113.20:9999
Нода 203.0.113.20 подключена к панели
Порт 9999 отвечает с этой машины
1. Подключить ещё профиль
входная нода этого профиля пойдёт через тот же выход
2. RU-списки: расширенные (вернуть стандартные)
переключатель общий для всех мостов; файл списков ставится на входные ноды
3. Настроить заново
полная настройка с самого начала: машина выхода, порт, режим, профиль
4. Переименовать мост
новое имя получат сквад, пользователь, нода и профиль
5. Убрать роутинг
профили вернут прямой выход; нода и профиль моста останутся

Мостов может быть несколько: каждое со своей машиной выхода, своими объектами в панели и своими подключёнными профилями. Если профиль уже занят другим мостом, скрипт предупредит и предложит перепривязать.

Мост по странам решает за всех: направление одно на весь профиль. Второй тип отдаёт выбор пользователю. У профиля появляется дополнительный хост в подписке, например «Germany → Moscow», и выбрав его, пользователь целиком выходит через машину моста: и русские, и зарубежные сайты видят её IP. Обычный хост работает как раньше.

Хост в подписке RU-сайты видят Зарубежные видят
Germany (обычный) по общим правилам профиля по общим правилам профиля
Germany → Moscow IP машины моста IP машины моста

Хосты переключаются в клиенте в любой момент, без переустановки и второй подписки: телефон может жить на «Germany → Moscow» ради банков, а компьютер на обычном «Germany».

Номер маршрута это штатное поле хоста в панели (vlessRouteId). Панель вшивает число в UUID ссылки, входная нода читает его и отправляет соединение через нужный исходящий. Пользователь ничего не настраивает: просто выбирает хост с понятным названием.

  • Линия на каждый выход. Сколько машин выхода, столько линий, у каждой свой номер маршрута и своя статистика у сервисного пользователя в панели.
  • Переиспользование выхода. Вторая линия на тот же выход создаётся без новой машины: тот же туннель, свой сервисный пользователь и свой учёт трафика.
  • Несколько входов. Пункт «Подключить ещё профиль» добавляет хост «его вход → этот выход» на второй входной ноде тем же номером маршрута.
  • Гео не мешает. Правила маршрутов стоят выше гео-правил: назначенный пользователь уезжает на свой выход целиком, остальные живут по общим правилам.
Под капотом: правила и UUID

В профиль входной ноды добавляются исходящий и правила с номерами маршрутов:

{ "vlessRoute": 1, "outboundTag": "DIRECT" },
{ "vlessRoute": 2, "outboundTag": "SR_BRIDGE_SS_kazan" }

Маршрут 1 служебный: прямой выход со входной ноды, хост для него создаётся, только если профиль уже разделён по странам. Номер живёт в третьей группе UUID: пользователь 9d5f42a1-7b3c-4d8e-… на маршруте 2 получает ссылку с 9d5f42a1-7b3c-0002-…, и именно эту пару байтов нода читает как номер.

  1. Машина выхода. Новая машина по SSH или строка «Выход моста …» из уже настроенных: та же линия, свой сервисный пользователь.
  2. Порт и название. По умолчанию 9999 и имя SSH-машины, EnterEnterEnter оставит оба.
  3. Профиль входной ноды. Только VLESS: маршрут ездит в UUID ссылки, у Trojan и Shadowsocks его нет. Профили, уже занятые другими мостами, помечаются в списке.
  4. Номер маршрута. Свободный номер предлагается сам, занятые не предложат.
  5. Название хоста. По умолчанию «вход → выход», например «Germany → Moscow».

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

Серверный роутинг → Мосты через VLESS Route → Kazan
Мост через VLESS Route: Kazan (маршрут 2)
Мост: 203.0.113.20:9999
Нода 203.0.113.20 подключена к панели
Порт 9999 отвечает с этой машины
Хост в подписке: Germany → Kazan
1. Скрыть хост из подписок
2. Подключить ещё профиль
3. Настроить заново
4. Переименовать мост
5. Убрать роутинг

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

Стандартное правило geosite:category-ru покрывает все домены в зонах .ru, .su, .рф и именные списки. Но русские сервисы, живущие на иностранных доменах, в него не попадают и остаются не у дел.

Пункт «RU-списки» подключает списки проекта runetfreedom, обновляемые ежедневно. Добавляется одно правило для доменов, доступных только изнутри России (ext:ru-available-only-inside):

  • Ничего не заменяется. Стандартные правила остаются как есть, новое правило добавляется поверх.
  • Всегда российский выход. Доменам из списка обеспечен выход через РФ в любом режиме работы моста.
  • Ставится на входные ноды. Решения о маршрутизации принимает входная нода, туда и ложится файл списков, отдельно от штатных геоданных Xray.
  • Обновляется само. Каждый день в 4:30 свежая версия списков скачивается с зеркал и проверяется по контрольной сумме. Ноды перезапускаются только если файл изменился.
Под капотом: файлы и cron
  • Директория/usr/local/remnawave_reverse
    • Директорияserver-routing
      • kazan.bridge (мост: машина, порт, режим, объекты панели)
      • ruex.state (состояние расширенных списков)
      • ruex-update.sh (ежедневный обновлятор)
      • ruex-update.log (последние 50 строк журнала)

Строка в crontab -l выглядит так: 30 4 * * * bash /usr/local/remnawave_reverse/server-routing/ruex-update.sh. Обновлятор скачивает датник с четырёх зеркал, сверяет sha256 и раскладывает файл на входные ноды; рестарт нод вызывается через API панели и только при реальном изменении файла.

Подключитесь пользователем из обычного сквада (где входная нода) и откройте два сайта:

yandex.ru/internet покажет IP входной ноды, ifconfig.me покажет IP машины выхода.

«Убрать роутинг» возвращает профилям прямой выход, удаляет служебного пользователя и сквад, закрывает порт в ufw на второй машине. Нода и профиль моста остаются, они больше ничего не маршрутизируют, и их можно удалить в панели вручную, если они не нужны.