Xray-core: Add Lua script for dns and routing

https://github.com/XTLS/Xray-core/pull/6823
This commit is contained in:
Meow
2026-10-11 09:55:19 +08:00
parent 4c8f3b2b7e
commit f179efd35d
48 changed files with 4950 additions and 0 deletions
+15
View File
@@ -7,6 +7,7 @@
- На этапе маршрутизации: разрешение доменов в IP и сопоставление правил на основе полученных IP для разделения трафика.
::: details Подробное объяснение
Разрешение доменного имени для маршрутизации по IP зависит от значения `routing.domainStrategy`. Встроенный DNS-сервер может использоваться для запросов только при следующих значениях:
- `"IPIfNonMatch"`: если в первом проходе маршрутизации не сработало ни одно правило, разрешение выполняется при условии, что цель содержит доменное имя и хотя бы одно правило содержит условие `ip`.
- `"IPOnDemand"`: разрешение выполняется, если цель содержит доменное имя и встречается правило с условием `ip`.
@@ -14,6 +15,7 @@
- На этапе исходящего подключения: разрешение целевых доменных имен для подключения или передачи удаленному прокси-серверу.
::: details Подробное объяснение
- Например, если в исходящем подключении VLESS задать `targetStrategy` равным `UseIP`, целевой домен проксируемого запроса сначала разрешается локальным встроенным модулем DNS, затем полученный IP передается удаленному прокси-серверу.
- Если в исходящем подключении VLESS задать `sockopt.domainStrategy` равным `UseIP`, домен сервера VLESS разрешается встроенным модулем DNS, затем устанавливается соединение с полученным IP.
- Если в исходящем подключении Freedom задать `sockopt.domainStrategy` равным `UseIP`, целевой домен запроса разрешается встроенным модулем DNS, затем устанавливается соединение с полученным IP.
@@ -23,6 +25,7 @@
- Перехват DNS-трафика в режиме TUN/прозрачного прокси с помощью маршрутизации и исходящего подключения DNS для направления запросов в этот модуль; либо использование [Tunnel](./inbounds/tunnel.md) для открытия порта 53 и работы в качестве рекурсивного DNS-сервера.
::: details Подробное объяснение
- Поддерживаются только базовые IP-запросы (записи A и AAAA). Записи CNAME будут запрашиваться повторно до тех пор, пока не будет возвращена запись A/AAAA. Другие типы запросов не попадают во встроенный DNS-сервер, а либо отбрасываются, либо передаются другим серверам в зависимости от вашей конфигурации исходящего подключения.
:::
@@ -31,6 +34,8 @@
Домен сначала проходит проверку сопоставления Hosts (см. поле `hosts`). Если нужный IP не найден, для запроса используется DNS-сервер.
Если настроен `script`, дальнейшие DNS-запросы передаются [скрипту Lua](../development/lua/guide/dns.md), а описанный ниже встроенный процесс обработки не выполняется.
Затем ядро начинает строить список серверов, сортируя их в зависимости от запрашиваемого домена по следующим правилам.
- Построение списка 1: содержит серверы, у которых поле `domains` успешно совпало с запрашиваемым доменом, в порядке их появления в конфигурационном файле.
@@ -54,6 +59,7 @@
"baidu.com": "127.0.0.1",
"dns.google": ["8.8.8.8", "8.8.4.4"]
},
"script": "",
"servers": [
"8.8.8.8",
"8.8.4.4",
@@ -107,6 +113,10 @@
Формат сопоставления (`domain:`, `full:` и т.д.) аналогичен `domain` в системе [маршрутизации](./routing.md#ruleobject). Отличие в том, что без префикса здесь по умолчанию используется `full:` (аналогично стандартному файлу hosts).
> `script`: string
Путь к файлу скрипта Lua; по умолчанию пустая строка. Если задан, обработка встроенного DNS передаётся скрипту Lua. Использование описано в [руководстве по скриптам DNS](../development/lua/guide/dns.md).
> `servers`: \[string | [DnsServerObject](#dnsserverobject) \]
Список DNS-серверов. Поддерживаются два типа: адрес DNS (строка) и [DnsServerObject](#dnsserverobject).
@@ -267,6 +277,7 @@ IP-адрес, используемый в расширении EDNS Client Subn
```json
{
"id": "primary",
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
@@ -281,6 +292,10 @@ IP-адрес, используемый в расширении EDNS Client Subn
}
```
> `id`: string
Идентификатор сервера; если не задан, используется пустая строка. Скрипты Lua обращаются к [`serverObj.ID`](../development/lua/reference/module-dns.md#id), чтобы определить вышестоящий сервер.
> `address`: address
Список DNS-серверов. Поддерживаются два типа: адрес DNS (строка) и DnsServerObject.
+5
View File
@@ -15,6 +15,7 @@
"routing": {
"domainStrategy": "AsIs",
"rules": [],
"script": "",
"balancers": []
}
}
@@ -44,6 +45,10 @@
Если ни одно правило не совпадает, трафик по умолчанию отправляется через первый исходящий канал.
:::
> `script`: string
Путь к файлу скрипта Lua; по умолчанию пустая строка. Если задан, выбор исходящего подключения передаётся скрипту Lua. Использование описано в [руководстве по скриптам маршрутизации](../development/lua/guide/routing.md).
> `balancers`: \[ [BalancerObject](#balancerobject) \]
Массив, каждый элемент которого является конфигурацией балансировщика нагрузки.