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

پایش (Monitoring)

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

پایش همهٔ خروجی‌ها و endpointها را در پس‌زمینه تست می‌کند: تأخیر هر کدام را اندازه می‌گیرد و نشانی IP و کشوری را که ترافیک از آن خارج می‌شود پیدا می‌کند. گروه‌هایی مثل متعادل‌کننده اعضا را از روی این نتایج انتخاب می‌کنند و اپ آن‌ها را نشان می‌دهد. پایش همیشه روشن است. تنظیماتش فیلد monitoring در بخش experimental است.

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

  • گروه‌هایی که از آن استفاده می‌کنند یک برنامهٔ تست مشترک برای کل پیکربندی دارند.
  • برای هر سرور، علاوه بر تأخیر، نشانی IP خروجی، کشور و ارائه‌دهنده را می‌بینید.
  • تست‌ها فقط وقتی اجرا می‌شوند که از اتصال استفاده می‌کنید، پس دستگاه بیکار مدام تست نمی‌کند.
  • نتایج ذخیره می‌شوند، پس گروه‌ها درست پس از شروع، پیش از تمام شدن تست‌های تازه، می‌توانند انتخاب کنند.

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

خودش عبور نمی‌دهد. پیدا می‌کند کدام خروجی‌ها کار می‌کنند تا گروه‌ها از مسدودها دوری کنند.

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

چه چیزی تست می‌شود

  • همهٔ خروجی‌ها و endpointها تست می‌شوند، به‌جز گروه‌ها. هر تست نشانی تست URL را از طریق خروجی باز می‌کند و تأخیر را اندازه می‌گیرد، همان‌طور که گروه URL test می‌کند. تستی که ناموفق باشد یا بیش از url_test_timeout طول بکشد، خروجی را ناموفق علامت می‌زند.
  • نتیجهٔ یک گروه، نتیجهٔ عضو انتخاب‌شدهٔ آن است. اگر چنین عضوی نداشته باشد، بهترین نتیجه میان اعضایش است.
  • پس از تست موفق، پایش از طریق همان خروجی از یک سرویس اطلاعات IP، نشانی IP خروجی، کشور، منطقه، شهر و شبکه را می‌پرسد. این کار را وقتی می‌کند که خروجی هنوز اطلاعات IP ندارد، یا فقط اطلاعات خوانده‌شده از کش دارد. اگر این درخواست از تست URL سریع‌تر باشد، زمانش تأخیر حساب می‌شود.
  • خروجی‌ای که از طریق یک detour شماره‌گیری می‌کند، برای تأخیر و IPاش، فقط وقتی تست می‌شود که خروجی‌ای که detour به آن می‌رسد (برای گروه، عضو انتخاب‌شده‌اش) در این اجرا نتیجه داشته باشد و در حال تست دوباره نباشد. پیش از آن، تستش ناموفق می‌شد یا مسیری را می‌سنجید که در حال عوض‌شدن است.

تست‌ها کی اجرا می‌شوند

  • تست‌ها با شروع sing-box آغاز می‌شوند. اول، خروجی‌ای که انتخاب هر گروه به آن می‌رسد (انتخاب selector، عضو فعلی متعادل‌کننده، از میان گروه‌های تودرتو) پیش از همه تست می‌شود تا پینگی که کاربر به آن نگاه می‌کند بی‌درنگ نشان داده شود. سپس تست‌ها در دوره‌هایی به فاصلهٔ interval اجرا می‌شوند. هر دوره خروجی‌هایی را تست می‌کند که نتیجه‌شان از interval قدیمی‌تر است یا برای تست علامت خورده‌اند، سریع‌ترها اول (بر اساس آخرین نتیجه، کش‌شده یا نه)، سپس تست‌نشده‌ها، و هر بار workers تا با هم. پس دورهٔ اول، سریع‌ترین عضو اجرای قبل را اول تست می‌کند و گروهی که روی آن عضو است پیش از رسیدن بقیه آن را تأیید می‌کند.
  • اگر به مدت idle_timeout هیچ اتصالی از sing-box نگذرد، تست متوقف می‌شود. اتصال بعدی دوباره آن را راه می‌اندازد.
  • خروجی‌ای که هنوز آماده نیست، مثلاً سایفونی که هنوز در حال اتصال است، یا detourش هنوز نتیجه‌ای ندارد، رد می‌شود و ۳ ثانیه بعد دوباره امتحان می‌شود. پس از ۱۰ بار، به هر حال تست می‌شود.
  • وقتی خروجی‌ای پس از ناموفق بودن کار کند، خروجی‌هایی که از طریق آن تست شده‌اند دوباره تست می‌شوند.
  • بعضی رویدادها بی‌درنگ تست را اجرا می‌کنند: اتصالی که از طریق یک عضو متعادل‌کننده ناموفق شود، selectorی که به خروجی دیگری جابه‌جا شود (انتخاب جدید تست می‌شود و خروجی‌های وابسته به selector هم دوباره)، یا خروجی‌ای که اتصالش کامل شده، مثل سایفون یا DNSTT. چنین تستی همان لحظه اجرا می‌شود، کنار تست‌های دوره نه پشت آن‌ها: منتظر یکی از workers نمی‌ماند که یک دورهٔ پر از timeout می‌تواند چند ثانیه نگهشان دارد. نتیجه‌اش بی‌درنگ، بدون انتظار debounce_window، به مشترکان گروه‌ها می‌رسد.
  • تست درخواستی مرحله‌ای اجرا می‌شود، با on_demand_timeouts (۱، ۳ و ۱۰ ثانیه اگر تنظیم نشده باشد). تلاش اول همان لحظه شروع می‌شود. اگر ناموفق باشد یا تا مرحلهٔ اول پاسخی نیامده باشد، خروجی فعلاً «قطع» نشان داده می‌شود. تلاش ناموفق در مرحلهٔ بعد دوباره انجام می‌شود؛ همین‌طور در هر مرحله به‌جز آخری که مهلت همهٔ تلاش‌هاست. تلاشی که در یک مرحله هنوز در جریان است به حال خود می‌ماند تا پاسخ دهد، پس هر پروکسی یک بار پینگ می‌شود مگر پینگش ناموفق باشد. پاسخ بی‌درنگ نشان داده می‌شود، هرچقدر هم دیر: پاسخی در ۱٫۵ ثانیه جای «قطع» ثانیهٔ اول را می‌گیرد. وقتی آخرین تلاش ناموفق باشد و مرحله‌ای برای تلاش دیگر نمانده باشد، بدون انتظار مهلت تمام می‌شود. تستی که وقتی تست دیگری از همان خروجی در جریان است درخواست شود (تست دوره، یا ضربهٔ قبلی) به آن می‌پیوندد و نتیجه‌اش را می‌گیرد: هر خروجی هر بار یک پینگ. دو تست هم‌زمان پروکسی را دو بار پینگ می‌کردند و هر کدام دیرتر تمام می‌شد نتیجه را می‌نوشت، پس شکستی دیرهنگام جای پاسخ تازه را می‌گرفت. انتخاب تازهٔ یک گروه، اگر در ۱۵ ثانیهٔ گذشته اندازه گرفته شده باشد، دوباره تست نمی‌شود: زیر بار، آن پینگ دوم برای عضوی ۵۹ میلی‌ثانیه‌ای ۲۵۴۹ میلی‌ثانیه خواند و گروه رفت.
  • لاگ می‌گوید هر تست چرا اجرا می‌شود و هر گروه lowest-delay چه تصمیمی می‌گیرد: خط‌هایی با پیشوند MONITORING (تست، نتیجه، دوره، مرحله‌های تست مرحله‌ای) و LOWEST (عضو نگه‌داشته یا گرفته‌شده، با سریع‌ترین عضو و دلیل)، در سطح info. مرحلهٔ اول برای خروجی‌ای است که هنوز چیزی از آن معلوم نیست: نتیجه‌ای در این اجرا ندارد، یا فقط نتیجهٔ ذخیره‌شدهٔ اجرای قبل را دارد. خروجی‌ای که در این اجرا کار کرده نتیجه‌اش را از آن مرحله هم نگه می‌دارد، به‌جای این‌که با یک پاسخ کند «قطع» نشان داده شود، و مرحله‌هایش از مرحلهٔ دوم شروع می‌شوند (۳ ثانیه، بعد مهلت ۱۰ ثانیه). گروه‌ها این «قطع» موقت را نمی‌بینند و فقط آخرین نتیجهٔ قطعی را دارند، پس متعادل‌کننده عضو کندی را به خاطر قطعی که تلاش بعدی پاسخش را می‌دهد مرده نمی‌گیرد و اتصال‌هایش را نمی‌برد.
  • تأخیر هر تست به محض پاسخ تست URL منتشر می‌شود. جست‌وجوی IP که پس از آن می‌آید و می‌تواند همان‌قدر طول بکشد، اطلاعات IP را وقتی تمام شد می‌آورد.
  • وقتی شبکه عوض شود، همهٔ خروجی‌ها ۲ ثانیه پس از آخرین تغییر دوباره تست می‌شوند. تستی که با بازنشانی شبکه قطع شده باشد دوباره اجرا می‌شود.
  • تستی که پس از سه برابر url_test_timeout به‌علاوهٔ ۲ ثانیه برنگشته باشد (خروجی‌ای که شماره‌گیری‌اش مهلتش را نادیده می‌گیرد، چنان‌که شماره‌گیری به یک کتابخانهٔ بومی ممکن است) ناموفق حساب می‌شود و worker آن به تست بعدی می‌رود. وگرنه چند خروجی از این دست همهٔ workerها و دوره را برای همیشه نگه می‌داشتند و دیگر هیچ چیز تست نمی‌شد.

نشانی‌ها

تست‌ها از اولین نشانی urls استفاده می‌کنند. اگر یک دورهٔ کامل هیچ تست موفقی نداشته باشد، دوره با نشانی بعدی تکرار می‌شود، تا یکی کار کند یا فهرست تمام شود. نشانی‌ای که کار کرده از آن به بعد به کار می‌رود.

نتایج ذخیره‌شده

نتایج در فایل کش ذخیره می‌شوند و در شروع بعدی خوانده می‌شوند. نتیجهٔ خوانده‌شده تا تست دوبارهٔ خروجی «از کش» علامت می‌خورد. متعادل‌کننده به این نتایج ۲۰٬۰۰۰ میلی‌ثانیه اضافه می‌کند تا تست تازه برنده شود.

اطلاعات IP هم خوانده می‌شود تا برنامه پیش از هر تستی IP و کشور خروجیِ اجرای قبل را نشان دهد. این اطلاعات تا وقتی جست‌وجوی IP در این اجرا موفق شود، «از کش» (IpInfoFromCache) علامت می‌خورد؛ تست ناموفق آن را عوض نمی‌کند. IP خروجی WARP، سایفون یا پراکسی چرخشی ممکن است بین اجراها عوض شود، پس برنامه باید چنین IPای را هنوز تأییدنشده نشان دهد.

تست ناموفق خطای خود را در نتیجه (Error) نگه می‌دارد تا برنامه بگوید چرا پراکسی ناموفق شد: دست‌دادنِ ردشده، پایان مهلت، خطای DNS. تستی که پاسخ بگیرد آن را پاک می‌کند. خروجی‌ای که آماده نیست تست نمی‌شود و خطای تست ندارد؛ WARP و MASQUE به جای آن از راه adapter.StatusError می‌گویند چرا آماده نیستند (ثبت‌نامِ ردشده، تونلی که وصل نمی‌شود).

گروه‌هایی که مشترک پایش‌اند، برای مجموعه‌ای از نتایج پشت سر هم، پس از debounce_window یک به‌روزرسانی می‌گیرند.

سرویس‌های اطلاعات IP

اگر ipinfo_url تنظیم شده باشد، اول امتحان می‌شود. باید JSONی مثل ipapi.co برگرداند، با فیلدهایی مثل ip، country_code، region، city، asn و org. اگر ناموفق باشد، این سرویس‌ها به نوبت امتحان می‌شوند، با شروع از یکی به‌تصادف:

  • ipapi.co
  • ip-api.com
  • ipinfo.io
  • api.ip.sb
  • ipwho.is
  • api.country.is
  • api.my-ip.io

وقتی همهٔ این‌ها ناموفق باشند، چنان‌که در شبکهٔ شلوغ با محدودیت نرخ یا timeout می‌شوند، از cloudflare.com/cdn-cgi/trace خود Cloudflare، همراه api.country.is و api.my-ip.io پرسیده می‌شود: فقط نشانی و کشور را پاسخ می‌دهد، بی محدودیت نرخ.

پیکربندی

{
  "experimental": {
    "monitoring": {
      "interval": "5m",
      "urls": [
        "https://www.gstatic.com/generate_204",
        "https://cp.cloudflare.com"
      ],
      "url_test_timeout": "5s",
      "on_demand_timeouts": ["1s", "3s", "10s"],
      "idle_timeout": "10m"
    }
  }
}
فیلد نوع پیش‌فرض معنی
interval duration 5m هر چند وقت خروجی‌ها تست شوند.
urls list of strings ["https://www.gstatic.com/generate_204"] نشانی‌های تست، به ترتیب ترجیح.
ipinfo_url string "" یک سرویس اطلاعات IP که اول امتحان می‌شود، مثلاً از اشتراک شما.
verify_ipv6 bool false پس از تست URL هر خروجی، همان URL یک بار دیگر از نشانی IPv6 میزبان از طریق آن گرفته می‌شود، یک بار در هر اجرا، تا معلوم شود خروجی IPv6 را رد می‌کند یا نه؛ IPv6 بر اساس خروجی را ببینید.
ipv6_declared شیء، تگ به bool خروجی‌هایی که لینک IPv6شان را اعلام کرده (ipv6=1، ipv6=0)؛ از ابتدا دانسته است.
ipv6_probe بازنشسته، بی‌اثر.
workers int 10 تعداد تست‌های هم‌زمان.
url_test_timeout duration 5s بیشترین زمان یک تست دوره، و یک درخواست اطلاعات IP.
on_demand_timeouts list of durations ["1s", "3s", "10s"] مرحله‌های تست درخواستی: در اولی بدون پاسخ فعلاً «قطع»، تلاش ناموفق در هر یک به‌جز آخری دوباره، آخری مهلت همه. مرحلهٔ اول برای خروجی‌ای که در این اجرا کار کرده رد می‌شود.
idle_timeout duration 10m پس از این مدت بدون اتصال، تست متوقف شود.
debounce_window duration 500ms مدت جمع کردن نتایج پیش از به‌روزرسانی گروه‌ها.

سرویس‌های اطلاعات IP درخواستی از نشانی IP خروجی هر خروجی دریافت می‌کنند.

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


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

نظرات