22 KiB
Обзор функции Fallback
При использовании Xray вы наверняка много раз слышали о функции "fallback". В этой статье мы кратко рассмотрим логику этой функции и способы ее применения.
1. Что такое Fallback в простых словах
Если вы использовали конфигурацию Xray из нашего руководства и настроили автоматическое перенаправление HTTP на HTTPS, то у вас уже есть простой fallback на основе протокола VLESS
:
{
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
// ... ...
],
"decryption": "none",
"fallbacks": [
{
"dest": 8080 // По умолчанию перенаправлять на прокси-сервер, защищенный от сканирования
}
]
},
"streamSettings": {
// ... ...
}
}
]
}
Как объяснить этот фрагмент конфигурации простыми словами?
-
Xray
прослушивает порт[inbound port]
443
Это означает, что
Xray
отвечает за прослушивание трафикаHTTPS
на порту443
. -
Xray
использует протокол[inbound protocol]
vless
Только трафик протокола
vless
будет обрабатыватьсяXray
и перенаправляться на исходящие модули.::: warning Примечание: Легковесный протокол
VLESS
был разработан с целью добавления функции fallback вxray
,v2fly
и другие ядра, а также для уменьшения избыточных проверок/шифрования. (Конечно, на данный момент протоколtrojan
вxray
также полностью поддерживает функцию fallback.) ::: -
Целевой порт fallback
[fallback dest]
-8080
После того, как
Xray
получает входящий трафик на порт443
, трафик протоколаvless
обрабатывается внутренне и перенаправляется на исходящий модуль. Другой трафик, не относящийся к протоколуvless
, перенаправляется на порт8080
.::: warning Вопрос: Использовать единственное или множественное число?
Ответ: Внимательные читатели, должно быть, заметили, что в файле конфигурации используются множественные числа
inbounds
,fallbacks
, но почему я использую единственное число:inbound
,fallback
?Потому что множественное число в файле конфигурации означает, что
xray
поддерживает N элементов одного уровня (т.е. N входящих, M резервных и т.д.), а в приведенном выше примере анализа используется только один, поэтому я использовал единственное число. ::: -
Трафик, перенаправляемый на порт
8080
, обрабатывается последующей программойВ нашем примере порт
8080
обрабатываетсяNginx
, который находит и отображает страницу с маленькой пандой в соответствии с конфигурацией. -
В итоге, полный маршрут данных в нашем примере выглядит следующим образом:
graph LR; W(Внешний HTTP:80 запрос) --> N80(HTTP:80) subgraph Nginx Внешнее прослушивание N80 -.- N301(301 перенаправление) -.- N443(HTTPS:443) end N443 --> X(Xray прослушивает 443) .- X1{Проверка входящего трафика} X1 --> |Трафик VLESS| X2(Внутренние правила Xray) X2 --> O(Xray Outbounds Исходящий) X1 ==> |Fallback не VLESS трафика| N8080(Nginx:8080) N8080:::nginxclass ==> H(index.html) H:::nginxclass classDef nginxclass fill:#FFFFDE
2. Что такое Fallback (ЧТО, КАК v1
)
Основываясь на приведенном выше примере, вы должны понять, что такое fallback (Что) и как он работает (Как), проще говоря, вот эти несколько элементов:
- Fallback происходит после того, как трафик поступает на порт прослушивания
Xray
. - Fallback основывается на таких характеристиках трафика, как тип протокола.
- Целью fallback является определенный порт.
- Трафик, для которого выполнен fallback, обрабатывается программой, прослушивающей порт fallback.
3. Зачем нужен Fallback (ЗАЧЕМ v1
)
Изначально он был предназначен для защиты от активного зондирования (Active Probing).
Активное зондирование: Проще говоря, это означает, что внешние злоумышленники отправляют определенные сетевые запросы и интерпретируют ответы сервера, чтобы определить, запущены ли на сервере такие прокси-инструменты, как xray
, v2fly
, shadowsocks
и т.д. Если это удается точно определить, сервер может подвергнуться атаке или блокировке.
Интерпретировать ответы сервера можно потому, что полный запрос данных на самом деле состоит из множества этапов обмена данными, и на каждом этапе генерируются определенные характеристики программного обеспечения. Проще говоря:
- Ответ обычного сайта обязательно будет содержать характеристики таких инструментов веб-сервиса и базы данных, как
Nginx
,Apache
,MySQL
и т.д. - Ответ обычного сайта не будет содержать характеристики таких прокси-инструментов, как
xray
,v2fly
,shadowsocks
и т.д.
Таким образом, когда мы предоставляем Xray
функцию "fallback" (как в приведенном выше примере, fallback на Nginx
), любой запрос, используемый для зондирования, приводит к следующему:
- Зондирующий трафик не может получить доступ к вашим параметрам
VLESS
и поэтому будет перенаправлен наNginx
. - Весь зондирующий трафик перенаправляется на
Nginx
, поэтому ответ VPS-сервера обязательно будет содержать характеристикиNginx
. - Поскольку сам
Xray
не отвечает на зондирующий трафик, ответ VPS не будет содержать характеристикиXray
.
Таким образом, функция "fallback" решает проблему безопасности активного зондирования сервера с точки зрения логики взаимодействия данных.
4. Полное понимание Fallback (ЧТО, ЗАЧЕМ, КАК v2
)
Почему нужно снова говорить о fallback? Потому что выше мы рассмотрели только первую версию fallback, основанную на "протоколе" и защите от активного зондирования.
В процессе постоянного развития и обновления протокола VLESS
и функции fallback
командой RPRX постепенно выяснилось, что fallback может быть более гибким и мощным. При условии обеспечения защиты от активного зондирования можно в полной мере использовать информацию, содержащуюся в первом пакете данных, для реализации многоэлементного и многоуровневого fallback (например, path
, alpn
и т.д.).
Основываясь на этой концепции разработки, функция "fallback" постепенно превратилась в то, чем она является сейчас, - в механизм, реализующий полную маскировку --> ws-разделение --> многопротокольное и многопараметрическое разделение. Финальная версия даже полностью заменила функцию разделения, которую раньше выполняли веб-серверы и другие инструменты. А поскольку описанная выше обработка "fallback/разделения" выполняется на этапе определения первого пакета за миллисекунды и не связана с какими-либо операциями с данными, она практически не приводит к потерям производительности.
Таким образом, сейчас полноценная функция "fallback" в Xray
обладает следующими свойствами:
- Безопасность: полная защита от атак активного зондирования.
- Эффективность: практически полное отсутствие потерь производительности.
- Гибкость: гибкое разделение данных, повторное использование часто используемых портов (например, 443).
::: tip Хотя такой подробный подход может показаться несколько утомительным, только он позволяет в полной мере раскрыть уникальные преимущества полноценного "fallback". :::
5. Пример и описание многоуровневого fallback
Теперь, когда мы понимаем, что такое "полноценный fallback", мы можем приступить к настройке многоуровневого fallback.
5.1 Сначала скопируем фрагмент конфигурации прослушивания порта 443 на стороне сервера:
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "", // Укажите свой UUID
"flow": "xtls-rprx-vision",
"level": 0,
"email": "love@example.com"
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 1310, // По умолчанию перенаправлять на протокол Trojan Xray
"xver": 1
},
{
"path": "/websocket", // Обязательно укажите свой путь
"dest": 1234,
"xver": 1
},
{
"path": "/vmesstcp", // Обязательно укажите свой путь
"dest": 2345,
"xver": 1
},
{
"path": "/vmessws", // Обязательно укажите свой путь
"dest": 3456,
"xver": 1
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": ["http/1.1"],
"certificates": [
{
"certificateFile": "/path/to/fullchain.crt", // Укажите путь к вашему сертификату, абсолютный путь
"keyFile": "/path/to/private.key" // Укажите путь к вашему закрытому ключу, абсолютный путь
}
]
}
}
}
Как объяснить этот фрагмент конфигурации простыми словами?
-
Xray
прослушивает порт (inbound port
)443
Это означает, что
Xray
отвечает за прослушивание трафикаHTTPS
на порту443
и использует сертификатTLS
, указанный вcertificates
, для аутентификации. -
Xray
использует протокол (inbound protocol
)vless
Трафик протокола
vless
напрямую передается вXray
для дальнейшей обработки. -
Трафик, не относящийся к протоколу
VLESS
, перенаправляется на 4 различных порта fallback:- Трафик с
path
, равнымwebsocket
, перенаправляется на порт1234
для дальнейшей обработки. - Трафик с
path
, равнымvmesstcp
, перенаправляется на порт2345
для дальнейшей обработки. - Трафик с
path
, равнымvmessws
, перенаправляется на порт3456
для дальнейшей обработки. - Весь остальной трафик перенаправляется на порт
1310
для дальнейшей обработки.
- Трафик с
-
xver
, равный1
, означает, что функцияproxy protocol
включена, и реальный IP-адрес источника будет передан дальше. -
Структура fallback показана на рисунке ниже:
graph LR; W443(Внешний HTTP:443 запрос) --> X443(Xray-inbound: 443) .- X1{Проверка входящего трафика} X1 --> |Протокол = VLESS| X2(Внутренние правила Xray) X2 --> O(Xray Outbounds Исходящий) X1 --> |path = /websocket| X1234(Xray-inbound:1234) X1 --> |path = /vmesstcp| X2345(Xray-inbound:2345) X1 --> |path = /vmessws| X3456(Xray-inbound:3456) X1 --> |Весь остальной трафик| X1310(Xray-inbound:1310)
-
Куда делся fallback на веб-страницу?
Верно, внимательные читатели должны были заметить, что
fallback на nginx
, защищающий от активного зондирования, исчез!!! Почему? Не опасно ли это? Не волнуйтесь, давайте разбираться дальше:
5.2 Фрагмент конфигурации, отвечающий за обработку fallback:
-
Трафик, перенаправляемый на порт
1310
, обрабатывается в соответствии со следующей конфигурацией:{ "port": 1310, "listen": "127.0.0.1", "protocol": "trojan", "settings": { "clients": [ { "password": "", // Укажите свой пароль "level": 0, "email": "love@example.com" } ], "fallbacks": [ { "dest": 80 // Или перенаправлять на другой прокси-сервер, защищенный от сканирования } ] }, "streamSettings": { "network": "tcp", "security": "none", "tcpSettings": { "acceptProxyProtocol": true } } }
Смотрите, произошло чудо, в протоколе
trojan
появился новыйfallbacks
. Как уже говорилось ранее, протоколtrojan
вxray
также обладает полной функциональностью fallback, поэтому на этом этапе протоколtrojan
может снова выполнять проверку и fallback (это и есть легендарный "fallback в fallback"):- Весь трафик протокола
trojan
передается вXray
для дальнейшей обработки. - Весь остальной трафик перенаправляется на порт
80
. Защита от активного зондирования реализована!
- Весь трафик протокола
-
Трафик, перенаправляемый на порт
1234
, на самом деле являетсяvless+ws
:{ "port": 1234, "listen": "127.0.0.1", "protocol": "vless", "settings": { "clients": [ { "id": "", // Укажите свой UUID "level": 0, "email": "love@example.com" } ], "decryption": "none" }, "streamSettings": { "network": "ws", "security": "none", "wsSettings": { "acceptProxyProtocol": true, // Напоминание: если вы используете Nginx/Caddy и т.д. для обратного проксирования WS, удалите эту строку "path": "/websocket" // Обязательно укажите свой путь, он должен совпадать с путем разделения } } }
-
Трафик, перенаправляемый на порт
2345
, на самом деле является прямым подключениемvmess
:{ "port": 2345, "listen": "127.0.0.1", "protocol": "vmess", "settings": { "clients": [ { "id": "", // Укажите свой UUID "level": 0, "email": "love@example.com" } ] }, "streamSettings": { "network": "tcp", "security": "none", "tcpSettings": { "acceptProxyProtocol": true, "header": { "type": "http", "request": { "path": [ "/vmesstcp" // Обязательно укажите свой путь, он должен совпадать с путем разделения ] } } } } }
-
Трафик, перенаправляемый на порт
3456
, на самом деле являетсяvmess+ws(+cdn)
.::: warning Да, вы не ослышались, это одна из комбинаций, рекомендованных v2fly, и она полностью поддерживает
CDN
. Теперь она добавлена в наш идеальный набор fallback! :::{ "port": 3456, "listen": "127.0.0.1", "protocol": "vmess", "settings": { "clients": [ { "id": "", // Укажите свой UUID "level": 0, "email": "love@example.com" } ] }, "streamSettings": { "network": "ws", "security": "none", "wsSettings": { "acceptProxyProtocol": true, // Напоминание: если вы используете Nginx/Caddy и т.д. для обратного проксирования WS, удалите эту строку "path": "/vmessws" // Обязательно укажите свой путь, он должен совпадать с путем разделения } } }
-
Теперь мы можем нарисовать полную схему fallback:
graph LR;
W443(Внешний HTTP:443 запрос) --> X443(Xray-inbound: 443) .- X1{Проверка входящего трафика}
X1 --> |Протокол = VLESS| X2(Внутренние правила Xray)
X2 --> XO(Xray Outbounds Исходящий)
X1 --> |path = /websocket| X1234(Xray-inbound:1234)
X1 --> |path = /vmesstcp| X2345(Xray-inbound:2345)
X1 --> |path = /vmessws| X3456(Xray-inbound:3456)
X1 --> |Весь остальной трафик| X1310(Xray-inbound:1310)
X1234 --> X2
X2345 --> X2
X3456 --> X2
X1310 --> |Протокол = trojan| X2
X1310 --> |Весь остальной трафик| N80(Nginx:80)
N80:::nginxclass --> H(index.html)
H:::nginxclass
classDef nginxclass fill:#FFFFDE
6. Заключение
На этом обзор функции "fallback" в Xray
завершен. Надеемся, что эта статья поможет вам лучше понять возможности Xray
.
7. Дополнительное задание
Позвольте мне нагло оставить вам дополнительное задание: есть ли что-то, что можно оптимизировать в шаблоне VLESS-TCP-XTLS-WHATEVER, описанном в этой статье?
Подсказка: автоматическое перенаправление HTTP на HTTPS.