Настройка маршрутизации через vless (xray) на VPS

Здравствуйте. Подскажите, пожалуйста, как реализовать следующую схему. Я по wireguard подключаю все клиенты к VPS в РФ. Через эту VPS организую доступ между клиентами и в некоторых случаях к сетям за клиентами (пара клиентов - роутеры). При этом на VPS хочу организовать маршрутизацию трафика через xray по протоколу VLESS на зарубежную VPS так, чтобы трафик до ру доменов шел через VPS в РФ, а до остальных - через зарубежную.

На данном этапе два конкретных вопроса:

  1. Как заворачивать весь трафик, который идет НЕ к клиентам первой VPS/не через эти клиенты к локальным сетям за ними, на зарубежную VPS (какие программы, какие настройки)?
  2. Есть ли возможность в моем предполагаемом сетапе сделать подключение до VPS в РФ через домен, а не через IP? Я читал, что wireguard не умеет в домены, значит, мне лучше смотреть в сторону openvpn? Это для того, чтобы в случае проблем с одной VPS быстро перейти на другую, при этом не меняя на всех клиентах конфиг wireguard.

Будем считать, что wireguard сеть 10.0.30.0/24 ipv4 only.

Буду благодарен за ваши советы и рекомендации. Похожие темы, к сожалению, не увидел. Когда разберусь, постараюсь набрость небольшое how-to, чтобы таким как я (линукс энтузиастам) было проще все настроить.

Примерная упрощенная схема

Вроде бы уже несколько тем по policy based routing были на этом форуме. Для веб-серфинга по TCP по-моему самый простой вариант использовать расширение SwitchyOmega (можно экcпортировать настройки, под андроид без GASP поддерживающие десктопные расширения браузеры Iceraven и Kiwi Browser). Домен легко определяется при использовании SOCKS5 прокси, а IP тунель может только работать с IP машрутизацией.
Для реализации вашей идеи придётся написать скрипт/службу которая будет обновлять список IP РФ и добавлять их в nftables named set для машрутизации через внешний интерфейс, когда остальные пакеты должны идти через виртаульный интерфейс прокси.

Я бы не надеялся, что Wireguard будет нормально работать даже в пределах РФ, как показывает практика, на “внутренние адреса” его тоже блочат когда приспичит.

А так, схема делается довольно легко, на ВПС РФ ставите или X-ray+tun2socks, или сразу Sing-box (он умеет TUNиз коробки), и соответственно настраиваете маршрутизацию в системе так, чтобы весь трафик из wireguard шел на этот TUN. А дальше разркливаетк его как обычно в X-ray/Sing-box, можно по GeoIP, можно включить sniffing и “подслушивать” домены из http/https-sni и заворачивать дополнительно по правилам для .ru, .su., .рф (даже если по GeoIP адрес забугорный), и т.д., оно там все в документации описано

Перечитал несколько раз ваше сообщение и не понял, как оно отвечает хотя бы на 1 мой вопрос. Мне кажется, вы вообще не про то, о чем я спрашиваю, написали.

У меня есть довольно давно (лет 5 точно) работающая ВПС у одного из РФ хостеров, ВГ на ней работает в любых сетях. Даже когда писали про массовые проблемы с доступом, я их у себя не видел на этой ВПС. На других (зарубежных особенно) да, на ней нет. Поэтому и расчитываю на такую схему. А если не ВГ или не ОВПН (точнее, не ВПН, который могут заблокировать), тогда как построить эту схему при сохранении всех остальных требований? Через shadowsocks/xray? Что из себя будет представлять эта схема? По-моему, будет сложнее чем сейчас… Поэтому пока остановлюсь на этом.

А так, схема делается довольно легко, на ВПС РФ ставите или X-ray+tun2socks, или сразу Sing-box (он умеет TUNиз коробки), и соответственно настраиваете маршрутизацию в системе так, чтобы весь трафик из wireguard шел на этот TUN. А дальше разркливаетк его как обычно в X-ray/Sing-box, можно по GeoIP, можно включить sniffing и “подслушивать” домены из http/https-sni и заворачивать дополнительно по правилам для .ru, .su., .рф (даже если по GeoIP адрес забугорный), и т.д., оно там все в документации описано

Вот. Это одно из того, что мне нужно. Если у меня xray, значит ставлю tun2socks. С этим я разберусь. Вопрос, как заворачивать именно определенный трафик, как я описал выше и на схеме? Достаточно простой маршрутизации? При этом дефолтным шлюзом выставлять именно шлюз, созданный tun2socks, а остальные по приоритетам определять?

Либо вы заворачиваете весь трафик на Xray и он уже роутит по доменам и geoip (transparent proxy, tun2socks, для geoip лучше использовать не geoip.db из пакета - он не очень точный, а собирать сторонний GitHub - Loyalsoldier/geoip: 🌚 🌍 🌝 GeoIP 规则文件加强版,同时支持定制 V2Ray dat 格式路由规则文件 geoip.dat 和 MaxMind mmdb 格式文件 Country.mmdb。Enhanced edition of GeoIP files for V2Ray, Xray-core, Clash, Trojan-Go, Leaf and Hysteria, with replaced CN IPv4 CIDR available from ipip.net, appended CIDR lists and more.).
Либо вы определяете заранее, что роутить а что нет и часть трафика отдаете в Xray, а часть напрямую с узла - определять можно разными способами:

  • fakedns от Xray - использовать его как dns сервер на узле и возвращать адреса, которые будут заворачиваться в Xray через transparent (я использую такую схему)
  • получать ru-префиксы от ripe или с помощью каких-то скриптов (например GitHub - furriest/radb-tools: RADB tools) и исключать их из заворачивания в Xray.

Спасибо за информацию по сборке. Точно пригодится. Я пока разбираюсь с вариантом отдавать все на xray, а он дальше сам. Смотрю, как заводить этот tun2socks и, что самое пока непонятное для меня, как при маршрутизации трафика через интерфейс tun2socks пирам wireguard получать доступ друг к другу и к локалке за роутером…

Если вы собираетесь отдавать все на xray, то нужно адреса клиентов WG просто исключить из редиректа tun2socks. Конкретнее я не могу подсказать, потому что сам использую transparent proxy (dokodemo) через nftables. Соответственно, адреса которые не нужно заворачивать в Xray у меня просто исключены из редиректа.

Ваше сетап тоже самое делает, что я описал? Можете про него подробнее рассказать?

Вопрос, как заворачивать именно определенный трафик, как я описал выше и на схеме?

Трафик с WG можно заворачивать примерно так:

# допустим у вас в сети WG диапазон 10.100.1.0/24, а на TUN-интерфейсе 10.0.0.0/24
#  все что приходит с WG будем обрабатывать правилом 5
ip rule add from 10.100.1.0/24 table 5
# для правила 5 дефолтным маршрутом ставим TUN
ip route add default via 10.0.0.0/24 dev tun0 table 5

и дальше два варианта, или добавить еще маршрутов обратно на WG (чтобы клиенты WG ходили друг к другу), или же скорректировать ip rule add так чтобы он не захватывал то что идет к другим клиентам, типа

ip rule add not to 10.100.1.0/24 iif wg0 table 5
ip route add default via 10.0.0.0/24 dev tun0 table 5

или же пусть оно все приземляется на TUN, а дальше уже XRay раскидает коннекты - там нужно добавить routing rule чтобы “ip”: “10.100.1.0/24” шли на freedom (direct).

А если не ВГ или не ОВПН (точнее, не ВПН, который могут заблокировать), тогда как построить эту схему при сохранении всех остальных требований?

Я бы взял вместо WG и OpenVPN что-нибудь на базе нормального TLS, например AnyConnect/OpenConnect или SSTP. Но дело ваше, конечно :slight_smile: Это если вам нужно чтобы клиенты могли друг к другу подключаться. Если же не нужно чтобы клиенты друг друга видели, то можно сразу от клиентов ходить через XRay, а на сервере все маршруты по адресам и доменам типа “этот сразу выпускаем в России, а этот сразу передаем на другой Xray” разруливать средствами самого же XRay.

Если же не нужно чтобы клиенты друг друга видели

Нужно. Через это соединение я получаю доступ к NAS и NVR.

Я немного застрял на первом этапе - организации соединения между зарубежным и рф сервером по xray. У меня есть несколько клиентов на разных платформах (ios, macos, linux), которые я подключил через shadowrocket/nekoray к зарубежной впс. Они работают отлично. А вот headless вариант подключения у меня никак не работает. Может подскажете, что не так?

Конфиг ВПС-сервера - PrivateBin

Конфиг ВПС-клиента - PrivateBin

Лог клиента при попытке выполнить запрос через curl - PrivateBin

Гуглеж по ошибке показывает, что неправильный конфиг клиента, но конфиг верный (взял 1 в 1 с официального github, где примеры конфигов) + похожий конфиг на nekoray работает без проблем. Что я не замечаю?