Как Xray выбирает первое подходящее правило?

Xray читает массив routing.rules сверху вниз. Когда соединение удовлетворяет всем условиям одного элемента, дальнейшее сопоставление прекращается, а трафик направляется в указанный outboundTag или balancerTag. Порядок здесь является частью логики, а не способом красиво организовать файл.

Широкое условие, размещённое раньше узкого, способно забрать запрос себе. Например, общее правило для TCP сработает до следующего правила для domain:example.com. Удобная схема начинается с точных исключений, продолжается групповыми условиями и заканчивается явно заданным общим маршрутом.

Telegram-flow

Хотите подключить VPN без ручных настроек?

Откройте бота: он покажет trial или тариф, отправит файл подключения и QR-код прямо в Telegram.

Попробовать в Telegram

Что именно видит Routing: домен или IP-адрес?

Ответ зависит от типа входящего подключения. SOCKS- или HTTP-клиент может передать Xray имя example.com, и тогда доменные условия доступны сразу. При прозрачном проксировании или TUN система нередко уже разрешила имя, поэтому inbound получает только адрес вроде 192.0.2.10 из тестового диапазона.

Если модуль Routing видит только IP, условие domain:example.com само по себе не совпадёт. До правки правил нужно определить исходные данные: известен ли первоначальный домен, появился ли результат sniffing или доступен лишь IP. После этого выбирают доменное сопоставление, правило по сети либо их контролируемую комбинацию.

Как domainStrategy меняет результат маршрутизации?

Значение AsIs не выполняет дополнительное разрешение: Xray сопоставляет домен или IP, который уже известен. При IPIfNonMatch сначала проходит полный раунд доменных правил, а при отсутствии совпадения имя разрешается в IP и начинается повторная проверка по условиям для адресов.

IPOnDemand разрешает домен раньше, когда обработка доходит до IP-условия. Это полезно для правил по подсетям, но добавляет зависимость от DNS. Если имя возвращает несколько IPv4- и IPv6-адресов, совпадение хотя бы одного адреса может определить выбранный маршрут, что важно учитывать при работе с CDN.

Почему встроенный DNS может привести к неожиданному outbound?

Встроенный DNS участвует в Routing только при соответствующей стратегии. Полученный адрес используется для принятия решения, но не обязательно заменяет исходную цель будущего подключения. Поэтому выбор маршрута и фактическое установление соединения через outbound нужно рассматривать как два разных этапа.

CDN-домен способен возвращать разные адреса в зависимости от DNS-сервера, времени, региона и типа записи. Правило, которое вчера совпадало с одной подсетью, сегодня может получить другой ответ. При разборе проверяют routing.domainStrategy, DNS queryStrategy и набор ответов A и AAAA, не меняя всё одновременно.

Когда доменным правилам помогает sniffing?

При прозрачном перехвате Xray часто получает уже готовый IP. Включённый sniffing может извлечь домен из поддерживаемого HTTP-, TLS- или QUIC-трафика и передать его модулю Routing. Для этого соответствующий протокол добавляют в destOverride на том inbound, через который приходит соединение.

Sniffing не гарантирует имя для каждого потока. В данных может не быть доступного домена, а ECH способен скрыть часть ClientHello. Некоторые протоколы вообще не содержат подходящей информации. Поэтому sniffing является дополнительным источником данных для маршрута, но не универсальной заменой DNS и наблюдаемости.

Что меняет параметр routeOnly?

При обычном destOverride найденный домен может заменить IP в цели подключения. Если включить routeOnly, Xray использует обнаруженное имя только при выборе маршрута, сохраняя исходный IP назначения. Этот параметр работает вместе с включённым sniffing и указанными типами destOverride.

Режим полезен, когда доменное правило должно выбрать outbound, но менять адрес дальнейшего соединения нежелательно. Если одновременно известны исходный и обнаруженный домены, результат sniffing имеет приоритет. Сравнивать варианты лучше на одном тестовом имени, фиксируя DNS и порядок правил.

Как последовательно найти ошибку в конфигурации?

Начните с проверки того же файла, который использует процесс: xray run -test -config ./config.json. Нулевой код завершения означает, что Xray смог разобрать структуру, но не подтверждает выбор outbound. Затем проверьте уникальность тегов и поставьте одно точное правило выше общих условий.

После этого меняйте по одному фактору: порядок, domainStrategy, sniffing или routeOnly. Для домена используйте example.com, а для адресов — только TEST-NET, например 192.0.2.0/24. OneBucksVPN сейчас работает на AmneziaWG; этот разбор описывает отдельную технологию и не является схемой действующего сервиса.

Какие короткие ответы важно запомнить?

Проверяет ли xray run -test фактический маршрут трафика?

Нет. Команда проверяет разбор конфигурации и структурные ошибки. Она не создаёт пользовательское соединение и не доказывает, что конкретный домен попадёт в ожидаемый outbound.

Нужно ли всегда включать sniffing для доменной маршрутизации?

Нет. Если inbound уже получает доменное имя, Routing может использовать его напрямую. Sniffing особенно полезен при прозрачном режиме, когда до Xray доходит только IP.

Какое значение domainStrategy выбрать по умолчанию?

Универсального варианта нет. AsIs подходит при известном домене, IPIfNonMatch добавляет второй раунд по IP, а IPOnDemand получает адрес при встрече IP-условий.

Telegram-flow

Хотите подключить VPN без ручных настроек?

Откройте бота: он покажет trial или тариф, отправит файл подключения и QR-код прямо в Telegram.

Попробовать в Telegram