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>را با schemawhitedns.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 را جدا تنظیم میکند.