پرش به محتویات

Soar

همهٔ قابلیت‌های هیدیفای

Soar اتصال‌های TCP شما را درون پرسش‌ها و پاسخ‌های DNS، از راه resolverهای بازگشتی، به سرور Soar خودتان می‌برد که مرجع (authority) یک zone واگذارشده است. این یک outbound است: "type": "soar" در فهرست outbounds. کلاینت همان کتابخانهٔ Go پروژهٔ Soar از تیم Lantern است (github.com/getlantern/soar) که بدون تغییر به کار می‌رود.

چرا از آن استفاده کنیم

  • مثل تونل‌های DNS دیگر (DNSTT، MasterDNS) در شبکه‌هایی کار می‌کند که تقریباً همه‌چیز مسدود است ولی DNS هنوز عبور می‌کند.
  • در برابر کارهایی طراحی شده که فیلترها و resolverها می‌کنند: هر resolver یک مسیر با زمان رفت‌وبرگشت، سابقهٔ از دست رفتن، سقف طول نام و اندازهٔ پاسخ و پنجرهٔ ازدحام خودش است؛ از دست رفتن بسته‌ها در هر دو سو زود پیدا می‌شود و فقط بسته‌های از دست رفته دوباره فرستاده می‌شوند؛ سرور پرسش‌های بیکار را نگه می‌دارد و همان لحظه که داده دارد پاسخ می‌دهد. پروژهٔ آن سرعتش را در شبکه‌های پرخطا، محدودشده و شبیه ایران و روسیه از تونل‌های DNS دیگر بیشتر اندازه گرفته است، و در حدود یک ثانیه وصل می‌شود.
  • resolverهای سالم را خودش پیدا می‌کند (کشف): از resolverهای خود دستگاه، فهرست گزیدهٔ کشور و resolverهای عمومی. هر resolver تنها وقتی به کار می‌رود که پاسخ امضاشدهٔ سرور از راه آن برگشته باشد، پس resolverهای دست‌کاری‌کننده با همین آزمون کنار می‌روند.
  • سرور خودش به مقصد وصل می‌شود: پشت آن به خروجی SOCKS یا SSH نیازی نیست.

با این همه یک تونل DNS است: در کنار پراکسی مستقیم کند است. سرور مرجع فقط به نشانی‌های عمومی روی درگاه‌های 80 و 443 وصل می‌شود، مگر با -allow-ports اجرا شود.

چطور از فیلترینگ عبور می‌کند

فیلتر پرسش‌های DNS برای نام‌هایی زیر zone شما را می‌بیند که به resolverهای معمولی فرستاده می‌شوند و آن‌ها به سرور شما می‌رسانند. هر نشست با تبادل کلید X25519 شروع می‌شود که سرور با کلید Ed25519 خود امضا می‌کند، پس پاسخ جعلی احراز نمی‌شود و نادیده گرفته می‌شود؛ داده با ChaCha20-Poly1305 مهر می‌شود. نام‌ها از ۱۰۱ نویسه شروع می‌شوند، که شبکه‌هایی که نام‌های بلند را می‌اندازند هنوز عبور می‌دهند، و فقط جایی بلندتر می‌شوند که عبور کنند. جایی که UDP/53 رهگیری می‌شود DNS روی TCP به کار می‌رود؛ جایی که رکورد TXT رد می‌شود، رکوردهای AAAA پاسخ را می‌برند.

وقتی هیچ resolverی که به آن دسترسی دارید پرسش‌های zone شما را جلو نفرستد، کمکی نمی‌کند.

چطور کار می‌کند

  • نشست. کلاینت در اولین اتصال دست می‌دهد و سپس هر اتصال را به شکل یک stream از یک نشست می‌برد. نشستی که اتصالی ندارد پس از session_idle بسته می‌شود و اتصال بعدی نشست تازه‌ای باز می‌کند.
  • resolverهای نوشته‌شده در پیکربندی. از راه مجموعهٔ هوشمند resolver خود خروجی می‌روند، که روشن است مگر smart_pool برابر false باشد: به هر کدام اول یک پرسش ساده فرستاده می‌شود (pretest_domain، pretest_record_type) و آن‌هایی که پاسخ دهند به مجموعه می‌پیوندند، تا ۱۰ تای سالم، و وقتی برخی از کار بیفتند بیشتر. کلاینت مجموعه را یک resolver روی loopback می‌بیند. resolverها آن‌گاه می‌توانند tcp://، DoT (dot://host:853) یا DoH (https://host/dns-query) هم باشند. با smart_pool: false هر resolver یک مسیر خود کلاینت است، فقط UDP ساده (و TCP، tcp را ببینید).
  • auto یا بدون resolver. کشف خود کلاینت اجرا می‌شود، همان کد کتابخانهٔ Soar: resolverهایی را که در اجراهای قبلی تأیید کرده (در فایل کش ذخیره‌شده) آزمایش می‌کند، سپس resolverهای خود دستگاه (جایی که سیستم اجازهٔ خواندنشان را بدهد)، فهرست گزیدهٔ کشور که Soar همراه دارد (ایران، چین، روسیه) و resolverهای عمومی جهانی؛ با sample_ranges نشانی‌هایی از بازه‌های کشور را هم. want تا را سالم نگه می‌دارد و وقتی برخی از کار بیفتند بیشتر پیدا می‌کند. تنظیماتش smart_pool.discovery است، بلوکی که همهٔ تونل‌های DNS مشترک دارند؛ DNSTT و MasterDNS همین نامزدها را برای auto خود می‌گیرند. این resolverها مسیرهای خود کلاینت‌اند، در کنار مجموعه وقتی پیکربندی resolver هم نوشته باشد. اگر discovery.country خالی باشد، هستهٔ هیدیفای آن را از منطقهٔ برنامه پر می‌کند.
  • سوکت‌ها. پرسش‌ها با تنظیمات سوکت خروجی (bind_interface، routing_mark) و محافظت سکو بیرون می‌روند، پس در VPN به درون تونل برنمی‌گردند؛ پرسش‌ها به مجموعه روی loopback از سوکت ساده می‌روند. detour پشتیبانی نمی‌شود.

فقط TCP. UDP برده نمی‌شود.

پیکربندی

{
  "type": "soar",
  "tag": "soar-out",
  "domain": "t.example.com",
  "public_key": "<soar-server pubkey key>",
  "resolvers": ["8.8.8.8", "1.1.1.1", "auto"],
  "smart_pool": {
    "enabled": true,
    "discovery": { "country": "ir" }
  }
}
فیلد نوع پیش‌فرض معنا
domain string الزامی zone تونل که به سرور واگذار شده است (soar-server -zone).
public_key string الزامی کلید عمومی Ed25519 سرور، همان که soar-server pubkey چاپ می‌کند (base64؛ base64url و hex هم خوانده می‌شوند).
resolvers list of strings auto resolverها: "8.8.8.8"، "1.1.1.1:5353"، یا "auto" برای کشف Soar. با مجموعهٔ هوشمند tcp://، dot://host:853 و https://host/dns-query هم.
smart_pool bool or object روشن مجموعهٔ هوشمند برای resolverهای نوشته‌شده، همان که بالا آمد؛ false خاموشش می‌کند. شیء آن تنظیمات مجموعه را می‌گیرد، از جمله discovery که کشف خود Soar را هم تنظیم می‌کند: country، sample_ranges، want (اینجا پیش‌فرض ۱۶)، concurrency (۱۶)، pace (20ms). با مجموعهٔ خاموش بنویسید {"enabled": false, "discovery": {...}}.
pretest_domain string "www.google.com" با مجموعه: نامی که برای بررسی resolver پرسیده می‌شود.
pretest_record_type string "a" با مجموعه: نوع رکورد همان پرسش.
tcp string "auto" DNS روی TCP: auto (برای resolverی که UDPش هرگز پاسخ نمی‌دهد)، on، only یا off. با مجموعه به‌تنهایی off.
safe_qname int 101 طول نامی که هر resolver از آن شروع می‌کند.
max_qname int 253 بلندترین نامی که resolver تا آن آزموده می‌شود.
max_answer int 1232 بزرگ‌ترین پاسخ DNS که تا آن آزموده می‌شود، به بایت.
hold duration 500ms سرور یک پرسش بیکار را تا کی نگه دارد.
max_inflight int 128 پرسش‌های در راه روی همهٔ resolverها (حداکثر ۱۰۲۴).
max_path_window int 32؛ با مجموعه به‌تنهایی max_inflight پرسش‌های در راه روی یک resolver.
max_streams int 64 اتصال‌های هم‌زمان (حداکثر ۲۵۶).
stream_window int 262144 پنجرهٔ دریافت هر اتصال، به بایت.
send_buffer int 65536 بافر ارسال هر اتصال، به بایت.
session_idle duration 90s نشست بی‌اتصال پس از این بسته می‌شود؛ کمتر از ۲ دقیقهٔ سرور نگهش دارید.
connect_timeout duration 90s اتصال تا کی منتظر نشست بماند.

لینک‌ها

Soar لینک اشتراکی تعریف نکرده است. ray2sing در هستهٔ هیدیفای soar:// را به دو شکل می‌خواند:

  • لینک پروفایل WhiteDNS که soar://<base64url JSON> را با schema whitedns.profile صادر و وارد می‌کند: domain و public_key سرور، resolvers و soarSettings آن (انتقال، کشف، کشور، اندازهٔ نام و پاسخ، پنجره‌ها، مهلت‌ها). کشف روشن auto را به resolverها اضافه می‌کند.
  • یک نشانی: soar://t.example.com?pk=<public key>&resolvers=8.8.8.8,1.1.1.1&country=ir#name، یا کلید پیش از میزبان، soar://<public key>@t.example.com?.... کلید با base64url نوشته می‌شود، یا در query با percent-encoding. هر فیلد جدول یک پارامتر است، country، sample_ranges، discovery_want، discovery_concurrency و discovery_pace به smart_pool.discovery می‌روند، smart_pool=0 مجموعه را خاموش می‌کند، discovery=1 به resolverهای نوشته‌شده auto اضافه می‌کند؛ نبود resolver یعنی auto. لینک‌های masterdns و dnstt همین پارامترهای کشف را می‌گیرند.

نکته‌ها

  • Soar هنوز پیش از انتشار است: پروتکلش ممکن است تغییر کند، و کلاینت و سرور باید نسخه‌هایی باشند که یک پروتکل را می‌فهمند.
  • هر کس zone و کلید عمومی را داشته باشد می‌تواند از سرور استفاده کند. آن‌ها را فقط با افراد مورد اعتماد به اشتراک بگذارید: zone منتشرشده زود مسدود می‌شود.
  • مجموعه برای کلاینت یک مسیر است، پس تنظیم هر resolver (طول نام، اندازهٔ پاسخ، پنجره) روی کل مجموعه اعمال می‌شود. بدون resolver در پیکربندی، یا با smart_pool: false، کلاینت هر resolver را جدا تنظیم می‌کند.

همچنین ببینید


اخرین بروزرسانی: 26 فوریهٔ 2026

نظرات