مسیریابی — Xray-core
بلوک routing موتوری است که تصمیم میگیرد یک اتصال از کدام خروجی استفاده کند. حاوی فهرستی از قواعد (که به ترتیب تطبیق میشوند، اولین برنده است)، یک domainStrategy سراسری و balancers نامگذاریشده است که میتوانند بهعنوان مقاصد قواعد استفاده شوند.
گزینههای سطح بالا
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
rules | []json.RawMessage | [] | <rule object array> | قواعد مسیریابی، به ترتیب اعلام ارزیابی میشوند. اولین قاعدهٔ تطبیقیافته برنده است. |
domainStrategy | *string | AsIs | AsIs | 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 ترکیب میشوند):
| فیلد | نوع | توضیح |
|---|---|---|
type | string | باید "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 به کار میرود. |
port | string | تطبیق بر اساس پورت مقصد. 80, 80-90, 80,443,8080-8090. |
sourcePort | string | تطبیق بر اساس پورت منبع (همان نحو). |
localIP | []string | تطبیق بر اساس آدرس محلیای که اتصال روی آن رسیده است (IP خود ورودی). همان نحو ip. |
localPort | string | تطبیق بر اساس پورت محلیای که اتصال روی آن رسیده است (پورت ورودی). همان نحو port. |
network | string | تطبیق بر اساس ترابرد. tcp, udp, tcp,udp. |
user | []string | تطبیق بر اساس تگ ایمیل کاربر ورودی. |
vlessRoute | string | فقط ورودیهای VLESS: تطبیق بر اساس بایتهای 7 و 8 از UUID ارسالی کلاینت — یعنی گروه سوم UUID که بهصورت عدد هگزادسیمال خوانده میشود (مثلاً …-01bb-… = 443). نحو فهرست پورت ("443"، "1-100,443"). به یک سرور اجازه میدهد بر اساس مقداری که در UUIDهای کلاینت جاسازی شده مسیریابی کند. |
inboundTag | []string | تطبیق بر اساس تگ ورودی. |
protocol | []string | تطبیق بر اساس پروتکل لایهٔ برنامه که اسنیف شده است. http, tls, bittorrent, quic. اسنیف باید روی ورودی فعال باشد. |
attrs | map[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 و …؛ بدون حساسیت به بزرگی و کوچکی حروف). یکبار هنگام ساخت قاعده ارزیابی میشود — برای پیکربندی مشترک میان چند دستگاه مفید است. |
domainMatcher | string | پیادهسازی تطبیقدهندهٔ دامنه. hybrid (پیشفرض، سریع) یا linear. |
کلیدهای مقصد (یکی الزامی است):
| فیلد | توضیح |
|---|---|
outboundTag | ترافیک تطبیقیافته را به این خروجی بفرست. |
balancerTag | ترافیک تطبیقیافته را به یک توازندهنده بفرست (که خروجیای را از استخر خود انتخاب میکند). |
به علاوهٔ فیلدهای فراداده:
| فیلد | توضیح |
|---|---|
ruleTag | یک نام خوانا برای انسان برای این قاعده. در API و گزارشها نمایش داده میشود. |
webhook | { url, deduplication, headers }. وقتی قاعده تطبیق یابد، یک رویداد JSON (تگهای ورودی / خروجی، منبع، مقصد، ایمیل کاربر، پروتکل، مهر زمانی و …) با POST به url فرستاده میشود (مهلت 5 ثانیه؛ شکل URL سوکت Unix نیز پذیرفته میشود). deduplication رویدادهای تکراری برای همان ایمیل کاربر را در این تعداد ثانیه سرکوب میکند (0 = خاموش)؛ headers به درخواست افزوده میشوند. مسیریابی را تغییر نمیدهد. |
balancers[]
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
tag | string | (required) | <string> | نام توازندهنده. توسط فیلد balancerTag قواعد مسیریابی استفاده میشود. |
selector | StringList | (required) | [<outbound-tag prefix>] | پیشوندهای تگ خروجی. هر خروجیای که تگش با یکی از اینها شروع شود در استخر توازندهنده گنجانده میشود. |
strategy | StrategyConfig | {type: "random"} | {type: "random|leastLoad|leastPing|roundRobin", settings?: {...}} | استراتژی انتخاب. random هر عضوی از استخر را انتخاب میکند؛ roundRobin بهنوبت میچرخد؛ leastPing کمترین تأخیر مشاهدهشده را انتخاب میکند (به observatory نیاز دارد)؛ leastLoad کمبارترین را انتخاب میکند. |
fallbackTag | string | (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 (الگوی متعارف چین):
{
"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" }
]
}
}مسیریابی پشتیبانیشده با توازندهنده با انتخاب مبتنی بر تأخیر:
{
"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"
}
}تطبیق بر اساس پروتکل برنامه (به اسنیف ورودی نیاز دارد):
{
"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)
