Skip to content

ECH — Xray-core

Encrypted Client Hello (ECH) نام SNI را با رمزنگاری ClientHello با کلید عمومی منتشرشدهٔ سرور از دید ناظران مسیر پنهان می‌سازد. Xray ECH را به‌صورت چهار فیلد روی بلوک استاندارد tlsSettings ارائه می‌کند — بدون ساختار ECH جداگانه.

پیکربندی

ECH در streamSettings.tlsSettings قرار می‌گیرد:

فیلدسمتنوعپیش‌فرضمجازتوضیح
echServerKeysورودیstring(تنظیم‌نشده)base64 ECH key bundleمجموعه کلید ECH سرور. کنار گواهی TLS خود تولید کنید.
echConfigListخروجیstring(تنظیم‌نشده)base64 ECHConfigListیک لیست پیکربندی مشخص را ثابت کنید. وقتی تنظیم نشود، کلاینت به‌طور خودکار از طریق رکوردهای HTTPS DNS کشف می‌کند.
echForceQueryخروجیstring(آبشاری)hkdf, dnsیک مکانیسم کشف خاص را اجبار می‌کند.
echSockoptخروجیSocketConfig(تنظیم‌نشده)socket optionsگزینه‌های سوکت اعمال‌شده به درخواست 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 از طریق HTTPS DNS:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "alpn": ["h2", "http/1.1"]
    }
  }
}

ECH فرصت‌طلبانه است — وقتی echConfigList صریحی تنظیم نشود، Xray رکورد HTTPS DNS برای serverName را پرس‌وجو می‌کند و در صورت وجود از پیکربندی منتشرشده استفاده می‌کند.

خروجی — یک پیکربندی ECH خاص را ثابت کنید:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "echConfigList": "<base64 ECHConfigList>",
      "echForceQuery": "dns"
    }
  }
}

نکات

  • ECH به TLS 1.3 نیاز دارد. اگر می‌خواهید در لایهٔ پروتکل اجبار کنید، minVersion: "1.3" را تنظیم کنید.
  • مقدار serverName در ECH (در بالا example.com) نام عمومی است — SNI قابل مشاهده روی سیم. مقدار inner ServerName (که ECH رمزنگاری می‌کند) از مقصد واقعی درخواست استخراج می‌شود.
  • echConfigList را فقط زمانی ثابت کنید که هر دو سمت را کنترل می‌کنید. کشف خودکار قوی‌تر است چون پیکربندی منتشرشده می‌تواند بدون تنظیم مجدد کلاینت چرخش کند.
  • echForceQuery: "dns" کش HKDF در حافظه را رد می‌کند و یک جست‌وجوی DNS تازه را اجبار می‌کند. وقتی کلیدها به‌سرعت چرخش می‌کنند مفید است.

نکات بین‌هسته‌ای

  • sing-box ساختارهای اختصاصی InboundECHOptions و OutboundECHOptions را زیر tls.ech دارد. ببینید ECH — sing-box.
  • mihomo یک بلوک ech-opts در سطح هر پراکسی با سه فیلد (enable, config, query-server-name) ارائه می‌کند. ببینید ECH — mihomo.

منبع: infra/conf/transport_internet.go:663-666 · v1.260327.0 (d2758a0)

Core Tutorial اثر Argsment