قاعدههای DNS: bypass_if_failed
bypass_if_failed فیلدی در اکشن route قاعدههای DNS است. وقتی سروری که قاعده انتخاب کرده
ناموفق شود، پرسش به جای شکست به قاعدهٔ منطبق بعدی میرود. بدون آن، خطای همان سرور نتیجه است.
چرا از آن استفاده کنیم
- بعضی نامها را به سرور خاصی میفرستید (یک resolver محلی، سروری که فقط از یک خروجی در دسترس است، یک resolver DNSCrypt) و میخواهید وقتی آن سرور از کار افتاده یا مسدود است، قاعدههای معمول پاسخ دهند.
- برای نامهای یکسان زنجیرهای از سرورها میخواهید که به ترتیب قاعدهها امتحان شوند.
برای امتحان همزمان چند سرور، به جای آن از گروه DNS استفاده کنید.
چطور از فیلترینگ عبور میکند
عبور نمیدهد. فقط وقتی یک سرور مسدود است، به قاعدهٔ بعدی اجازه میدهد سرور دیگری را امتحان کند.
چطور کار میکند
- از سرور قاعده مثل همیشه پرسیده میشود. اگر پاسخ دهد، همان پاسخ استفاده میشود.
- اگر ناموفق شود، تطبیق قاعدهها از قاعدهٔ بعدی ادامه پیدا میکند. قاعدهٔ منطبق بعدی سرور را انتخاب میکند و اگر قاعدهٔ دیگری منطبق نشود، سرور final به کار میرود.
- برای جستوجوی نشانی که خود sing-box انجام میدهد (مثلاً برای resolve کردن نام سرور یک خروجی)، پاسخ خالی هم ناموفق حساب میشود.
- اگر پرسش لغو شود، متوقف میشود و قاعدهٔ بعدی امتحان نمیشود.
- چند قاعدهٔ پشت سر هم میتوانند هر کدام
bypass_if_failedداشته باشند. - ناموفق شدنی که قاعدهٔ بعدی آن را به عهده میگیرد در سطح debug ثبت میشود، نه بهعنوان خطا.
محدودیت: فقط در حالت قدیمی قاعدههای DNS
sing-box 1.15 دو روش برای اجرای قاعدههای DNS دارد. bypass_if_failed فقط در حالت قدیمی کار
میکند؛ در حالت تازه نادیده گرفته میشود و خطای سرور نتیجه است.
sing-box وقتی از حالت قدیمی استفاده میکند که دستکم یک قاعدهٔ DNS روی نشانی پاسخ تطبیق دهد
(ip_cidr، ip_is_private یا ip_accept_any، بدون match_response) یا در اکشن خود strategy
بگذارد، و هیچ قاعدهای به حالت تازه نیاز نداشته باشد (مثلاً match_response، query_type،
ip_version، یا اکشنهای evaluate یا respond). sing-box اصلی این فیلدهای قدیمی را منسوخ
میداند، پس sing-box برای آنها هشدار ثبت میکند.
پیکربندیای که این دو را با هم دارد (مثلاً strategy در یک قاعده و query_type در قاعدهٔ دیگر)
هنگام شروع رد میشود. پس در حالت قدیمی، قاعدهٔ fake IP نمیتواند روی query_type: [A, AAAA]
تطبیق دهد. به جای آن bypass_if_failed بگذارید: سرور fake IP هر نوع پرسش دیگری را ناموفق
میکند و قاعدهٔ بعدی به آن پاسخ میدهد.
پیکربندی
{
"dns": {
"servers": [
{ "type": "udp", "tag": "office", "server": "10.0.0.53" },
{ "type": "https", "tag": "remote", "server": "1.1.1.1" }
],
"rules": [
{
"domain_suffix": ["corp.example"],
"action": "route",
"server": "office",
"strategy": "ipv4_only",
"bypass_if_failed": true
}
],
"final": "remote"
}
}
اینجا strategy قاعدهها را در حالت قدیمی قرار میدهد. وقتی سرور office پاسخ ندهد، نامهای زیر
corp.example با remote resolve میشوند.
| فیلد | نوع | پیشفرض | معنی |
|---|---|---|---|
bypass_if_failed |
bool | false |
وقتی سرور قاعده ناموفق شد، به قاعدهٔ منطبق بعدی برو. |