پالت فرمان

دنبال فرمانی برای اجرا بگردید…

ZarynZaryn
شبکه‌های خصوصی و پروکسی·۲۵ دقیقه مطالعه·

DNS که روی هر شبکه‌ای کار می‌کند (zev dns)

zev dns پیدا می‌کند کدام سرورهای DNS واقعاً از شبکهٔ شما کار می‌کنند و از چه راهی (رمزنگاری‌شده، پورتی دیگر، TCP، از راه پروکسی شما)، جواب‌های فیلترینگ را دور می‌ریزد، امضاهای DNSSEC را خودش بررسی می‌کند و اگر همه از کار بیفتند به DNS خود شبکه برمی‌گردد تا نام‌ها هیچ‌وقت از کار نیفتند.

هر سایتی با یک پرسش DNS شروع می‌شود: «نشانی github.com چیست؟». روی شبکهٔ فیلترشده این پرسش بی‌صدا خراب می‌شود: جواب دروغ است (یک نشانی، مثل `10.10.34.36`، برای هر سایت مسدود)، DNS رمزنگاری‌شده قطع می‌شود، DNS خود شبکه کند است یا جواب نمی‌دهد. برنامه‌ها فقط می‌گویند «وصل نمی‌شود». `zev dns` همهٔ سرورهای DNS شناخته‌شده را، با هر راهی که می‌شود از آن‌ها پرسید، از همان‌جا که هستید اندازه می‌گیرد؛ می‌گوید شبکه با DNS چه می‌کند؛ و وقتی روشنش کنید، نام‌های این رایانه را از راه بهترین چندتا جواب می‌دهد. امضاهای DNSSEC را خودش بررسی می‌کند، پس جواب جعلی برای یک نام امضاشده از هر راهی که آمده باشد گیر می‌افتد. اگر همه از کار بیفتند، از DNS خود شبکه می‌پرسد: zev dns هیچ‌وقت شما را بی‌نام نمی‌گذارد. ```bash zev dns check # این شبکه با DNS چه می‌کند، و چه راهی از آن می‌گذرد sudo zev dns on # نام‌های این رایانه از بهترین راه‌ها (لینوکس) zev dns status # الان از چه راهی می‌پرسد و چطور پیش می‌رود sudo zev dns off # درست همان‌طور که بود ``` ```diagram type: flow title: zev dns برای هر سرور DNS چطور راهی پیدا می‌کند --- رمزنگاری‌شده | DNS روی HTTPS و DNS روی TLS، مستقیم به نشانی سرور (بی‌آنکه اول نامی را بپرسد) | good | 🔒 ~ دست‌دادن TLS قطع می‌شود نام‌های دیگر | همان سرور با هر نامی که گواهی‌اش دارد: فیلتر اغلب فقط نام اصلی را می‌شناسد | | 🔁 ~ باز هم قطع سلام تکه‌تکه | سلام TLS در دو رکورد و تکه‌های کوچک، تا فیلتر نتواند نام سرور را در آن بخواند | | ✂️ ~ باز هم بسته پورتی دیگر | DNS ساده روی پورت‌هایی که بعضی سرورها روی آن‌ها هم جواب می‌دهند (OpenDNS پورت 443، Quad9 پورت 9953)، و روی TCP | warn | 🚪 ~ هیچ راه مستقیمی کار نمی‌کند پروکسی شما | DNS روی HTTPS از راه zev proxy، وقتی `zev proxy share` روشن است | accent | 🛰️ ~ همه از کار افتادند DNS شبکه | آخر از همه، انگار zev dns نبود: نام‌ها کار می‌کنند | dim | 🏠 ``` ## در یک دقیقه شروع کنید ```diagram type: cards title: DNS درست با سه دستور --- 1️⃣ | نگاه | zev dns check: این شبکه با DNS چه می‌کند (دروغ، بستن) و کدام راه‌ها هنوز راست می‌گویند، در حدود ۱۵ ثانیه 2️⃣ | روشن | sudo zev dns on: نام‌های این رایانه از بهترین چندتا، DNS شبکه پشتشان، امضاها بررسی‌شده 3️⃣ | دیدن | zev dns status، و zev dns why <name> برای هر نامی ``` ## همهٔ دستورها | دستور | نمونه | چه می‌کند | |---|---|---| | `check` | `zev dns check` | این شبکه با DNS چه می‌کند، و چه راهی از آن می‌گذرد | | `bench` | `zev dns bench` · `zev dns bench --for private` | همهٔ سرورها، با همهٔ راه‌ها، اندازه‌گیری‌شده از اینجا؛ بهترین برای هر کاربرد | | `why` | `zev dns why twitter.com` · `zev dns why example.com AAAA` | هر سرور دربارهٔ یک نام چه می‌گوید، چه کسی دروغ می‌گوید، کدام امضاشده است | | `verify` | `zev dns verify www.wikipedia.org` · `zev dns verify example.com --json` | کدام سرورها نشانی واقعی سایت را دادند، با اثبات از روی گواهی HTTPS هر نشانی | | `on` | `sudo zev dns on` · `sudo zev dns on --for adblock` | نام‌های این رایانه از zev dns (لینوکس)، با بررسی اینکه سیستم واقعاً از آن می‌پرسد | | `off` | `sudo zev dns off` | درست همان‌طور که بود | | `status` | `zev dns status` | الان از کجا می‌پرسد، چقدر سریع، حافظهٔ موقت، دروغ‌های دورریخته، جواب‌های جعلی | | `log` | `sudo zev dns log` · `sudo zev dns log -f` · `sudo zev dns log github` · `--json` | نام‌هایی که این کامپیوتر پرسید، تازه‌ترین در آخر، و اینکه هر کدام چطور جواب گرفت | | `top` | `sudo zev dns top` · `sudo zev dns top --json` | پرتکرارترین‌ها، چطور جواب گرفتند، کدام راه جواب داد، چه چیزی نشد، کدام دستگاه‌ها پرسیدند | | `share` | `sudo zev dns share on` · `sudo zev dns share off` · `zev dns share` | گوشی‌ها، تلویزیون‌ها و کنسول‌های این شبکه هم از آن استفاده کنند | | `use` | `sudo zev dns use family` | کاربردی دیگر در حالی که روشن است: balanced، fast، private، secure، family، adblock، gaming | | `rule` | `sudo zev dns rule add corp.example system` · `sudo zev dns rule country de` | بعضی نام‌ها از DNS شبکه، بسته، یا از یک سرور | | `sanctions` | `sudo zev dns sanctions on` | سرویس‌های توسعه‌دهندهٔ تحریمی از راه یک سرور رلهٔ محلی | | `set` | `sudo zev dns set strict=on` · `set dnssec=off` · `set log=off` | strict، proxy، rebinding، dnssec، log، share، listen | | `ls` | `zev dns ls` | سرورهایی که می‌شناسد، و هر کدام به چه کار می‌آید | | `restore` | `sudo zev dns restore` | DNS سیستم مثل قبل (آنچه systemd اجرا می‌کند اگر zev dns از کار بیفتد) | ## این شبکه با DNS چه می‌کند؟ zev dns check ```bash zev dns check ``` حدود ۲۰ سرور را با نزدیک ۹۰ راه هم‌زمان می‌پرسد، چند ثانیه طول می‌کشد و به نصب چیزی نیاز ندارد. روی یک شبکهٔ فیلترشده چنین است: ```text This network's DNS ! 192.168.1.1 answers in 4 ms, but gives the censor's address for 4 of 4 blocked sites On the way out ✗ something on this network answers DNS questions meant for other servers (an address with no DNS server answered 10.10.34.36) ✗ plain DNS on port 53: 19 of 19 resolvers' answers were the censor's What gets through ✓ DNS over HTTPS (encrypted): 1 work dnssb DoH as dot.sb ✗ DNS over TLS (encrypted): blocked: the handshake is cut when the filter reads the resolver's name (9 of 13) ✓ plain DNS on another port: 4 work quad9 UDP :9953, quad9-unfiltered UDP :9953, opendns UDP :443, opendns-family UDP :443 ✓ plain DNS over TCP: 15 work ✗ plain DNS (UDP 53): blocked What zev dns would use (balanced) 1. dnssb DoH as dot.sb 110 ms 2. quad9 UDP :9953 125 ms 3. opendns UDP :443 140 ms then this network's own DNS, if all of those fail ``` آنجا چه پیدا کرد، و چطور: - **کسی سر راه جواب می‌دهد.** zev از نشانی‌ای می‌پرسد که هیچ سرور DNSی روی آن نیست (192.0.2.53، رزروشده برای مثال‌ها). سکوت طبیعی است؛ جواب یعنی چیزی بین شما و اینترنت خودش به DNS جواب می‌دهد. هر نشانی‌ای که می‌دهد دروغ این شبکه است و zev از آن به بعد آن را از هر سروری دور می‌ریزد. - **دروغ روی پورت 53.** جواب سادهٔ همهٔ سرورها برای سایت مسدود، نشانی فیلترینگ بود، چون فیلتر زودتر جواب داد. - **چه چیزی هنوز می‌گذرد.** اینجا: DNS رمزنگاری‌شدهٔ DNS.SB با نام دوم گواهی‌اش، DNS ساده روی پورت‌هایی جز 53، و TCP. `zev dns check --json` همین را برای اسکریپت‌ها و عامل‌ها می‌دهد. ## روشن کردن: sudo zev dns on ```bash sudo zev dns on # balanced: سریع و درست، رمزنگاری‌شده وقتی هزینهٔ کمی دارد sudo zev dns on --for private # یا کاربردی دیگر، پایین‌تر ``` یک سرور DNS کوچک روی `127.0.0.153` راه می‌اندازد (سرویسی سیستمی که با رایانه بالا می‌آید) و سیستم را به آن می‌سپارد: - **با systemd-resolved** (اوبونتو، فدورا، بیشتر دسکتاپ‌ها): تنظیمی در `/run/systemd/resolved.conf.d/zev-dns.conf`، و لینک‌های شبکه دیگر مسیر پیش‌فرض نام‌ها نیستند. دامنه‌هایی که یک لینک خودش می‌خواهد، مثلاً دامنهٔ وی‌پی‌ان کاری، همچنان به همان لینک می‌روند. - **بدون آن:** `/etc/resolv.conf` به zev dns اشاره می‌کند؛ فایل قبلی نگه داشته و برگردانده می‌شود. بعد **بررسی می‌کند که سیستم واقعاً از آن می‌پرسد**: نامی را که فقط zev dns می‌تواند جواب بدهد، همان‌طور می‌پرسد که هر برنامه‌ای می‌پرسد. اگر نشد، همه‌چیز همان‌طور که بود برمی‌گردد و این را به شما می‌گوید. هیچ چیز نیمه‌کاره نمی‌ماند. اولین اندازه‌گیری چند ثانیه طول می‌کشد؛ تا آن موقع DNS خود شبکه جواب می‌دهد، پس نام‌ها از ثانیهٔ اول کار می‌کنند. ## نام‌ها هیچ‌وقت از کار نمی‌افتند ```diagram type: sequence title: یک نام، وقتی کارها خراب می‌شود lanes: یک برنامه | zev dns | بهترین راه‌ها | DNS شبکه alt: برنامه از zev dns می‌پرسد؛ اگر بتواند از حافظه جواب می‌دهد؛ وگرنه از بهترین راه می‌پرسد و اگر کند بود از بعدی هم، و اولین جواب درست را برمی‌دارد؛ جواب فیلترینگ دور ریخته می‌شود؛ اگر هیچ‌کدام از بهترین راه‌ها جواب ندهند از DNS شبکه می‌پرسد؛ اگر هیچ چیز جواب ندهد، نسخهٔ قدیمی را می‌دهد --- یک برنامه -> zev dns : github.com? note zev dns : نگه داشته و هنوز تازه است؟ فوری جواب می‌دهد | good zev dns -> بهترین راه‌ها : سریع‌ترین اول؛ اگر کند بود بعدی هم می‌پیوندد بهترین راه‌ها --> zev dns : 10.10.34.36 (جواب فیلترینگ، از سر راه) note zev dns : دور ریخته می‌شود: جواب نیست | warn بهترین راه‌ها --> zev dns : 140.82.121.3 zev dns --> یک برنامه : 140.82.121.3 == اگر هیچ‌کدام از بهترین راه‌ها جواب ندهند == zev dns -> DNS شبکه : github.com? DNS شبکه --> zev dns : هرچه بگوید == اگر هیچ چیز جواب ندهد == zev dns --> یک برنامه : آخرین جوابی که داشت، تا ۳ روز نگه داشته ``` - **مسابقه، نه صف.** اول از بهترین راه می‌پرسد. اگر تا وقتی که معمولاً جواب می‌داد جواب نداد، دومی هم می‌پیوندد، بعد سومی؛ اولین جواب درست برنده است. یک سرور کند هیچ‌وقت شما را منتظر نمی‌گذارد. - **راه‌هایی که خراب می‌شوند استراحت می‌کنند.** بعد از سه شکست پشت سر هم، یک راه مدتی کنار گذاشته می‌شود (۵ ثانیه، بعد بیشتر، تا ۲ دقیقه) و دوباره امتحان می‌شود. - **جواب‌هایی که در UDP جا نمی‌شوند.** نامی با نشانی‌های زیاد، یا کلیدهای یک zone امضاشده، در یک جواب UDP جا نمی‌شود: سرور آن را بریده می‌فرستد و zev dns دوباره روی TCP می‌پرسد. جایی که شبکه TCP به آن سرور را بسته، zev dns دو راه دیگر درست برای همین نگه می‌دارد (بهترین راه‌های TCP، DoT یا DoH که اندازه گرفته و این‌جا کار می‌کنند، مثل TCP روی پورت 5353 در AdGuard) و از آن‌ها می‌پرسد. `zev dns status` آن‌ها را با ◇ نشان می‌دهد، با شمار جواب‌هایی که کامل از راه آن‌ها رسید. - **DNS شبکه پشت سرشان.** اگر هیچ‌کدام از بهترین راه‌ها تا ۲٫۵ ثانیه جواب ندهند، از DNS شبکه می‌پرسد: درست همان اتفاقی که بدون zev dns می‌افتاد. اگر بهترین راه‌ها کلاً از کار بیفتند (قطعی، یک مسدودسازی تازه)، zev dns مدتی اول از DNS شبکه می‌پرسد، دوباره اندازه می‌گیرد، و همین که یکی جواب داد به بهترین راه‌ها برمی‌گردد. - **نسخه‌های قدیمی.** وقتی هیچ چیز جواب نمی‌دهد، نامی را که قبلاً جواب داده با نسخهٔ قدیمی‌اش جواب می‌دهد (تا ۳ روز، با TTL سی‌ثانیه‌ای، همان‌طور که RFC 8767 پیشنهاد می‌کند). سایت‌هایی که از قبل استفاده می‌کنید هنگام قطعی هم باز می‌شوند. - **جواب‌های نگه‌داشته.** جواب‌ها تا وقتی TTL آن‌ها می‌گوید نگه داشته می‌شوند. نامی که زیاد پرسیده می‌شود کمی پیش از تمام شدن دوباره گرفته می‌شود، تا هیچ‌وقت منتظر نماند. - **شبکهٔ تازه، اندازه‌گیری تازه.** zev dns وقتی شبکه را عوض می‌کنید (وای‌فای دیگر، هات‌اسپات گوشی) متوجه می‌شود و دوباره اندازه می‌گیرد، با شروع از آنچه دفعهٔ قبل آنجا کار کرد. به هر حال هر نیم ساعت، و تا وقتی بهترین راه‌ها خراب‌اند هر دو دقیقه، اندازه می‌گیرد. ## بهترین برای آنچه لازم دارید | کاربرد | چه چیزی را انتخاب می‌کند | |---|---| | `balanced` (پیش‌فرض) | سریع و درست؛ رمزنگاری‌شده وقتی کمی بیشتر از ساده هزینه دارد. اگر DNS خود شبکه راست گفته و سریع‌ترین است، می‌تواند همان باشد | | `fast` | سریع‌ترین جواب درست، رمزنگاری‌شده یا نه | | `private` | فقط رمزنگاری‌شده (DNS روی HTTPS یا TLS)، به سرورهایی که لاگ نگه نمی‌دارند و بخشی از نشانی شما را به سایت‌ها نمی‌دهند (ECS) | | `secure` | سرورهایی که بدافزار و فیشینگ را می‌بندند (Quad9، Cloudflare 1.1.1.2، AdGuard) | | `family` | بدافزار و سایت‌های بزرگسالان بسته (Cloudflare 1.1.1.3، AdGuard Family، OpenDNS FamilyShield، CleanBrowsing) | | `adblock` | تبلیغ‌ها و ردیاب‌ها بسته (AdGuard، Mullvad adblock) | | `gaming` | پایدارترین: کمترین فاصله بین جواب معمول و جواب‌های کندش | ```bash zev dns bench # همهٔ راه‌ها، از همین‌جا اندازه‌گیری‌شده، و بهترین برای هر کاربرد zev dns bench --for gaming # مرتب برای یک کاربرد sudo zev dns use private # عوض کردن وقتی روشن است ``` ```text ✓ quad9 UDP :9953 122 ms 168 ms 17/17 ✓ dnssb DoH as dot.sb 110 ms 265 ms 17/17 handshake 380 ms ✗ cloudflare UDP 31 ms 48 ms 17/17 lied 4× (censor's address) · google DoT - - 0/1 TLS handshake cut ``` یک راه فقط وقتی حساب می‌شود که **هیچ‌وقت دروغ نگفته باشد**: نشانی فیلترینگ، نشانی خصوصی برای یک نام عمومی، یا جواب برای نامی که وجود ندارد (بعضی شبکه‌ها برای نمایش تبلیغ این‌ها را می‌سازند) آن را بیرون می‌گذارد. سرعت، میانه و کندترین دهم جواب‌هایش است، تا سروری که به طور میانگین سریع است ولی گاهی گیر می‌کند برنده نشود. اندازه‌گیری‌ها برای هر شبکه نگه داشته می‌شوند، پس شبکه‌ای که به آن برمی‌گردید با آنچه آنجا کار کرد شروع می‌شود. `zev dns ls` سرورهایی را که zev می‌شناسد، اینکه هر کدام به چه زبانی حرف می‌زند و برای چه خوب است فهرست می‌کند. ## چرا این جواب؟ zev dns why ```bash zev dns why twitter.com ``` ```text twitter.com A, asked 22 ways at once ✓ cloudflare TCP 162.159.140.229 273 ms ✓ quad9 UDP :9953 162.159.140.229 118 ms ✗ local-relay UDP 10.10.34.36 51 ms ← the censor's address, not the site's ✗ network DNS 192.168.1.1 10.10.34.36 4 ms ← the censor's address, not the site's zev dns answers: 162.159.140.229 2 ms ``` همهٔ سرورها، هر کدام با راهی که از اینجا برایش بهتر کار می‌کند، کنار هم: چه کسی راست می‌گوید، چه کسی نام را عمداً می‌بندد (`⊘`)، چه کسی دروغ می‌گوید، و خود zev dns چه جوابی می‌دهد. برای رکوردهای دیگر نوعش را بدهید: `zev dns why example.com AAAA`. برای یک نام امضاشده، هر جواب با امضاها هم سنجیده می‌شود، با کلیدهایی که از همان سرور و از همان راه پرسیده می‌شوند. `signed ✓` یعنی جوابش ثابت شده؛ `forged` یعنی با امضا جور نیست، حتی وقتی نشانی از آن‌هایی نیست که فیلترینگ به آن‌ها شناخته می‌شود. خط‌های زیر از یک شبکهٔ فیلترشدهٔ واقعی‌اند، و خط آخر از آزمایش آزمایشگاهی zev، که در آن یک سرور نشانی cloudflare.com را زیر امضای واقعی‌اش جعل می‌کند: ```text cloudflare.com A, asked 25 ways at once ✓ cloudflare UDP 104.16.132.229 104.16.133.229 109 ms signed ✓ ✓ adguard-family UDP :5353 104.16.132.229 104.16.133.229 82 ms signed ✓ ✓ cleanbrowsing-family UDP 104.16.132.229 104.16.133.229 118 ms ✗ liar UDP 198.51.100.66 40 ms ← forged: the signature on cloudflare.com doesn't match cloudflare.com's keys cloudflare.com is signed (DNSSEC): an answer whose signatures check out from the root's key is the real one ``` خطی که علامتی ندارد نشانی درست را داد ولی امضایی برای سنجیدن نداشت (بعضی سرورها، از جمله CleanBrowsing، امضاها را می‌اندازند)، یا کلیدهایش نرسید. ## واقعاً همان سایت است؟ zev dns verify DNSSEC فقط جواب نام‌هایی را ثابت می‌کند که صاحبشان امضایشان کرده، و بیشتر نام‌ها امضا ندارند. `zev dns verify` جواب‌ها را از راه دیگری ثابت می‌کند که برای **هر سایتی که HTTPS دارد** کار می‌کند: از همهٔ سرورها، از همهٔ راه‌ها می‌پرسد، بعد به هر نشانی‌ای که گرفته HTTPS باز می‌کند و گواهی همان نام را می‌خواهد. جاعل می‌تواند نشانی بسازد، اما نه گواهی آن سایت را. ```bash zev dns verify www.wikipedia.org ``` ```text www.wikipedia.org 37 ways asked; each address checked by opening HTTPS to it and asking for www.wikipedia.org's certificate The addresses ✓ 185.15.59.224 the site: a valid certificate for www.wikipedia.org (740 ms) ✓ 208.80.153.224 the site: a valid certificate for www.wikipedia.org (1066 ms) ✓ 198.35.26.224 the site: a valid certificate for www.wikipedia.org (1112 ms) The resolvers ✓ cloudflare UDP 185.15.59.224 ✓ quad9 UDP 185.15.59.224 ✓ dnssb UDP 198.35.26.224 · google DoH TLS handshake cut ✓ network DNS 192.168.1.1 185.15.59.224 Every address that could be checked is really www.wikipedia.org. ``` وقتی جوابی جعلی باشد، verify می‌گوید کدام، و با کد ۱ خارج می‌شود: ```text The addresses ✓ 104.16.123.96 the site: a valid certificate for www.cloudflare.com (3 ms) ✓ 104.16.124.96 the site: a valid certificate for www.cloudflare.com (2 ms) ✗ 198.51.100.66 not the site: its certificate isn't for www.cloudflare.com The resolvers ✓ honest UDP 104.16.124.96 104.16.123.96 ✗ liar UDP 198.51.100.66 ← not the site ✗ network DNS 192.168.1.1 198.51.100.66 ← not the site 2 answer(s) weren't www.cloudflare.com: forged by the resolver, or on the way to it (plain DNS can be answered by anything in between). zev dns check finds the ways that answer honestly from here, and sudo zev dns on uses only those. ``` ```diagram type: sequence title: اثبات یک جواب با گواهی خود سایت lanes: zev dns verify | سرورهای DNS | نشانی alt: zev dns verify نشانی‌های یک نام را از همهٔ سرورها می‌پرسد، بعد به هر نشانی با همان نام HTTPS باز می‌کند و گواهی‌ای را که نشان می‌دهد بررسی می‌کند؛ نشانی‌ای که گواهی معتبر آن نام را نشان دهد خود سایت است، و نشانی‌ای که گواهی نام دیگری را نشان دهد نیست؛ سروری درستکار است که نشانی‌هایش خود سایت باشند --- zev dns verify -> سرورهای DNS : www.cloudflare.com؟ (همه، از همهٔ راه‌ها) سرورهای DNS --> zev dns verify : 104.16.123.96 · 198.51.100.66 zev dns verify -> نشانی : HTTPS به 104.16.123.96، برای www.cloudflare.com نشانی --> zev dns verify : گواهی معتبر برای www.cloudflare.com | good zev dns verify -> نشانی : HTTPS به 198.51.100.66، برای www.cloudflare.com نشانی --> zev dns verify : گواهی یک نام دیگر | bad note zev dns verify : سروری که 198.51.100.66 را داد درستکار نیست | warn ``` ```diagram type: cards title: هر نشانه چه معنایی دارد --- ✓ | خود سایت | گواهی معتبری برای آن نام نشان داد، امضاشده از مرجعی که این کامپیوتر به آن اعتماد دارد | good ✗ | خود سایت نیست | گواهی یک نام دیگر، یا نشانی خصوصی برای یک نام عمومی | bad ? | معلوم نشد | از اینجا به HTTPS جواب نداد (مسدود، قطع، یا اصلاً سایت وب نیست). دروغ حساب نمی‌شود | · | جوابی نیامد | آن سرور یا راه نشانی‌ای نداد | ``` `--json` اثبات هر نشانی (`site`، `wrong_certificate`، `private`، `unknown`) و حکم هر سرور را می‌دهد، برای اسکریپت‌ها و پایش. ## نام‌های امضاشده: DNSSEC، همین‌جا بررسی می‌شود بسیاری از نام‌ها امضاشده‌اند (DNSSEC): صاحب ناحیه هر جواب را امضا می‌کند، ناحیهٔ بالاتر کلید او را تأیید می‌کند، و همین‌طور تا ریشه، که کلیدش درون zev است. فیلترینگ می‌تواند هر نشانی‌ای بدهد، ولی نمی‌تواند امضا را با آن جور کند. zev dns هر جواب را خودش از کلید ریشه به پایین بررسی می‌کند، پس جواب جعلی برای یک نام امضاشده **از هر راهی که آمده باشد** گیر می‌افتد: از سرور رمزنگاری‌شده، از DNS ساده روی پورتی دیگر، یا از DNS خود شبکه وقتی هیچ چیز دیگری جواب نداد. ```diagram type: flow title: چرا می‌شود به نشانی cloudflare.com اعتماد کرد --- کلید ریشه | درون zev ساخته شده (KSK-2017 و KSK-2024 از IANA): تنها چیزی که بی‌دلیل پذیرفته می‌شود | good | 🔑 ~ امضا می‌کند رکورد DS دامنهٔ .com | ریشه می‌گوید .com کدام کلید را به کار می‌برد | | 📜 ~ جور است با کلیدهای .com | همه‌چیز را در .com امضا می‌کنند | | 🔐 ~ امضا می‌کند رکورد DS دامنهٔ cloudflare.com | ‏.com می‌گوید cloudflare.com کدام کلید را به کار می‌برد | | 📜 ~ جور است با کلیدهای cloudflare.com | جواب‌های cloudflare.com را امضا می‌کنند | | 🔐 ~ امضا می‌کند نشانی | ‏104.16.132.229، با امضایش: ثابت‌شده | good | ✅ ``` هر جواب یکی از این چهار حالت می‌شود: ```diagram type: cards title: zev dns از یک جواب چه می‌فهمد --- ✅ | ثابت‌شده | امضاشده، و همهٔ امضاها از کلید ریشه به پایین درست‌اند. جواب داده می‌شود، با بیت AD برای برنامه‌هایی که آن را می‌خواهند 📭 | امضانشده | ثابت شده که امضا ندارد: یکی از ناحیه‌های سر راه کلیدی بالای خود ندارد (بیشتر نام‌ها، از جمله twitter.com). مثل قبل جواب داده می‌شود ❔ | نشد بررسی کرد | کلیدها نرسیدند (برای UDP بزرگ‌اند و TCP بسته است، یا سروری امضاها را می‌اندازد)، یا ساعت رایانه درست نیست. مثل قبل جواب داده می‌شود: هرگز بدتر از بدون DNSSEC نیست ⛔ | جعلی | با امضاها جور نیست. دور ریخته می‌شود و راه بعدی پرسیده می‌شود، تا سه راه؛ اگر جواب همه جعلی باشد، برنامه SERVFAIL می‌گیرد همراه با دلیلش (خطای DNS گسترده، کد ۶) ``` در عمل یعنی: - **«جعلی» فقط وقتی چیزی هست و غلط است.** جوابی که امضایش جور نیست، یا جوابی بی‌امضا برای ناحیه‌ای که ثابت شده امضاشده است، از سروری که DNSSEC بلد است. هر چیزی که فقط نرسیده (کلیدهایی که نمی‌آیند، سروری که امضاها را جلو نمی‌فرستد) «نشد بررسی کرد» است و نام مثل قبل جواب داده می‌شود. zev dns هیچ نامی را فقط به این دلیل که DNSSEC بررسی نشد از کار نمی‌اندازد. - **کلیدها از بهترین راه‌ها می‌آیند**، از راه حافظهٔ موقت، و برایشان فقط جواب‌هایی حساب می‌شوند که امضا دارند. کلیدها تا وقتی TTL آن‌ها می‌گوید (معمولاً یکی دو روز) در حافظه می‌مانند، پس بررسی فقط بار اولی که یک ناحیه دیده می‌شود چند رفت‌وبرگشت اضافه می‌کند و بعد هیچ. پرسش کلیدی که شکست بخورد تا ۵ دقیقه دوباره پرسیده نمی‌شود. - **کلیدها از پیش.** zev dns درست پس از اندازه‌گیری یک شبکه، کلیدهای ریشه و پرکاربردترین نام‌های سطح‌بالا (.com، .net، .org، .io، .dev و چند تای دیگر) را می‌گیرد، تا نخستین نام امضاشده منتظرشان نماند. `zev dns status` زیر *lately* همین را می‌گوید: `dnssec keys ready: the root's, and 17 of 17 top-level names'`. - **برنامه‌هایی که خودشان بررسی می‌کنند** (بیت CD را می‌گذارند) جواب را همان‌طور که آمده، بررسی‌نشده می‌گیرند. برنامه‌هایی که با DO می‌پرسند امضاها را هم می‌گیرند؛ بقیه جواب را بدون آن‌ها. - **نام‌های اداری و خانگی** بررسی نمی‌شوند: نام‌های زیر `.lan`، `.home.arpa`، `.local`، `.internal`، `.corp`، نام‌های معکوس بازه‌های نشانی خصوصی، و هر نامی زیر یک نام سطح بالا که در DNS عمومی وجود ندارد. قاعده‌هایی که نام‌ها را به `system` می‌فرستند هم بررسی نمی‌شوند. - **ساعت**: امضاها بین دو تاریخ معتبرند. اگر ساعت رایانه خیلی غلط باشد، نام‌های امضاشده «نشد بررسی کرد» می‌شوند (نه جعلی)، با یک ساعت فرصت. روی یک شبکهٔ فیلترشدهٔ واقعی (۲۶ اکتبر ۲۰۲۶) جواب هر سرور درستکار برای cloudflare.com، ed25519.nl، nlnetlabs.nl و nic.cz ثابت شد، با ECDSA، Ed25519، RSA، NSEC و NSEC3. جوابی که فیلترینگ برای torproject.org (امضاشده) تزریق می‌کند امضایی ندارد. کلیدهای `.org` برای UDP بزرگ‌اند و TCP بسته بود، پس نام‌های `.org` از راه همهٔ سرورها «نشد بررسی کرد» شدند، جز AdGuard روی پورت 5353 که روی TCP جواب می‌دهد. حالا zev dns راهی مثل این را برای جواب‌های بزرگ‌تر از UDP نگه می‌دارد و چنین کلیدهایی را از آن می‌گیرد (ببینید [نام‌ها هیچ‌وقت از کار نمی‌افتند](#نامها-هیچوقت-از-کار-نمیافتند)). `zev dns status` هر دو را می‌شمارد: ```text dnssec 412 answers proven by their signatures, 3 forged ones thrown away ``` و هر جواب جعلی را با راهی که از آن آمد زیر *lately* فهرست می‌کند. راه‌هایی را هم که از آن‌ها می‌پرسد فهرست می‌کند، با راه‌هایی که برای جواب‌های بزرگ نگه داشته: ```text asking ● quad9 UDP :9953 41 ms ±6, 1290 answered, 2 failed ● cloudflare UDP 48 ms ±9, 980 answered, 0 failed ◇ adguard TCP :5353 (for answers too big for UDP; 37 so far) ○ network DNS 192.168.1.1 (the network's DNS, behind them) ``` ## این کامپیوتر چه می‌پرسد: zev dns log و top وقتی `zev dns on` روشن است، هر نامی که جواب می‌دهد در فهرستی کوتاه می‌رود: زمان، نام، اینکه چطور جواب گرفت، کدام راه جواب داد، چقدر طول کشید، و کدام دستگاه پرسید. در حافظه و در `/run` نگه داشته می‌شود (فقط root، با ری‌استارت پاک می‌شود) و ۲٬۰۰۰ نام آخر را دارد. ```bash sudo zev dns log # ۳۰ تای آخر، تازه‌ترین در آخر sudo zev dns log -f # همان‌طور که می‌آیند، مثل tail -f sudo zev dns log github # فقط نام‌هایی که github در آن‌هاست sudo zev dns log -n 200 --json ``` ```text Names this computer asked newest last 10:05:32 www.wikipedia.org A asked 4 ms quad9 TCP 10:05:33 github.com A asked 5 ms quad9 TCP 10:05:33 www.wikipedia.org A cache 0 ms 10:05:33 api.github.com A asked 4 ms quad9 TCP 10:05:38 github.com A cache 0 ms from 192.168.1.20 ``` ```diagram type: cards title: یک نام چطور جواب گرفت --- asked | پرسیده شد | از راهی که کنارش نوشته شده | good cache | از حافظهٔ موقت | هیچ پرسشی بیرون نرفت: نه زمانی گرفت، نه کسی چیزی دید | kept copy | نسخهٔ منقضی | هیچ چیز جواب نداد، پس جوابی تازه نام را سرپا نگه داشت | warn blocked | مسدود | با یکی از قاعده‌های شما، یا کاربردی که انتخاب کردید (family، adblock) | warn forged / failed | دورریخته / بی‌جواب | جواب DNSSEC جعلی، یا اصلاً هیچ جوابی | bad ``` `zev dns top` جمعشان می‌کند: نام‌ها چطور جواب گرفتند (و حافظهٔ موقت چقدر صرفه‌جویی کرد)، پرتکرارترین سایت‌ها، کدام راه چند تا و با چه سرعتی جواب داد، چه چیزی مسدود، جعلی یا بی‌جواب ماند، و کدام دستگاه‌ها پرسیدند. ```bash sudo zev dns top ``` ```text The last 6 names (over 1 min) how they were answered asked 4 66% cache 2 33% a name asked out took 3 ms on average; one from the cache takes none most asked github.com 3 wikipedia.org 2 answered by quad9 TCP 4 3 ms average asked from 127.0.0.1 5 (this computer) 192.168.1.20 1 ``` نمی‌خواهید هیچ فهرستی نگه داشته شود؟ `sudo zev dns set log=off`، و فایل پاک می‌شود. ## برای همهٔ خانه: zev dns share گوشی‌ها، تلویزیون‌ها و کنسول‌ها نمی‌توانند zev را اجرا کنند، و همان DNS دروغگو یا خراب گریبانشان را می‌گیرد. `sudo zev dns share on` اجازه می‌دهد از zev dns این کامپیوتر استفاده کنند: سرورهای درستکار، حافظهٔ موقت، جایگزین، قاعده‌های شما و بررسی DNSSEC، برای همهٔ دستگاه‌های شبکه. ```bash sudo zev dns share on ``` ```text ● zev dns answers the local network too, on 192.168.1.34 On a phone, TV or console: in its network settings, set DNS to 192.168.1.34 (manual). For every device at once: put 192.168.1.34 as the DNS server in the router's DHCP settings. Only private addresses (192.168.x, 10.x, 172.16–31.x) are answered, so it's never open to the internet. sudo zev dns share off stops it; zev dns top shows which devices asked. ``` ```diagram type: flow title: گوشی از لپ‌تاپ می‌پرسد؛ لپ‌تاپ از سرورهای درستکار --- گوشی | DNS روی 192.168.1.34 | | 📱 ~ یک نام این کامپیوتر | zev dns: حافظهٔ موقت، قاعده‌ها، DNSSEC، راه‌های درستکار | accent | 💻 ~ فقط آنچه در حافظه نیست سرورهای DNS | راه‌هایی که از این شبکه درست جواب می‌دهند | good | 🌍 ``` روی همهٔ نشانی‌های شبکهٔ محلی این کامپیوتر (وای‌فای، کابل) گوش می‌دهد، نه روی نشانی‌های Docker یا VPN، و دنبالشان می‌رود: به وای‌فای دیگری وصل شوید و آن هم جابه‌جا می‌شود. پرسش‌هایی که از نشانی‌ای غیر خصوصی بیایند اصلاً جوابی نمی‌گیرند، پس از اینترنت نمی‌شود از آن به‌عنوان سرور باز استفاده کرد. `zev dns share` می‌گوید کجا گوش می‌دهد؛ `sudo zev dns share off` خاموشش می‌کند. اگر اینجا فایروال دارید، پورت ۵۳ را برای شبکهٔ محلی باز کنید. ## قاعده‌ها: بعضی نام‌ها جای دیگر ```bash sudo zev dns rule add corp.example system # دامنهٔ کاری از راه DNS شبکه sudo zev dns rule add ads.example block # 0.0.0.0 برای آن و همهٔ نام‌های زیرش sudo zev dns rule add example.org quad9 # یک نام از راه یک سرور sudo zev dns rule country de # سایت‌های یک کشور (.de) از راه DNS شبکه zev dns rule ls sudo zev dns rule rm corp.example ``` هر قاعده خود نام و همهٔ زیرمجموعه‌هایش را می‌گیرد؛ بلندترین قاعدهٔ منطبق برنده است. فرستادن نام سطح‌بالای یک کشور به `system` سایت‌هایش را به DNS خود شبکه می‌فرستد: در همان کشور از داخل سریع‌تر جواب می‌دهند، و بعضی فقط از داخل جواب می‌دهند. ### سرورهای ضدتحریم بعضی سرویس‌ها کاربران بعضی کشورها را راه نمی‌دهند (Docker Hub، بخش‌هایی از سایت‌های توسعه‌دهندهٔ گوگل، JetBrains، HashiCorp…). در آن کشورها، سرورهای DNS محلی این نام‌ها را با نشانی رلهٔ خودشان جواب می‌دهند که شما را رد می‌کند. ```bash sudo zev dns sanctions on ``` فقط نام همین سرویس‌ها را به بهترین‌شان می‌فرستد؛ بقیه روی بهترین راه‌ها می‌مانند. بدانید یعنی چه: رله می‌بیند از کدام‌یک از این سرویس‌ها استفاده می‌کنید، و این سرورها داخل همان کشورند، پس دروغ‌های فیلترینگ آن‌جا روی آن‌ها هم هست (`zev dns why` نشانش می‌دهد). تا خودتان روشنش نکنید خاموش است. ## تنظیمات ```bash zev dns set # دیدنشان sudo zev dns set strict=on # هرگز DNS شبکه: بی‌جواب، به جای جواب رمزنگاری‌نشده sudo zev dns set proxy=off # zev proxy share را برای DNS به کار نبر sudo zev dns set rebinding=on # نشانی خصوصی برای نام‌های عمومی مجاز باشد sudo zev dns set dnssec=off # امضاها را اینجا بررسی نکن sudo zev dns set log=off # فهرستی از نام‌های پرسیده‌شده نگه ندار sudo zev dns set share=on # همان sudo zev dns share on sudo zev dns set listen=127.0.0.153:53 ``` - **strict**: برای حریم خصوصی. با آن، وقتی بهترین راه‌ها خراب‌اند، نام به جای رفتن به DNS شبکه بی‌جواب می‌ماند. پیش‌فرض خاموش است، چون از کار افتادن نام‌ها برای بیشتر مردم بدتر است. - **dnssec** (پیش‌فرض روشن): امضاها همین‌جا بررسی می‌شوند و جواب‌های جعلی برای نام‌های امضاشده دور ریخته می‌شوند. [نام‌های امضاشده](#نامهای-امضاشده-dnssec-همینجا-بررسی-میشود) را ببینید. - **محافظت در برابر rebinding** (پیش‌فرض روشن): جوابی با نشانی خصوصی (192.168.x، 10.x…) برای یک نام عمومی دور ریخته می‌شود. این یا دروغ است یا حمله به دستگاه‌های خانهٔ شما (DNS rebinding). قاعده‌هایی که به `system` می‌روند اثر نمی‌پذیرند، پس نام‌های اداری کار می‌کنند. - **log** (به‌طور پیش‌فرض روشن): ۲٬۰۰۰ نام آخری که پرسیده شد، در حافظه و در `/run/zev-dns/queries.jsonl`، که فقط root می‌تواند بخواند و با ری‌استارت پاک می‌شود. خاموش که باشد چیزی نگه داشته نمی‌شود و فایل پاک می‌شود. - **share** (به‌طور پیش‌فرض خاموش): [برای همهٔ خانه](#برای-همهٔ-خانه-zev-dns-share) را ببینید. - تنظیمات ظرف چند ثانیه اعمال می‌شوند؛ چیزی دوباره راه‌اندازی نمی‌شود. ## با zev proxy و zev vpn - وقتی `zev proxy share` روشن است، zev dns DNS روی HTTPS را **از راه پروکسی شما** هم امتحان می‌کند: وقتی هیچ راه مستقیمی درست کار نمی‌کند، این یکی همچنان کار می‌کند. - وقتی `sudo zev vpn on` روشن است، DNS خود وی‌پی‌ان از تونل می‌گذرد؛ zev dns به لینک وی‌پی‌ان دست نمی‌زند و هر دو درست جواب می‌دهند. ## خاموش کردن، از کار افتادن و ری‌استارت ```bash sudo zev dns off # خاموشش کن و دقیقاً آنچه تغییر داده را برگردان sudo zev dns restore # فقط تنظیمات DNS سیستم را برگردان (همان که systemd اجرا می‌کند اگر zev dns از کار بیفتد) zev dns serve --listen 127.0.0.1:5353 # همان سرور در این ترمینال، روی هر پورتی، بی تغییر دادن چیز دیگر dig @127.0.0.1 -p 5353 example.com # از آن بپرس ``` سرویس را متوقف می‌کند و دقیقاً همان چیزهایی را که عوض کرده برمی‌گرداند: تنظیم resolved، لینک‌هایی که عوض کرد (و فقط همان‌ها) یا `/etc/resolv.conf` قبلی. طوری ساخته شده که یک خرابی نتواند رایانه را بی DNS بگذارد: - اگر zev dns به هر دلیلی متوقف شود، حتی اگر کشته شود، systemd فوراً DNS سیستم را برمی‌گرداند (`zev dns restore`) و دوباره راهش می‌اندازد. - تنظیم resolved در `/run` است: ری‌استارت همیشه پاکش می‌کند و zev dns هنگام شروع دوباره می‌گذاردش. - `sudo zev dns on` بررسی می‌کند که سیستم واقعاً نام‌ها را از آن می‌گیرد، و اگر نه همه‌چیز را برمی‌گرداند. ## دروغ را چطور می‌شناسد | نشانه | zev چه می‌کند | |---|---| | نشانی‌ای که فیلترینگ می‌دهد (مثل `10.10.34.x`)، یا نشانی‌ای که از جایی بی سرور DNS جواب آمد | جواب دور ریخته می‌شود؛ UDP ساده همچنان منتظر جواب واقعی می‌ماند | | نشانی خصوصی برای یک نام عمومی | دور ریخته می‌شود (محافظت rebinding) | | جواب برای نامی که نمی‌تواند وجود داشته باشد (نامی تصادفی زیر example.com) | آن سرور به کار نمی‌رود | | 0.0.0.0 برای یک نام معمولی | سرور عمداً نام‌ها را می‌بندد: شمرده می‌شود، فقط برای `adblock` و `family` قبول است | | حروف نام با بزرگی و کوچکی‌ای جز آنچه پرسیده شد (DNS 0x20) | جواب جعلی: دور ریخته می‌شود، برای سرورهایی که بزرگی و کوچکی حروف را نگه می‌دارند | | برای یک نام امضاشده، جوابی که با امضاهای DNSSEC آن جور نیست | دور ریخته می‌شود و راه بعدی پرسیده می‌شود؛ اگر جواب همهٔ راه‌ها جعلی باشد SERVFAIL | ## هر راه چه چیزی را نشان می‌دهد - **DNS روی HTTPS / TLS**: شبکه فقط می‌بیند با یک سرور DNS حرف می‌زنید، نه چه نام‌هایی. zev پرسش‌ها را تا ۱۲۸ بایت پر می‌کند (RFC 8467) تا طولشان نام را لو ندهد. - **DNS ساده، هر پورتی، UDP یا TCP**: شبکه می‌تواند همهٔ نام‌ها را ببیند. درست است (zev بررسی می‌کند)، نه خصوصی. - **خود سرور DNS** در هر حال نام‌های شما را می‌بیند؛ کاربرد `private` سرورهایی را برمی‌گزیند که لاگ نگه نمی‌دارند و نشانی شما را جلو نمی‌فرستند. ## محدودیت‌ها - `sudo zev dns on` فعلاً برای لینوکس است. روی macOS، `sudo zev dns serve --listen 127.0.0.1:53` را اجرا کنید و DNS سیستم را 127.0.0.1 بگذارید. `check`، `bench` و `why` روی لینوکس و macOS کار می‌کنند. - سرورها از راه IPv4 پرسیده می‌شوند؛ نام‌هایی با نشانی IPv6 (AAAA) به طور عادی جواب داده می‌شوند. - DNSSEC برای الگوریتم‌هایی که امروز به کار می‌روند بررسی می‌شود (RSA/SHA-1، RSA/SHA-256، RSA/SHA-512، ECDSA P-256 و P-384، Ed25519)؛ ناحیه‌ای که فقط با الگوریتم‌های دیگر امضا شده (Ed448، DSA و GOST قدیمی) امضانشده حساب می‌شود. NSEC3 با بیش از ۱۵۰ تکرار هم امضانشده حساب می‌شود (RFC 9276). - DNS ساده روی TCP برای هر پرسش یک اتصال باز می‌کند، پس راه‌های TCP پایین‌تر از بقیه قرار می‌گیرند.