Skip to content

مسیریابی — Xray-core

بلوک routing موتوری است که تصمیم می‌گیرد یک اتصال از کدام خروجی استفاده کند. حاوی فهرستی از قواعد (که به ترتیب تطبیق می‌شوند، اولین برنده است)، یک domainStrategy سراسری و balancers نام‌گذاری‌شده است که می‌توانند به‌عنوان مقاصد قواعد استفاده شوند.

گزینه‌های سطح بالا

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
rules[]json.RawMessage[]<rule object array>قواعد مسیریابی، به ترتیب اعلام ارزیابی می‌شوند. اولین قاعدهٔ تطبیق‌یافته برنده است.
domainStrategy*stringAsIsAsIs | IpIfNonMatch | IpOnDemandنحوهٔ حل دامنه‌های مقصد برای تطبیق قاعده. `AsIs` دامنه‌ها را به‌عنوان رشته نگه می‌دارد (فقط قواعد دامنه تطبیق می‌یابند)؛ `IpIfNonMatch` وقتی هیچ قاعدهٔ دامنه‌ای تطبیق نکند به IP حل می‌کند؛ `IpOnDemand` هر زمان قواعد IP وجود داشته باشند از پیش به IP حل می‌کند.
balancers[]*BalancingRule[][BalancingRule]توازن‌دهنده‌های بار نام‌گذاری‌شده که به‌عنوان `balancerTag` در مقاصد قاعده قابل استفاده‌اند.

منبع: infra/conf/router.go:77-81 · ثابت‌شده در v1.260327.0 (d2758a0)

rules[] — شیء قاعده

هر قاعده یک شیء JSON است که کلیدهای تطبیق آن مجموعه‌ای از اتصال‌ها را انتخاب می‌کنند و کلیدهای مقصد آن تصمیم می‌گیرند که به کجا بروند. شکل چندریختی است؛ تحلیل‌گر بررسی می‌کند کدام کلیدهای تطبیق وجود دارند.

کلیدهای تطبیق (همه اختیاری، با AND ترکیب می‌شوند):

فیلدنوعتوضیح
typestringباید "field" باشد (مقادیر قدیمی "chain" و انواع دیگر در V2Ray وجود داشتند؛ اکنون فقط field پشتیبانی می‌شود).
domain / domains[]stringتطبیق بر اساس دامنهٔ مقصد. الگوها را می‌پذیرد: full:example.com, domain:example.com, regexp:.+\\.com$, keyword:google, geosite:cn.
ip[]stringتطبیق بر اساس IP مقصد. IP ساده، CIDR، geoip:cn را می‌پذیرد.
source[]stringتطبیق بر اساس IP منبع (همان نحو ip).
portstringتطبیق بر اساس پورت مقصد. 80, 80-90, 80,443,8080-8090.
sourcePortstringتطبیق بر اساس پورت منبع (همان نحو).
networkstringتطبیق بر اساس ترابرد. tcp, udp, tcp,udp.
user[]stringتطبیق بر اساس تگ ایمیل کاربر ورودی.
inboundTag[]stringتطبیق بر اساس تگ ورودی.
protocol[]stringتطبیق بر اساس پروتکل لایهٔ برنامه که اسنیف شده است. http, tls, bittorrent, quic. اسنیف باید روی ورودی فعال باشد.
attrsmap[string]stringتطبیق بر اساس صفات اسنیف‌شده (مثلاً Host).
domainMatcherstringپیاده‌سازی تطبیق‌دهندهٔ دامنه. hybrid (پیش‌فرض، سریع) یا linear.

کلیدهای مقصد (یکی الزامی است):

فیلدتوضیح
outboundTagترافیک تطبیق‌یافته را به این خروجی بفرست.
balancerTagترافیک تطبیق‌یافته را به یک توازن‌دهنده بفرست (که خروجی‌ای را از استخر خود انتخاب می‌کند).

به علاوهٔ فیلد فراداده:

فیلدتوضیح
ruleTagیک نام خوانا برای انسان برای این قاعده. در API و گزارش‌ها نمایش داده می‌شود.

balancers[]

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
tagstring(required)<string>نام توازن‌دهنده. توسط فیلد `balancerTag` قواعد مسیریابی استفاده می‌شود.
selectorStringList(required)[<outbound-tag prefix>]پیشوندهای تگ خروجی. هر خروجی‌ای که تگش با یکی از این‌ها شروع شود در استخر توازن‌دهنده گنجانده می‌شود.
strategyStrategyConfig{type: "random"}{type: "random|leastLoad|leastPing|roundRobin", settings?: {...}}استراتژی انتخاب. `random` هر عضوی از استخر را انتخاب می‌کند؛ `roundRobin` به‌نوبت می‌چرخد؛ `leastPing` کم‌ترین تأخیر مشاهده‌شده را انتخاب می‌کند (به [`observatory`](./observatory) نیاز دارد)؛ `leastLoad` کم‌بارترین را انتخاب می‌کند.
fallbackTagstring(unset)<outbound tag>خروجی که زمانی استفاده می‌شود که استخر توازن‌دهنده خالی باشد یا همهٔ اعضای استخر شکست بخورند.

منبع: infra/conf/router.go:27-32 · ثابت‌شده در v1.260327.0 (d2758a0)

انواع استراتژی

  • random — انتخاب تصادفی یکنواخت.
  • roundRobin — چرخش در استخر به ترتیب.
  • leastPing — انتخاب عضوی با کم‌ترین تأخیر. به observatory یا burstObservatory فعال نیاز دارد تا هر خروجی تأخیر شناخته‌شده‌ای داشته باشد.
  • leastLoad — انتخاب کم‌بارترین عضو. دارای یک strategyLeastLoadConfig است (به infra/conf/router_strategy.go رجوع کنید) با فیلدهای تنظیم بررسی سلامت.

مثال‌ها

مسیریابی مستقیم داخلی CN (الگوی متعارف چین):

json
{
  "routing": {
    "domainStrategy": "IpIfNonMatch",
    "rules": [
      { "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" },
      { "type": "field", "domain": ["geosite:cn"], "outboundTag": "direct" },
      { "type": "field", "ip": ["geoip:cn"], "outboundTag": "direct" },
      { "type": "field", "outboundTag": "proxy" }
    ]
  }
}

مسیریابی پشتیبانی‌شده با توازن‌دهنده با انتخاب مبتنی بر تأخیر:

json
{
  "routing": {
    "rules": [
      { "type": "field", "outboundTag": "direct", "domain": ["geosite:cn"] },
      { "type": "field", "balancerTag": "proxy-balance" }
    ],
    "balancers": [
      {
        "tag": "proxy-balance",
        "selector": ["proxy-"],
        "strategy": { "type": "leastPing" },
        "fallbackTag": "direct"
      }
    ]
  },
  "observatory": {
    "subjectSelector": ["proxy-"],
    "probeURL": "http://cp.cloudflare.com/generate_204",
    "probeInterval": "30s"
  }
}

تطبیق بر اساس پروتکل برنامه (به اسنیف ورودی نیاز دارد):

json
{
  "inbounds": [{
    "port": 1080,
    "protocol": "socks",
    "sniffing": { "enabled": true, "destOverride": ["http", "tls"] }
  }],
  "routing": {
    "rules": [
      { "type": "field", "protocol": ["bittorrent"], "outboundTag": "block" }
    ]
  }
}

نکات

  • قواعد به ترتیب اعلام ارزیابی می‌شوند. اولین قاعدهٔ تطبیق‌یافته برنده است؛ قواعد بعدی فقط ترافیک تطبیق‌نیافته را می‌بینند.
  • domainStrategy تصمیم می‌گیرد وقتی فقط قواعد IP وجود دارند چه اتفاقی بیفتد:
    • AsIs — مقاصد دامنه از قواعد IP عبور می‌کنند. ارزان‌ترین.
    • IpIfNonMatch — دامنه را فقط در صورتی به IP حل کن که هیچ قاعده‌ای روی دامنه تطبیق نکرده باشد. متعادل.
    • IpOnDemand — هر دامنه را از پیش به IP حل کن هر زمان که قواعد IP وجود داشته باشند. دقیق‌ترین، گران‌ترین.
  • پیشوندهای دامنه (full:, domain:, regexp:, keyword:, geosite:) داخل تطبیق‌دهنده تجزیه می‌شوند. بدون پیشوند، رفتار پیش‌فرض domain: (تطبیق پسوندی) است.
  • قواعد geoip: و geosite: از فایل‌های دادهٔ خارجی می‌خوانند (geoip.dat / geosite.dat) — معمولاً کنار باینری Xray قرار می‌گیرند. نام دسته‌ها (cn, private, apple, google, …) در آن فایل‌ها تعریف شده‌اند.
  • توازن‌دهنده‌ها با strategy: leastPing فقط زمانی کار می‌کنند که observatory یا burst-observatory متناظر پیکربندی شده باشد.
  • ruleTag دستکاری زمان اجرای قاعده را از طریق RoutingService gRPC امکان‌پذیر می‌کند (به API رجوع کنید).

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

  • sing-box از قواعد ساختاریافتهٔ snake_case با فیلدهای صریح برای هر معیار (domain_suffix, ip_cidr, process_name) استفاده می‌کند. قواعد می‌توانند یک action (route، direct، reject، hijack-dns، sniff، resolve، route-options) به‌جای صرفاً یک تگ خروجی داشته باشند. ببینید Routing — sing-box.
  • mihomo از قواعد فشردهٔ به‌شکل رشته (DOMAIN-SUFFIX,example.com,proxy) استفاده می‌کند که به ترتیب ارزیابی می‌شوند، به علاوهٔ مکانیسم جداگانهٔ rule-providers: برای فهرست‌های قاعدهٔ راه دور. ببینید Routing — mihomo.

منبع: infra/conf/router.go:22-130 · v1.260327.0 (d2758a0)

Core Tutorial اثر Argsment