مسیریابی — 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:77-81 · ثابتشده در v1.260327.0 (d2758a0)
rules[] — شیء قاعده
هر قاعده یک شیء JSON است که کلیدهای تطبیق آن مجموعهای از اتصالها را انتخاب میکنند و کلیدهای مقصد آن تصمیم میگیرند که به کجا بروند. شکل چندریختی است؛ تحلیلگر بررسی میکند کدام کلیدهای تطبیق وجود دارند.
کلیدهای تطبیق (همه اختیاری، با AND ترکیب میشوند):
| فیلد | نوع | توضیح |
|---|---|---|
type | string | باید "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). |
port | string | تطبیق بر اساس پورت مقصد. 80, 80-90, 80,443,8080-8090. |
sourcePort | string | تطبیق بر اساس پورت منبع (همان نحو). |
network | string | تطبیق بر اساس ترابرد. tcp, udp, tcp,udp. |
user | []string | تطبیق بر اساس تگ ایمیل کاربر ورودی. |
inboundTag | []string | تطبیق بر اساس تگ ورودی. |
protocol | []string | تطبیق بر اساس پروتکل لایهٔ برنامه که اسنیف شده است. http, tls, bittorrent, quic. اسنیف باید روی ورودی فعال باشد. |
attrs | map[string]string | تطبیق بر اساس صفات اسنیفشده (مثلاً Host). |
domainMatcher | string | پیادهسازی تطبیقدهندهٔ دامنه. hybrid (پیشفرض، سریع) یا linear. |
کلیدهای مقصد (یکی الزامی است):
| فیلد | توضیح |
|---|---|
outboundTag | ترافیک تطبیقیافته را به این خروجی بفرست. |
balancerTag | ترافیک تطبیقیافته را به یک توازندهنده بفرست (که خروجیای را از استخر خود انتخاب میکند). |
به علاوهٔ فیلد فراداده:
| فیلد | توضیح |
|---|---|
ruleTag | یک نام خوانا برای انسان برای این قاعده. در API و گزارشها نمایش داده میشود. |
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`](./observatory) نیاز دارد)؛ `leastLoad` کمبارترین را انتخاب میکند. |
fallbackTag | string | (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 (الگوی متعارف چین):
{
"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, …) در آن فایلها تعریف شدهاند. - توازندهندهها با
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)
