Xray-core с транспортом Reality слушает порт 443 и имитирует TLS-поведение целевого сайта (dest). Когда подключается легитимный клиент с правильным publicKey и shortId - происходит штатный туннель. Когда подключается кто угодно другой - xray форвардит соединение напрямую на dest, чтобы со стороны всё выглядело как обычный HTTPS-сайт.
Это форвардирование - внутренний механизм ядра. Оно не проходит через routing rules и outbounds. Xray открывает TCP-соединение до dest напрямую через системный сетевой стек.
Теория атаки
Инфраструктура построена по схеме двойной цепочки: entry-нода в России принимает трафик, exit-нода на Западе выходит в интернет. Смысл - скрыть IP entry-ноды от конечных сайтов.
Но Reality на entry-ноде замаскирована под российский сайт (российский dest). РКН может попросить этот сайт логировать входящие TLS-подключения. Дальше - тривиально: бот стучится curl’ом на 443 entry-ноды, xray форвардит это на dest, российский сайт видит в логах IP entry-ноды.
Двойная цепочка ничего не даёт, потому что уязвимость срабатывает до того как трафик вообще попадает в туннель.
Для проверки теории поднят nginx с детальным access-логом на отдельном домене (limiter.[…]). Этот домен прописан как dest в realitySettings на entry-ноде ru-inbound-1.
Конфиг логирования nginx:
log_format detailed '$time_iso8601 | $remote_addr | $ssl_protocol $ssl_cipher | '
'$request | status=$status | bytes=$body_bytes_sent | '
'ua="$http_user_agent"';
После перезапуска xray с новым dest - в логах nginx появились записи:
2026-04-30T03:39:06+00:00 | 138.124.xxx.xx | TLSv1.3 TLS_AES_128_GCM_SHA256 | GET / HTTP/1.1 | status=200 | bytes=2 | ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0"
2026-04-30T03:39:06+00:00 | 138.124.xxx.xx | TLSv1.3 TLS_AES_128_GCM_SHA256 | GET /favicon.ico HTTP/1.1 | status=200 | bytes=2 | ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0"
DNS-резолв IP из лога:
Name: ru-inbound-1.[...]
Address: 138.124.xxx.xx
Совпадение подтверждено. IP в логах - это именно entry-нода, а не exit-нода и не IP клиента.
Первое что мне пришло в голову:
Поднять отдельное ядро - “warp-router” контейнер с kernel TUN (noKernelTun: false(потому что без него, варп не запускается ни в какую). Перевести remnanode с network_mode: host на bridge-сеть, где default gateway - warp-router контейнер(443 и 2222 порт от ноды ввыести наружу). Тогда весь исходящий трафик remnanode, включая dest-форвард, автоматически идёт через WARP без каких-либо изменений в xray конфиге.
Но я не проверял, как появится время, проверю, и дам подтверждение.
А в общем хочу сказать, что это реально проблема, ибо мы делаем цепочки, стараемся скрыть входной адрес(особенно это критично если айпи из бс, а хостер при этом охотится на владельца такого айпи), но рандомный человек/бот/сканер может сдеанонить ваш входной сервак, и все, we are fucked.
(Текст в основном сгенерирован нейронкой)