Каскад из двух серверов: российский трафик напрямую, остальное за границу

Каскад (двойной VPN) связывает два сервера AmneziaWG в цепочку. Клиент подключается к серверу-входу; российский трафик уходит напрямую с него, а остальное - через второй сервер за границей. Деление на стороне сервера, на клиенте ничего особого настраивать не нужно.

Два VPS: один в России, второй за границей На обоих уже стоит amneziawg-installer У обоих реальный публичный IP, не за NAT

Как это работает

Одно подключение клиента, два сервера, трафик делится по месту назначения.

Клиент одно подключение Сервер-вход в России, держит сплит сети РФ, напрямую Российские сайты видят российский IP всё остальное Сервер-выход за границей Зарубежные чистый IP
Одно подключение клиента. Сервер-вход отправляет российский трафик напрямую, а остальное - через зарубежный выход.

Сервер-вход (в России)

Сюда подключаются клиенты. Этот сервер решает, куда направить каждый поток, и держит всю логику каскада. Российские сайты идут напрямую с его IP, поэтому открываются быстро и принимают подключение.

Сервер-выход (за границей)

Обычный сервер AmneziaWG за границей. Сервер-вход подключается к нему как клиент и пересылает всё, что не относится к российским сетям, - зарубежные сайты видят чистый зарубежный IP.

Деление по назначению

Список российских сетей загружается в ipset. Трафик к этим адресам идёт напрямую, остальной помечается и уходит через выход. Без правил под каждое приложение и без списков на клиенте.

Когда это полезно

Обычный VPN гонит весь трафик через один выход. Каскад даёт сразу два.

Нужен одновременно быстрый доступ к российским ресурсам с российского адреса и зарубежный выход для всего остального - с одного подключения на клиенте. Так выглядит впн наоборот: не спрятать российский адрес, а показать его российским сайтам, оставив зарубежным чистый иностранный выход. Российские сайты перестают видеть иностранный адрес: трафик к ним уходит с адреса российского сервера. Мешает такой адрес чаще всего банковским приложениям и оплате, Госуслугам и налоговой, маркетплейсам. Одну оговорку стоит знать сразу: страну каскад меняет, а признак дата-центра у российского VPS остаётся почти всегда - по моему замеру 77 диапазонов из 78 помечены хотя бы одной геобазой. Сервис, который смотрит на тип хостинга, а не на страну, может по-прежнему просить подтверждение. Зарубежные сайты при этом получают свой выход, а всё решение принимается на сервере, одинаково для всех клиентов. Если хватает обычной установки на один сервер или раздельную маршрутизацию проще задать на клиенте - это не нужно. Каскад - для случая, когда деление должно жить на сервере.

На проверенной основе

Инструкция не набросок - маршрутизацию проверили вживую.

Маршрутизацию проверяли на живом стенде из двух серверов: и сам сплит, и повторные запуски скрипта, и восстановление после ребута. В инструкции лежит идемпотентный скрипт маршрутизации и systemd-юнит, чтобы деление поднималось само. Схему предложил @glfenix в обсуждении сообщества, а пошаговая инструкция лежит в репозитории.

Частые вопросы

Что такое каскад из двух серверов?
Это два сервера, соединённые в цепочку (иногда называют двойным VPN). Клиент подключается к серверу-входу, а тот пересылает часть трафика через второй сервер-выход. Здесь деление идёт по месту назначения: российские сети уходят напрямую с сервера-входа, остальное - через зарубежный выход.
Зачем отделять российский трафик от остального?
Чтобы российские сайты открывались с российского IP без крюка через заграницу и без отказа иностранным адресам, а зарубежные сайты шли через чистый зарубежный выход. И то и другое - с одного подключения на клиенте.
Это впн с русскими серверами?
Да, если понимать под этим VPN, у которого есть выход через сервер в России. В каскаде серверов два: российский принимает подключение и отдаёт российским сайтам свой российский адрес, зарубежный уводит остальной трафик. Схема с одним сервером и Cloudflare WARP обходится дешевле, но российского адреса не даёт - сайт увидит адрес Cloudflare.
Это впн наоборот - когда нужен российский IP, а не зарубежный?
Да, если понимать под этим VPN, который отдаёт сайту российский адрес вместо иностранного. Обычный VPN уводит весь трафик за границу, и российские сервисы видят чужую страну; каскад разворачивает наоборот только часть - к российским сетям трафик уходит с адреса сервера-входа в России, а всё остальное через зарубежный выход. Если зарубежный выход не нужен совсем, второй сервер держать незачем: хватит одной обычной установки на российском VPS.
Нужна ли особая настройка на клиенте?
Нет, деление целиком на сервере-входе. Клиенты добавляются как обычно и не требуют особой настройки - они просто подключаются к серверу-входу.
Каскад входит в установщик?
Нет, каскад из нескольких серверов - это отдельная ручная настройка поверх двух обычных установок amneziawg-installer. Есть пошаговая инструкция с проверенным скриптом маршрутизации и systemd-юнитом для автозапуска после перезагрузки.
Откуда берётся список российских сетей?
Из агрегированной зоны российских IP (ipdeny), загружается в ipset. Трафик к этим сетям идёт напрямую, остальное помечается и уходит через зарубежный выход. Список периодически обновляется.
Почему YouTube тормозит, а Google Play не работает в каскаде?
Часть узлов Google и YouTube (их кэши и CDN) размещена на российских IP и попадает в список российских сетей, поэтому соединение с ними уходит напрямую через сервер-вход, и Google видит российский адрес. Подмена DNS надёжно не помогает: сети Google во многом общие. Чтобы Google и YouTube всегда шли через зарубежный выход, их сети (не только AS15169 - кэш-узлы GGC часто лежат в сетях провайдеров) нужно пометить до правила RETURN или исключить из списка российских сетей.
Почему отдача намного ниже приёма?
Если приём идёт нормально, а отдача почти в ноль, дело обычно не в MTU (он режет сегменты в обе стороны, тогда страдал бы и приём) и не в процессоре (он бы просадил обе стороны разом). Живой приём доказывает, что сервер-вход отдаёт клиенту на скорости; узкое место - плечо от сервера-входа к серверу-выходу, по которому уходит отдача наружу. Кандидаты: шейпинг исходящего у хостера входа, кривой пиринг до сети выхода или входной лимит на самом выходе. Замерьте это плечо напрямую: на сервере-выходе запустите iperf3 -s, со входа - iperf3 -c IP-выхода для отдачи и iperf3 -c IP-выхода -R для приёма. Низкая первая цифра при нормальной второй подтверждает, что душит участок между серверами, а не сами серверы.