ECH — Xray-core
Encrypted Client Hello (ECH) скрывает SNI от наблюдателей на пути, шифруя ClientHello открытым ключом, опубликованным сервером. Xray предоставляет ECH тремя полями в стандартном блоке tlsSettings — отдельной структуры ECH нет.
Конфигурация
ECH живёт в streamSettings.tlsSettings:
| Поле | Сторона | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|---|
echServerKeys | Входящая | string | (не задано) | связка ключей ECH в base64 | Набор серверных ключей ECH. Генерируется вместе с вашим TLS-сертификатом. |
echConfigList | Исходящая | string | (не задано) | ECHConfigList в base64 | Закрепить конкретный список конфигураций. Если не задан, клиент обнаруживает его автоматически через DNS-записи HTTPS. |
echSockopt | Исходящая | SocketConfig | (не задано) | параметры сокета | Параметры сокета, применяемые к DNS-запросу обнаружения ECH. |
Примеры
Входящее подключение — обслуживание ECH вместе с обычным TLS:
json
{
"streamSettings": {
"security": "tls",
"tlsSettings": {
"serverName": "example.com",
"certificates": [{ "certificateFile": "/etc/ssl/cert.pem", "keyFile": "/etc/ssl/key.pem" }],
"echServerKeys": "<base64 ECHConfigList + private keys>"
}
}
}Исходящее подключение — автообнаружение ECH через DNS-записи HTTPS:
json
{
"streamSettings": {
"security": "tls",
"tlsSettings": {
"serverName": "example.com",
"alpn": ["h2", "http/1.1"]
}
}
}ECH оппортунистичен: когда явный echConfigList не задан, Xray запрашивает DNS-запись HTTPS для serverName и использует опубликованную конфигурацию, если она найдена.
Исходящее подключение — закрепление конкретной конфигурации ECH:
json
{
"streamSettings": {
"security": "tls",
"tlsSettings": {
"serverName": "example.com",
"echConfigList": "<base64 ECHConfigList>"
}
}
}Примечания
- ECH требует TLS 1.3. Задайте
minVersion: "1.3", если хотите принудительно закрепить это на уровне протокола. - Значение
serverNameдля ECH (example.comвыше) — это публичное имя, SNI, видимый на проводе. «Внутреннее» (inner) ServerName — то, которое шифрует ECH, — выводится из фактического адреса назначения запроса. - Закрепляйте
echConfigListтолько когда контролируете обе стороны. Автообнаружение надёжнее: опубликованная конфигурация может ротироваться без перенастройки клиента.
Сравнение с другими ядрами
- У sing-box есть отдельные структуры
InboundECHOptionsиOutboundECHOptionsвtls.ech. См. ECH — sing-box. - mihomo предоставляет на каждом прокси блок
ech-optsс тремя полями (enable,config,query-server-name). См. ECH — mihomo.
Исходный код: infra/conf/transport_security.go:316-318 · v26.7.28 (5ca6f4b)
