Что такое каскадный VPN и зачем он нужен
Каскадный VPN, который также называют двойным VPN или multihop, — это схема, в которой трафик проходит через два сервера, соединённых в цепочку. В классическом варианте клиент подключается к первому серверу (вход), а тот передаёт весь трафик второму серверу (выход), который уже отправляет его в интернет. Такая схема повышает приватность, так как ни один из серверов не видит полную картину: вход знает только реальный IP клиента, а выход — только IP входа.
Однако в контексте российских пользователей каскад на AmneziaWG решает другую, более практичную задачу. Многие российские сайты и сервисы — банки, Госуслуги, налоговая, маркетплейсы — блокируют или ограничивают доступ с иностранных IP-адресов. Если использовать обычный VPN с зарубежным сервером, такие ресурсы либо не открываются вовсе, либо открываются с ошибками и постоянными проверками. Каскад из двух серверов позволяет разделить трафик: российские сайты открываются напрямую с российского сервера-входа, а все остальные — через зарубежный сервер-выход. При этом клиент использует одно подключение, и никакой дополнительной настройки на его стороне не требуется.
Такое решение называют «VPN наоборот»: вместо того чтобы скрывать российский IP от зарубежных сайтов, он показывает российский IP российским сервисам, а зарубежным — чистый иностранный адрес. Это удобно, когда нужно одновременно пользоваться и российскими, и зарубежными ресурсами без переключения между разными VPN-подключениями.
Как работает каскад на AmneziaWG: разделение трафика на сервере
В каскаде на AmneziaWG используется два сервера: сервер-вход и сервер-выход. Сервер-вход расположен в России или в непосредственной близости, к нему подключаются клиенты. Сервер-выход — обычный зарубежный VPS. Сервер-вход подключается к серверу-выходу как обычный клиент AmneziaWG, создавая между ними зашифрованный туннель.
Вся логика разделения трафика реализована на сервере-входе. Для этого используется список российских IP-сетей, который загружается из открытой базы ipdeny и помещается в ipset. Когда пакет от клиента приходит на сервер-вход, он проверяет адрес назначения: если адрес принадлежит российской сети, пакет отправляется в интернет напрямую с IP сервера-входа. Если адрес иностранный, пакет помечается специальной меткой (fwmark) и направляется через туннель на сервер-выход, который уже отправляет его в интернет со своего IP.
Такая схема называется серверным сплит-туннелингом. В отличие от клиентского сплит-туннелинга, где правила задаются на устройстве пользователя, здесь всё управляется централизованно. Клиенты добавляются на сервер-вход стандартным способом, и им не нужно ничего настраивать — они просто подключаются и получают раздельный выход автоматически.
Требования к серверам и подготовка
Для сборки каскада понадобятся два VPS-сервера с чистой операционной системой Debian 12/13 или Ubuntu 24.04/25.10. На обоих должен быть root-доступ. Важное условие — реальный публичный IP-адрес на каждом сервере. Сервер за провайдерским NAT (CGNAT) не подойдёт для роли входа, так как снаружи он будет недоступен. Проверить это просто: выполните curl -s ifconfig.me и сравните вывод с адресом на сетевом интерфейсе (ip -4 addr). Если адреса совпадают — сервер имеет публичный IP.
Отдельный случай — хостинг Hetzner, где публичный IP может быть выдан как /32, а шлюз по умолчанию лежит вне подсети сервера. В этом случае ядро может отвергать маршруты, но современная версия скрипта маршрутизации автоматически добавляет флаг onlink, что решает проблему.
Также важно, чтобы IPv6 был отключён на обоих серверах. Установщик AmneziaWG делает это по умолчанию, но если IPv6 включён, трафик IPv6 пойдёт в обход разделения, и схема не будет работать корректно. Убедитесь, что IPv6 отключён, или отключите его вручную.
Подсети серверов должны различаться, чтобы избежать конфликтов маршрутизации. Например, для входа можно использовать подсеть 172.16.17.1/24, а для выхода — 172.16.61.1/24.
Пошаговая установка: базовые серверы AmneziaWG
Установка каскада начинается с развёртывания двух обычных серверов AmneziaWG с помощью установщика amneziawg-installer. Этот установщик настраивает AmneziaWG 2.0 с обфускацией и сразу поднимает файрвол и NAT.
На сервере-выходе (за границей) выполните:
bash install_amneziawg.sh --yes --disallow-ipv6 --route-all --subnet=172.16.61.1/24На сервере-входе (в России или рядом) выполните:
bash install_amneziawg.sh --yes --disallow-ipv6 --route-all --subnet=172.16.17.1/24Установщик сам настраивает пересылку и NAT, поэтому серверные конфиги дальше править не нужно. На сервере-входе дополнительно установите пакеты curl и ipset, если их нет:
apt update && apt install -y curl ipsetПосле установки на обоих серверах будут созданы конфигурационные файлы и скрипты управления клиентами. Сервер-вход будет принимать подключения клиентов, а сервер-выход — использоваться как конечная точка для зарубежного трафика.
Настройка туннеля между серверами
Следующий шаг — настроить туннель между сервером-входом и сервером-выходом. Сервер-вход будет подключаться к выходу как обычный клиент. Для этого на сервере-выходе создайте клиента с именем, например, ru_host:
bash /root/awg/manage_amneziawg.sh add ru_hostПосле выполнения команды будет создан файл /root/awg/ru_host.conf. Скопируйте его на сервер-вход любым способом (scp, буфер обмена). Внутри конфига находится Endpoint — внешний IP сервера-выхода, и AllowedIPs = 0.0.0.0/0. Запомните Endpoint, он понадобится для скрипта маршрутизации.
На сервере-входе разместите этот конфиг как /etc/amnezia/amneziawg/awg1.conf и внесите два изменения:
- В секцию
[Interface]добавьтеTable = off, чтобы awg-quick не прописывал маршруты самостоятельно — маршрутизацией займётся скрипт. - Удалите строку
DNS = ..., так как на сервере DNS не нужен.
Затем установите права и запустите туннель:
chmod 600 /etc/amnezia/amneziawg/awg1.conf
systemctl start awg-quick@awg1
awg show awg1В выводе awg show awg1 должна появиться строка latest handshake — это означает, что связь с сервером-выходом установлена. Пинг внутреннего адреса выхода на этом шаге может не проходить, это нормально, так как маршрут к нему появится позже в отдельной таблице.
Скрипт маршрутизации: разделение трафика
Вся логика разделения трафика реализована в одном bash-скрипте на сервере-входе, обычно /root/awg/awg-routing.sh. Скрипт идемпотентный — его можно запускать повторно, при каждом запуске он обновляет список российских сетей.
Основные компоненты скрипта:
- Загрузка списка российских сетей — скрипт скачивает агрегированную зону российских IP из ipdeny и загружает её в ipset. Используется временный набор с атомарной подменой (
ipset swap), чтобы не было окна, когда набор пуст.
- Создание отдельной таблицы маршрутизации — для помеченного трафика создаётся таблица
100, в которой маршрут по умолчанию идёт через туннельawg1:
ip route replace default dev awg1 table 100
ip rule add fwmark 0x1 table 100 priority 10000- Маркировка трафика — с помощью iptables в цепочке PREROUTING трафик от клиентов проверяется на принадлежность к российским сетям. Если адрес назначения в списке
ru, пакет отправляется напрямую (правило RETURN). В противном случае пакет помечается меткой 0x1:
iptables -t mangle -I PREROUTING 1 -i awg0 -s 172.16.17.0/24 -m set --match-set ru dst -j RETURN
iptables -t mangle -A PREROUTING -i awg0 -s 172.16.17.0/24 -j MARK --set-mark 0x1Важно, чтобы правило RETURN стояло раньше правила MARK.
- Маршрут к серверу-выходу — чтобы пакеты к выходу не закольцевались в туннеле, маршрут к его внешнему IP держится вне туннеля.
Скрипт также содержит защиту от пустого списка: если список российских сетей не скачался, скрипт останавливается с ошибкой, а не продолжает работу. Пустой ipset привёл бы к тому, что весь трафик, включая российский, уходил бы за границу.
Автозапуск после перезагрузки и обновление списка
Одна из главных проблем исходной схемы — после перезагрузки сервера маршруты не восстанавливались автоматически. Решается это созданием systemd-юнита, который запускается после обоих туннелей.
Создайте файл /etc/systemd/system/awg-routing.service:
[Unit]
Description=Каскадный сплит-роутинг
After=awg-quick@awg0.service awg-quick@awg1.service network-online.target
Requires=awg-quick@awg0.service awg-quick@awg1.service
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/root/awg/awg-routing.sh
[Install]
WantedBy=multi-user.targetЗатем выполните:
systemctl daemon-reload
systemctl enable awg-quick@awg1 awg-routingДиректива Requires гарантирует, что если туннель к выходу не поднялся, маршрутизация не запустится. Это предотвращает ситуацию, когда клиенты подключаются, но весь трафик идёт напрямую без разделения.
Список российских сетей со временем меняется, поэтому рекомендуется обновлять его регулярно. Можно добавить cron-задание для еженедельного перезапуска юнита:
echo '0 5 * * 1 root systemctl restart awg-routing' > /etc/cron.d/awg-routing-refreshПосле перезагрузки сервера всё должно подняться автоматически: туннели, таблица маршрутизации и список сетей.
Проверка работы каскада и диагностика проблем
Убедиться, что каскад работает правильно, можно по счётчикам iptables на сервере-входе. Обнулите счётчики:
iptables -t mangle -Z PREROUTINGЗатем с клиента выполните два запроса: к зарубежному сайту (например, curl https://ifconfig.me) и к российскому адресу (например, ping -c3 77.88.55.242 — это Яндекс). После этого посмотрите счётчики:
iptables -t mangle -L PREROUTING -n -vЕсли счётчик RETURN вырос на российских адресах, а счётчик MARK — на зарубежных, каскад работает корректно. curl ifconfig.me с клиента должен показать IP сервера-выхода.
Распространённые проблемы и их решения:
- Весь трафик идёт через заграницу — проверьте, что список российских сетей загружен:
ipset list ru | grep "Number of entries". Там должно быть несколько тысяч записей (обычно около 8600). Если ноль — список не скачался. Скрипт в этом случае останавливается с ошибкой, но если вы запускали старую версию, проверьте вручную.
- Некоторые российские сайты открываются через зарубежный IP — деление идёт по IP назначения. Если сайт физически расположен на зарубежном хостинге или за Cloudflare, его адрес не попадёт в список российских сетей, и трафик уйдёт через выход. Проверить конкретный сайт можно командой
getent hosts имя.ru, а затемipset test ru <адрес>.
- Google и YouTube тормозят — часть кэшей Google и YouTube размещена на российских IP и попадает в список российских сетей, поэтому трафик к ним идёт напрямую через вход, и Google видит российский адрес. Подмена DNS не помогает. Чтобы направить Google и YouTube через зарубежный выход, нужно добавить их сети в исключения до правила RETURN.
- Отдача ниже приёма — если приём нормальный, а отдача почти нулевая, проблема не в MTU и не в процессоре. Узкое место — плечо между входом и выходом. Проверьте его с помощью iperf3: на выходе запустите
iperf3 -s, со входа —iperf3 -c IP-выхода(отдача) иiperf3 -c IP-выхода -R(приём). Низкая отдача при нормальном приёме указывает на шейпинг исходящего трафика у хостера входа или на проблемы пиринга.
Сравнение с другими решениями и ограничения
Каскад на AmneziaWG — не единственный способ организовать раздельный выход. Альтернативы включают:
- Клиентский сплит-туннелинг — если разделение нужно только одному пользователю, проще задать список AllowedIPs на клиенте. Это не требует второго сервера, но настройка выполняется на каждом устройстве отдельно.
- Схема с Cloudflare WARP — вместо второго сервера можно использовать Cloudflare WARP для российского трафика. Это дешевле, но не даёт российского IP: сайты увидят адрес Cloudflare, что может не подойти для банков и госуслуг.
- Каскад на Xray — аналогичная схема, но с использованием протокола Xray с Reality. Отличается транспортом: Xray маскирует трафик под обычное TLS-соединение, а AmneziaWG — под HTTPS. Выбор зависит от требований к обфускации и совместимости.
Важные ограничения каскада на AmneziaWG:
- Признак дата-центра — даже с российским IP сервисы могут определять, что адрес принадлежит хостингу, и требовать дополнительную проверку. По замерам, 77 из 78 российских диапазонов помечены хотя бы одной геобазой как дата-центр.
- IPv6 не поддерживается — схема работает только по IPv4. При включённом IPv6 трафик пойдёт в обход разделения.
- DNS-запросы уходят через выход — клиентский DNS по умолчанию — Cloudflare, его адреса зарубежные, поэтому DNS-запросы идут через сервер-выход. Это штатно и не влияет на разделение, но стоит учитывать при диагностике.
Кому подходит каскад и итоговые рекомендации
Каскад из двух серверов — это решение для тех, кому нужно одновременно пользоваться российскими и зарубежными ресурсами с одного подключения, без ручного переключения. Он особенно полезен, если разделение должно быть централизованным — например, для семьи или небольшой команды, где все клиенты подключаются к одному серверу-входу.
Если вам нужен только российский IP для доступа к банкам и госуслугам, а зарубежный трафик не критичен, можно обойтись одним российским сервером без каскада. Если же нужен только зарубежный выход, достаточно обычного VPN на зарубежном сервере.
Сборка каскада занимает около вечера: две стандартные установки, настройка туннеля, скрипт маршрутизации и systemd-юнит. Скрипт и инструкция доступны в репозитории amneziawg-installer. Схема проверена на живом стенде, включая повторные запуски и восстановление после перезагрузки.
Перед развёртыванием убедитесь, что оба сервера имеют реальные публичные IP, IPv6 отключён, и подсети не пересекаются. После настройки проверьте разделение по счётчикам iptables и при необходимости скорректируйте список исключений для Google и YouTube.
Вопросы и ответы
Что такое каскадный VPN на AmneziaWG?
Каскадный VPN на AmneziaWG — это схема из двух серверов, соединённых в цепочку. Клиент подключается к серверу-входу (обычно в России), а тот разделяет трафик: российские сайты отправляются напрямую с IP входа, а все остальные — через зарубежный сервер-выход. Это позволяет одновременно пользоваться российскими сервисами, которые блокируют иностранные IP, и зарубежными ресурсами с чистым иностранным адресом.
Нужна ли особая настройка на клиенте для каскада?
Нет, клиенту не требуется никакой особой настройки. Клиент подключается к серверу-входу как к обычному VPN-серверу AmneziaWG. Вся логика разделения трафика живёт на сервере-входе, поэтому клиенты просто получают раздельный выход автоматически.
Какие требования к серверам для каскада?
Нужны два VPS с чистой ОС (Debian 12/13 или Ubuntu 24.04/25.10), root-доступом и реальным публичным IP. Сервер за CGNAT не подойдёт для роли входа. Также важно отключить IPv6, так как схема работает только по IPv4, и использовать разные подсети на серверах, чтобы избежать конфликтов маршрутизации.
Почему Google и YouTube могут тормозить в каскаде?
Часть кэшей Google и YouTube размещена на российских IP-адресах, которые попадают в список российских сетей. Поэтому трафик к ним идёт напрямую через сервер-вход, и Google видит российский IP. Подмена DNS не помогает, так как сети Google во многом общие. Чтобы направить Google и YouTube через зарубежный выход, нужно добавить их сети в исключения до правила RETURN в скрипте маршрутизации.
Что делать, если отдача намного ниже приёма?
Если приём нормальный, а отдача почти нулевая, проблема обычно не в MTU и не в процессоре. Узкое место — плечо между сервером-входом и сервером-выходом. Проверьте его с помощью iperf3: на выходе запустите iperf3 -s, со входа — iperf3 -c IP-выхода для отдачи и iperf3 -c IP-выхода -R для приёма. Низкая отдача при нормальном приёме указывает на шейпинг исходящего трафика у хостера входа или на проблемы пиринга.
Можно ли использовать каскад без второго сервера?
Да, если нужен только российский IP, достаточно одного российского сервера. Если нужен только зарубежный выход — одного зарубежного. Каскад оправдан, когда нужно одновременно и то и другое, и разделение должно быть централизованным на сервере. Альтернатива — клиентский сплит-туннелинг, но он настраивается на каждом устройстве отдельно.
Как проверить, что каскад работает правильно?
Обнулите счётчики iptables на сервере-входе (iptables -t mangle -Z PREROUTING), затем с клиента выполните запрос к зарубежному сайту (curl https://ifconfig.me) и к российскому адресу (ping -c3 77.88.55.242). После этого посмотрите счётчики (iptables -t mangle -L PREROUTING -n -v). Если счётчик RETURN вырос на российских адресах, а MARK — на зарубежных, каскад работает корректно.