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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нужен одновременно быстрый доступ к российским ресурсам с российского адреса и зарубежный выход для всего остального - с одного подключения на клиенте. Российские сайты, которые не пускают иностранные IP, продолжают работать, зарубежные получают чистый выход, а всё решение принимается на сервере, одинаково для всех клиентов. Если хватает обычной установки на один сервер или раздельную маршрутизацию проще задать на клиенте - это не нужно. Каскад - для случая, когда деление должно жить на сервере.

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

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

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

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

Что такое каскад из двух серверов?
Это два сервера, соединённые в цепочку (иногда называют двойным VPN). Клиент подключается к серверу-входу, а тот пересылает часть трафика через второй сервер-выход. Здесь деление идёт по месту назначения: российские сети уходят напрямую с сервера-входа, остальное - через зарубежный выход.
Зачем отделять российский трафик от остального?
Чтобы российские сайты открывались с российского IP без крюка через заграницу и без отказа иностранным адресам, а зарубежные сайты шли через чистый зарубежный выход. И то и другое - с одного подключения на клиенте.
Нужна ли особая настройка на клиенте?
Нет. Деление целиком на сервере-входе. Клиенты добавляются как обычно и не требуют особой настройки - они просто подключаются к серверу-входу.
Каскад входит в установщик?
Нет. Каскад из нескольких серверов - это отдельная ручная настройка поверх двух обычных установок 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 для приёма. Низкая первая цифра при нормальной второй подтверждает, что душит участок между серверами, а не сами серверы.