בדיקת DNS לפני עלייה לאוויר

לפני שמפנים מבקרים לשרת חדש, בודקים מה ה-DNS באמת עונה: האם השם מצביע לכתובת של השרת, האם ה-resolvers כבר מסכימים, והאם משהו יעצור את התעודה. הדפדפן שואל ישירות שני resolvers ציבוריים; שום דבר לא עובר דרך ANAROQ ולא נשאר אצלנו.

השם שמבקרים יקלידו, למשל app.example.com. אפשר גם להדביק כתובת URL.
כתובת ה-IPv4 הציבורית של השרת. היא נשארת בדפדפן.
רק אם השרת עונה ב-IPv6. היא נשארת בדפדפן.

מה יוצא מהדפדפן

כשלוחצים על בדיקת DNS, הדפדפן שולח את שם הדומיין שהזנתם, כשאילתות DNS, ישירות אל Cloudflare 1.1.1.1 ו-Google Public DNS. כמו בכל בקשה, הם רואים גם את כתובת ה-IP שלכם. שום דבר לא נשלח לפני הלחיצה.

השם לא נשלח ל-ANAROQ, לא נשמר, לא נכנס לקישור ולא נשלח לאנליטיקה. הכתובות הצפויות לא יוצאות מהדפדפן.

מה הכלי עושה

הכלי שואל מהדפדפן שני resolvers ציבוריים של DNS-over-HTTPS על רשומות A, ‏AAAA, ‏CNAME, ‏MX, ‏TXT ו-CAA של דומיין, ובודק אותן מול כתובת השרת שאתם עומדים להעלות: שהכתובת תואמת, ששני ה-resolvers מסכימים, שה-cache לא יחזיק כתובת ישנה שעות, שאין CNAME בשורש, ושה-CAA מאפשר ל-Let's Encrypt להנפיק את התעודה ש-Caddy, ‏Traefik או Certbot יבקשו.

איך זה עובד

  1. הזינו את שם הדומיין ואת כתובת ה-IPv4 הציבורית של השרת (וגם IPv6, אם הוא עונה ב-IPv6).
  2. קראו את ההודעה: הלחיצה שולחת את השם לשני ה-resolvers שמופיעים בה.
  3. לחצו על בדיקת DNS. כל סוג רשומה נשאל מכל resolver במקביל, תוך כמה שניות.
  4. קראו את הממצאים, החמורים קודם, כל אחד עם מה לשנות. אחרי שינוי, בדקו שוב כשה-TTL עבר.

מה נבדק

השם קיים ויש לו כתובת
NXDOMAIN, ‏SERVFAIL (הרבה פעמים שרשרת DNSSEC שבורה) ושם בלי רשומת A או AAAA הם שגיאות: אף אחד לא יגיע לאתר.
הכתובת הצפויה
A ו-AAAA מושוות לכתובות שהזנתם: כתובת אחרת היא שגיאה, כתובת נוספת היא אזהרה, ורשומות AAAA שלא בדקתם מדווחות, כי מבקרים עם IPv6 משתמשים בהן קודם.
Propagation
אם שני ה-resolvers עונים אחרת, אחד מהם עדיין מחזיק את התשובה הישנה עד שה-TTL שלה פג. בלי כתובת צפויה זה מוצג כמידע בלבד, כי CDN יכול לענות לפי מיקום.
TTL
רשומות כתובת שנשמרות ב-cache יותר משעה אומרות שמעבר יגיע לחלק מהמבקרים רק אחרי שעות: הורידו את ה-TTL לפני המעבר.
CNAME בשורש
CNAME לא יכול לעמוד לצד הרשומות שדומיין שורש צריך. ספקים מציעים במקומו ALIAS, ‏ANAME או CNAME flattening.
CAA
רשומות ה-CAA של השם, או של ההורה הקרוב שיש לו כאלה, חייבות להתיר את letsencrypt.org, אחרת התעודה האוטומטית תסורב.
כתובות פרטיות
רשומה שמצביעה לכתובת פרטית, loopback או link-local לא נגישה מהאינטרנט.

דוגמה

app.example.com עבר לפני שעה לשרת חדש (203.0.113.10). ‏Cloudflare כבר עונה עם הכתובת החדשה; Google עדיין עונה עם הישנה, שנשמרת ב-cache כמעט ארבע שעות. נשארה רשומת AAAA מהשרת הישן, וה-CAA של דומיין ההורה מתיר רק ל-DigiCert. אלה הממצאים האמיתיים של הבודק על התשובות האלה:

התוצאה עבור app.example.com

מה כל resolver עונה

ResolverמצבAAAAA
Cloudflare 1.1.1.1ענה203.0.113.102001:db8::7
Google Public DNSענה198.51.100.72001:db8::7

רשומות

כפי ש-Cloudflare 1.1.1.1 ענה. ה-TTL הוא הזמן שה-resolver עוד רשאי לשמור כל רשומה.

סוגשםערךTTL (שניות)
Aapp.example.com203.0.113.10300
AAAAapp.example.com2001:db8::7300
  • app.example.com נבדק כתת-דומיין.
  • רשומות ה-CAA שחלות נמצאות ב-example.com.

ממצאים

שגיאה0
גבוהה1
בינונית2
נמוכה0
מידע1

4 ממצאים: 0 שגיאה, 1 גבוהה, 2 בינונית, 0 נמוכה, 1 מידע.

גבוהה1

  1. גבוההAQ-DNS-009

    רשומות ה-CAA ב-example.com מתירות רק ל-digicert.com להנפיק תעודות: ‏Let's Encrypt ‏(Caddy, ‏Traefik, ‏Certbot) יסורב.

    תיקון: הוסיפו רשומת CAA ‏0 issue "letsencrypt.org" ב-example.com (השאירו את האחרות אם אתם עדיין משתמשים ברשויות האלה).

    מקור

בינונית2

  1. בינוניתAQ-DNS-006

    ל-app.example.com יש גם רשומות AAAA ‏(IPv6): 2001:db8::7. מבקרים עם IPv6 יתחברו לשם קודם, ולא לכתובת ה-IPv4 שציפיתם לה.

    תיקון: מלאו למעלה את כתובת ה-IPv6 של השרת כדי לבדוק אותה, או מחקו רשומות AAAA שנשארו משרת ישן או מדף חנייה.

  2. בינוניתAQ-DNS-007

    ה-resolvers לא מסכימים על A: ‏Cloudflare 1.1.1.1 מחזיר 203.0.113.10, ‏Google Public DNS מחזיר 198.51.100.7.

    תיקון: מיד אחרי שינוי זה propagation: ‏resolvers שומרים את התשובה הישנה עד שה-TTL שלה פג. אם זה נמשך יותר מה-TTL, בדקו שכל שרתי ה-NS של הדומיין מגישים את אותה zone. גם CDN יכול לענות לפי מיקום בכוונה.

    מקור

מידע1

  1. מידעAQ-DNS-011

    רשומות הכתובת נשמרות ב-cache עד 13980 שניות (בערך 3.9 שעות): אחרי שינוי, חלק מהמבקרים ימשיכו להגיע לכתובת הישנה כל הזמן הזה.

    תיקון: לפני מעבר לשרת חדש, הורידו את ה-TTL (למשל ל-300) וחכו שהישן יעבור; החזירו אותו אחרי המעבר.

    מקור

מגבלות

  • הכלי רואה מה שני resolvers ציבוריים עונים מהמיקום שלכם, לא כל resolver בעולם ולא את ה-cache של המבקרים.
  • ה-TTL הוא מה שה-resolver עוד רשאי לשמור, לא בהכרח הערך שהוגדר ב-zone.
  • ההחלטה אם שם הוא דומיין שורש נעשית בלי ה-Public Suffix List: שתי תוויות (example.com), או שלוש תחת תווית סוג נפוצה (example.co.il). מקרים אחרים עלולים להיקבע לא נכון.
  • הכלי לא מתחבר לשרת: TLS, פורטים ו-HTTP דורשים בדיקה מצד שרת, שעוד לא זמינה.
  • רק רשומות issue נבדקות מול Let's Encrypt; issuewild (תעודות wildcard) מוצגות אבל לא נבדקות.

מתודולוגיה: איך מחושבים המספרים

מקורות

  1. RFC 1034 §3.6.2: CNAME and other data
  2. RFC 1035 §3.2.1: TTL
  3. RFC 8659: DNS CAA resource record
  4. Let's Encrypt: Certificate Authority Authorization (CAA)
  5. RFC 8484: DNS queries over HTTPS (DoH)
  6. Google Public DNS: JSON API for DNS over HTTPS
  7. Cloudflare 1.1.1.1: DNS over HTTPS, JSON format

עודכן

הצעד הבא

מחולל תצורת reverse proxy: ‏Caddy, ‏Traefik ו-nginx

כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה