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:71-75 · ثابت‌شده در v26.9.9 (52a412d)

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

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

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

فیلدنوعتوضیح
typestringباید "field" باشد — تنها نوع قاعده‌ای که Xray پشتیبانی می‌کند.
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).
sourceIP[]stringمانند source (همان نحو ip)؛ وقتی هر دو تنظیم شوند، sourceIP به کار می‌رود.
portstringتطبیق بر اساس پورت مقصد. 80, 80-90, 80,443,8080-8090.
sourcePortstringتطبیق بر اساس پورت منبع (همان نحو).
localIP[]stringتطبیق بر اساس آدرس محلی‌ای که اتصال روی آن رسیده است (IP خود ورودی). همان نحو ip.
localPortstringتطبیق بر اساس پورت محلی‌ای که اتصال روی آن رسیده است (پورت ورودی). همان نحو port.
networkstringتطبیق بر اساس ترابرد. tcp, udp, tcp,udp.
user[]stringتطبیق بر اساس تگ ایمیل کاربر ورودی.
vlessRoutestringفقط ورودی‌های VLESS: تطبیق بر اساس بایت‌های 7 و 8 از UUID ارسالی کلاینت — یعنی گروه سوم UUID که به‌صورت عدد هگزادسیمال خوانده می‌شود (مثلاً …-01bb-… = 443). نحو فهرست پورت ("443"، "1-100,443"). به یک سرور اجازه می‌دهد بر اساس مقداری که در UUIDهای کلاینت جاسازی شده مسیریابی کند.
inboundTag[]stringتطبیق بر اساس تگ ورودی.
protocol[]stringتطبیق بر اساس پروتکل لایهٔ برنامه که اسنیف شده است. http, tls, bittorrent, quic. اسنیف باید روی ورودی فعال باشد.
attrsmap[string]stringتطبیق بر اساس صفات اسنیف‌شده (مثلاً Host).
process[]stringتطبیق بر اساس فرایند محلی‌ای که اتصال را باز کرده است: نام فرایند (curl؛ پسوند .exe نادیده گرفته می‌شود)، مسیر مطلق (/usr/bin/curl)، پوشه‌ای که به / ختم می‌شود (تطبیق پیشوندی)، self/ (فرایند خود Xray) یا xray/ (مسیر فایل اجرایی Xray). فقط اتصال‌های TCP / UDP از همان دستگاه را تطبیق می‌دهد؛ در Linux، Android، Windows و macOS پشتیبانی می‌شود.
localOS[]stringتطبیق بر اساس سیستم‌عاملی که خود Xray روی آن اجرا می‌شود (runtime.GOOS در Go: linux، windows، darwin، android، ios، freebsd و …؛ بدون حساسیت به بزرگی و کوچکی حروف). یک‌بار هنگام ساخت قاعده ارزیابی می‌شود — برای پیکربندی مشترک میان چند دستگاه مفید است.
domainMatcherstringپیاده‌سازی تطبیق‌دهندهٔ دامنه. hybrid (پیش‌فرض، سریع) یا linear.

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

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

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

فیلدتوضیح
ruleTagیک نام خوانا برای انسان برای این قاعده. در API و گزارش‌ها نمایش داده می‌شود.
webhook{ url, deduplication, headers }. وقتی قاعده تطبیق یابد، یک رویداد JSON (تگ‌های ورودی / خروجی، منبع، مقصد، ایمیل کاربر، پروتکل، مهر زمانی و …) با POST به url فرستاده می‌شود (مهلت 5 ثانیه؛ شکل URL سوکت Unix نیز پذیرفته می‌شود). deduplication رویدادهای تکراری برای همان ایمیل کاربر را در این تعداد ثانیه سرکوب می‌کند (0 = خاموش)؛ headers به درخواست افزوده می‌شوند. مسیریابی را تغییر نمی‌دهد.

balancers[] ​

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

منبع: infra/conf/router.go:21-26 · ثابت‌شده در v26.9.9 (52a412d)

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

  • 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, …) در آن فایل‌ها تعریف شده‌اند.
  • این فایل‌های داده می‌توانند به‌طور خودکار به‌روزرسانی شوند: بلوک سطح بالای geodata نسخه‌های تازهٔ geoip.dat / geosite.dat را بر اساس یک زمان‌بندی cron از طریق یک خروجی انتخاب‌شده دانلود می‌کند. ببینید Geodata.
  • اسنیف ورودی، کلیدهای تطبیق protocol و attrs را تغذیه می‌کند. بلوک sniffing ورودی destOverride به علاوهٔ فهرست‌های استثنای domainsExcluded و ipsExcluded را می‌گیرد که بازنویسی مقصد را برای دامنه‌ها / IPهای تطبیق‌یافته رد می‌کنند (به‌همراه metadataOnly و routeOnly).
  • توازن‌دهنده‌ها با 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:21-75 · v26.9.9 (52a412d)

Core Tutorial اثر Argsment