Skip to content

مسیریابی — sing-box ​

بلوک route در sing-box قواعد، مجموعه قواعد، و چند کلید تغییر وضعیت رابط پیش‌فرض / جستجوی فرایند را نگه می‌دارد. قواعد چندریختی هستند (default + logical) و یک action صریح حمل می‌کنند که یکی از هشت رفتار را انتخاب می‌کند.

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

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
geoip*GeoIPOptions(ignored)GeoIPOptionsپایگاه‌دادهٔ GeoIP پشتیبانی نمی‌شود: این بلوک تجزیه می‌شود اما نادیده گرفته می‌شود؛ از rule-set استفاده کنید.
geosite*GeositeOptions(ignored)GeositeOptionsپایگاه‌دادهٔ GeoSite پشتیبانی نمی‌شود: این بلوک تجزیه می‌شود اما نادیده گرفته می‌شود؛ از rule-set استفاده کنید.
rules[]Rule[][Rule]قواعد مسیریابی، به ترتیب ارزیابی می‌شوند.
rule_set[]RuleSet[][RuleSet]مجموعه قواعد نام‌گذاری‌شده — از طریق کلیدهای تطبیق rule_set در قواعد ارجاع داده می‌شوند. سه نوع: inline، local، remote.
finalstring(unset)<outbound tag>خروجی پیش‌فرض وقتی هیچ قاعده‌ای تطبیق نمی‌یابد. وقتی تنظیم نشود، اولین خروجی در outbounds استفاده می‌شود.
find_processboolfalsetrue | falseجستجوی فرایند مبدأ برای هر اتصال. توسط قواعد process_name / process_path لازم است.
find_neighborboolfalsetrue | falseفقط Linux / macOS. حل همسایه (آدرس MAC / نام میزبان کلاینت‌های LAN) را حتی بدون قاعدهٔ source_mac_address / source_hostname برای ثبت لاگ به‌اجبار فعال می‌کند.
dhcp_lease_filesbadoption.Listable[string](auto-detected)[<file path>]فقط Linux / macOS. فایل‌های اجارهٔ DHCP برای نگاشت کلاینت‌های LAN به نام میزبان و آدرس MAC. اگر خالی باشد برای dnsmasq، odhcpd، ISC dhcpd و Kea به‌طور خودکار یافته می‌شوند.
auto_detect_interfaceboolfalsetrue | falseکشف خودکار رابط خروجی پیش‌فرض سیستم — توسط خروجی‌های Direct بدون bind_interface استفاده می‌شود.
override_android_vpnboolfalsetrue | falseفقط Android — دور زدن سرویس VPN سیستم برای شماره‌گیری‌های خروجی.
default_interfacestring(auto)<interface>بازنویسی رابط خروجی پیش‌فرض. auto_detect_interface را بازنویسی می‌کند.
default_markFwMark0<uint32>SO_MARK لینوکس که روی سوکت‌های خروجی اعمال می‌شود.
default_domain_resolver*DomainResolveOptions(none)DomainResolveOptionsحل‌کنندهٔ پیش‌فرض برای دامنه‌های مقصد وقتی هیچ قاعده‌ای یکی را مشخص نمی‌کند.
default_network_strategy*NetworkStrategy(unset)NetworkStrategyاستراتژی شبکهٔ پیش‌فرض که توسط مسابقه‌های شماره‌گیری Happy-Eyeballs / cellular-vs-wifi استفاده می‌شود.
default_network_typebadoption.Listable[InterfaceType][]<InterfaceType>انواع شبکهٔ ترجیحی برای خروجی پیش‌فرض.
default_fallback_network_typebadoption.Listable[InterfaceType][]<InterfaceType>انواع شبکهٔ پشتیبان وقتی نوع ترجیحی شکست می‌خورد.
default_fallback_delaybadoption.Duration0<duration>تأخیر پیش از تعویض به یک شبکهٔ پشتیبان.
default_http_clientstring(first http_clients entry)<http client tag>برچسب ورودی سطح بالای http_clients که مجموعه قواعد راه دورِ بدون http_client از آن استفاده می‌کنند. وقتی اصلاً http_clients وجود نداشته باشد، یک کلاینت ضمنی منسوخ که از خروجی پیش‌فرض شماره‌گیری می‌کند به کار می‌رود.

منبع: option/route.go:5-24 · ثابت‌شده در v1.14.2 (af6e64c)

قواعد ​

هر ورودی در rules[] یک شیء چندریختی Rule است. فیلد type شکل را تعیین می‌کند:

  • type: "default" (یا حذف‌شده) — RawDefaultRule تخت با فیلدهای تطبیق + یک RuleAction.
  • type: "logical" — ترکیب‌کنندهٔ بولی روی قواعد تودرتو.

قاعدهٔ پیش‌فرض — فیلدهای تطبیق ​

RawDefaultRule دارای ۴۴ فیلد است، همگی اختیاری و وقتی چندتایی تنظیم شوند با AND ترکیب می‌شوند. پراستفاده‌ترین‌ها:

فیلدنوعتوضیح
inbound[]stringتطبیق بر اساس برچسب ورودی.
network[]stringtcp، udp، یا tcp,udp.
protocol[]stringپروتکل کاربردی اسنیف‌شده.
domain / domain_suffix / domain_keyword / domain_regex[]stringتطبیق‌کنندگان دامنه.
geosite / geoip / source_geoip[]stringپشتیبانی نمی‌شوند — قاعده‌ای که از آن‌ها استفاده کند در راه‌اندازی شکست می‌خورد. به‌جای آن از rule_set استفاده کنید.
ip_cidr / source_ip_cidr[]stringتطبیق CIDR.
ip_is_private / source_ip_is_privateboolتطبیق RFC1918 / link-local / loopback.
port / source_port[]uint16تطبیق پورت گسسته.
port_range / source_port_range[]stringتطبیق محدودهٔ پورت (80:90، 1024:، …).
process_name / process_path / process_path_regex[]stringتطبیق فرایند (به find_process: true نیاز دارد).
package_name[]stringنام بستهٔ Android (UID از طریق API سیستم حل می‌شود). package_name_regex با عبارت باقاعده تطبیق می‌دهد.
source_mac_address / source_hostname[]stringآدرس MAC / نام میزبان DHCP دستگاه مبدأ، از طریق حل همسایه (Linux، macOS، یا کلاینت‌های گرافیکی Android / macOS).
user / user_id[]string / []int32کاربر محلی / UID.
clash_modestringفقط زمانی تطبیق کند که حالت زمان اجرا (کنترل‌شده از طریق Clash API) با این رشته تطبیق یابد.
wifi_ssid / wifi_bssid[]stringمسیریابی Wifi-آگاه (فقط موبایل).
network_is_expensive / network_is_constrainedboolپرچم‌های نوع شبکهٔ iOS/macOS.
rule_set[]stringتطبیق اگر هر یک از مجموعه قواعد نام‌گذاری‌شده تطبیق یابد.
invertboolمعکوس‌کردن کل نتیجهٔ تطبیق قاعده.

قاعدهٔ منطقی ​

json
{
  "type": "logical",
  "mode": "and",
  "rules": [ <Rule>, <Rule>, … ],
  "invert": false,
  "action": "..."
}

mode می‌تواند and (پیش‌فرض) یا or باشد. قواعد تودرتو می‌توانند خودشان منطقی باشند.

کنش قاعده ​

هر قاعده یک کنش حمل می‌کند که تصمیم می‌گیرد در تطبیق چه اتفاقی بیفتد. هشت مقدار کنش:

کنشمعنا
route (پیش‌فرض)ارسال به outbound. فیلدهای اضافی: override_address، override_port، network_strategy، udp_*، tls_fragment*، tls_spoof / tls_spoof_method.
route-optionsاعمال گزینه‌های مسیر روی تطبیق‌های بعدی بدون خروج از زنجیرهٔ قاعده.
directشماره‌گیری مستقیم — دور زدن کامل خروجی‌ها (از default_interface و غیره استفاده می‌کند).
bypassشکل یکسان با route، عمداً جدا برای گزارش‌گیری.
rejectحذف اتصال. با method: "drop" یا method: "default".
hijack-dnsربودن اتصال انگار که DNS باشد، مسیریابی به موتور DNS.
sniffاجرای اسنیف پروتکل روی اتصال. برای اتصال‌های UDP از ورودی‌های L3 (TUN، WireGuard، Tailscale) در پیش‌تطبیق نیز روی نخستین بسته اجرا می‌شود.
resolveحل‌وفصل دامنهٔ مقصد از طریق سرور DNS نام‌گذاری‌شده پیش از اجرای قواعد بعدی. timeout و disable_optimistic_cache اختیاری.

مجموعه قواعد ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
typestringinlineinline | local | remoteمحل قرارگیری مجموعه قواعد. inline قواعد را درست در همین پیکربندی نگه می‌دارد؛ local از یک مسیر فایل می‌خواند؛ remote از یک URL دانلود می‌کند.
tagbadoption.Listable[string](required)<string> | [<string>]نام مرجع که توسط کلید تطبیق rule_set قواعد استفاده می‌شود. یک فهرست، چند مجموعه قواعد با گزینه‌های مشترک تعریف می‌کند؛ {tag} در path، url یا initial_path با هر برچسب جایگزین می‌شود (با چند برچسب الزامی است؛ با type: inline مجاز نیست).
formatstring(inferred)source | binaryقالب فایل. source همان JSON است؛ binary قالب کامپایل‌شدهٔ .srs است. وقتی تنظیم نشود، از پسوند فایل استنباط می‌شود.

منبع: option/rule_set.go:22-29 · ثابت‌شده در v1.14.2 (af6e64c)

مجموعه قواعد محلی ​

json
{ "type": "local", "tag": "cn", "format": "binary", "path": "geosite-cn.srs" }

مجموعه قواعد راه دور ​

json
{
  "type": "remote",
  "tag": "cn",
  "format": "binary",
  "url": "https://example.com/geosite-cn.srs",
  "http_client": { "detour": "direct" },
  "update_interval": "168h"
}

مجموعه قواعد درون‌خطی ​

json
{
  "type": "inline",
  "tag": "block",
  "rules": [
    { "domain_keyword": ["ads", "tracker"] }
  ]
}

rules در شکل درون‌خطی همان HeadlessRule هستند — از نظر ساختاری مشابه قواعد مسیریابی اما بدون فیلد action (کنش هرچه قاعدهٔ ارجاع‌دهنده انجام دهد است).

مثال‌ها ​

CN-مستقیم + بقیه از طریق proxy:

json
{
  "route": {
    "rule_set": [
      { "type": "remote", "tag": "geoip-cn", "format": "binary",
        "url": "https://github.com/SagerNet/sing-geoip/raw/rule-set/geoip-cn.srs" },
      { "type": "remote", "tag": "geosite-cn", "format": "binary",
        "url": "https://github.com/SagerNet/sing-geosite/raw/rule-set/geosite-cn.srs" }
    ],
    "rules": [
      { "ip_is_private": true, "outbound": "direct" },
      { "rule_set": ["geoip-cn", "geosite-cn"], "outbound": "direct" },
      { "action": "sniff" },
      { "protocol": "dns", "action": "hijack-dns" }
    ],
    "final": "proxy",
    "find_process": false,
    "auto_detect_interface": true
  }
}

رد تبلیغات با یک مجموعه قواعد درون‌خطی:

json
{
  "route": {
    "rule_set": [
      {
        "type": "inline",
        "tag": "ads",
        "rules": [
          { "domain_keyword": ["doubleclick", "googlesyndication"] }
        ]
      }
    ],
    "rules": [
      { "rule_set": "ads", "action": "reject" }
    ]
  }
}

قاعدهٔ منطقی OR:

json
{
  "type": "logical",
  "mode": "or",
  "rules": [
    { "domain_suffix": [".onion"] },
    { "rule_set": ["tor-exit"] }
  ],
  "outbound": "tor"
}

نکات ​

  • geoip / geosite پشتیبانی نمی‌شوند: بلوک‌های سطح بالا تجزیه ولی نادیده گرفته می‌شوند و اقلام قاعدهٔ geoip / geosite / source_geoip باعث شکست قاعده در راه‌اندازی می‌شوند. داده‌های معادل را از طریق rule_set (فایل‌های .srs راه دور) بارگذاری کنید و از طریق فیلد تطبیق rule_set قاعده به آن‌ها ارجاع دهید.
  • مجموعه قواعد راه دور از طریق یک کلاینت HTTP دانلود می‌شوند: http_client یک شیء درون‌خطی (موتور، TLS و فیلدهای شماره‌گیری مانند detour) یا برچسب یک ورودی سطح بالای http_clients می‌پذیرد؛ در نبود آن، route.default_http_client یا نخستین ورودی http_clients به کار می‌رود. download_detour به نفع http_client منسوخ شده است. initial_path مجموعه قواعد را از یک فایل محلی مقداردهی اولیه می‌کند تا راه‌اندازی منتظر نخستین دانلود نماند.
  • تطبیق مجموعه قواعد: فیلدهای یک مجموعه قواعد ارجاع‌شده فقط وقتی در قاعدهٔ ارجاع‌دهنده ادغام می‌شوند که دقیقاً یک قاعدهٔ default بدون invert داشته باشد؛ هر مجموعه قواعد دیگری به‌صورت یک شرط مستقل ارزیابی می‌شود که با تطبیق هر یک از قواعدش برقرار است.
  • source_mac_address / source_hostname به حل همسایه متکی‌اند که با وجود چنین قواعدی (یا neighbor_domain در یک سرور DNS محلی) خودکار فعال می‌شود؛ find_neighbor آن را برای لاگ به‌اجبار فعال می‌کند و dhcp_lease_files در Linux / macOS نام‌های میزبان را فراهم می‌کند.
  • rule_set_ip_cidr_match_source (snake_case در ساختار) کنترل می‌کند که آیا قواعد IP-CIDR یک مجموعه قواعد روی مبدأ یا مقصد تطبیق یابند. نام مستعار rule_set_ipcidr_match_source منسوخ است.
  • کنش‌های قاعدهٔ sniff و resolve معمولاً در سر فهرست قواعد استفاده می‌شوند تا قواعد بعدی فراداده‌های مفیدی ببینند. موتور DNS برای ربودن پرس‌وجوهای DNS که موتور مسیریابی می‌خواهد رسیدگی کند، به hijack-dns متکی است.
  • clash_mode فقط در صورتی اثر می‌گذارد که Clash API فعال باشد — حالت از آنجا می‌آید.

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

  • Xray-core از یک شکل قاعدهٔ چندریختی منفرد با نام‌های فیلد camelCase و مجموعه‌کلید تطبیق بسیار کوچک‌تر استفاده می‌کند. هیچ enum actionی وجود ندارد — هر قاعده به یک outboundTag یا balancerTag مسیریابی می‌شود. بنگرید به مسیریابی — Xray-core.
  • mihomo از قواعد رشته‌ای یک‌خطی فشرده (DOMAIN-SUFFIX,example.com,proxy) و یک سازوکار جداگانهٔ rule-providers: برای فهرست‌های قواعد راه دور استفاده می‌کند. بنگرید به مسیریابی — mihomo.

منبع: option/route.go:5-24 · v1.14.2 (af6e64c)

Core Tutorial اثر Argsment