שאלה מדוע לא ניתן להשתמש ברשומת CNAME בקודקוד (aka root) של דומיין?


זה קנוניקל שאלה על CNAMEs על apices (או שורשים) של אזורי

זה ידע נפוץ יחסית CNAME רשומות בשיא של תחום הם תרגול טאבו.

דוגמא: example.com. IN CNAME ithurts.example.net.

במקרה הטוב תרחיש במקרה התוכנה שמות יכול לסרב לטעון את התצורה, ובמקרה הגרוע ביותר הוא עשוי לקבל את התצורה הזו ולבטל את התצורה עבור example.com.

לאחרונה היתה לי חברת webhosting להעביר הוראות ליחידה העסקית שאנחנו צריכים CNAME את השיא של התחום שלנו לרשומה חדשה. בידיעה שזה יהיה התאבדות התאוששות כאשר מוזן BIND, יעצתי להם כי לא נוכל לקיים את זה וכי זה היה ייעוץ דרגש בכלל. חברת Webhosting לקח את העמדה כי זה לא אסור בהחלט על ידי הגדרה סטנדרטית RFCs וכי שלהם התוכנה תומכת בו. אם לא הצלחנו CNAME את השיא, העצה שלהם היתה לא שיא שיא בכלל והם לא יספק שרת אינטרנט להפניה מחדש. ...מה?

רובנו יודעים זאת RFC1912 מתעקש כי A CNAME record is not allowed to coexist with any other data., אבל בואו נהיה כנים עם עצמנו כאן, כי RFC הוא רק מידע. הקרובה ביותר שאני יודע כדי verbage שאוסרת את הנוהג הוא מ RFC1034You

אם RR CNAME קיים בצומת, אין נתונים אחרים   מתנה; זה מבטיח כי הנתונים עבור שם קנוני ואת כינויים שלה   לא יכול להיות שונה.

למרבה הצער אני כבר בתעשייה מספיק זמן כדי לדעת כי "לא צריך" הוא לא אותו דבר כמו "לא", וזה חבל מספיק עבור רוב מעצבי תוכנה לתלות את עצמם עם. הידיעה כי כל דבר קצר של קישור תמציתי לטרוק דנק יהיה בזבוז של הזמן שלי, אני בסופו של דבר לתת לחברה לצאת עם גערה על ההמלצה תצורות שיכולות לשבור תוכנה נפוץ ללא גילוי נאות.

זה מביא אותנו Q & A. פעם אחת אני רוצה שנשיג באמת טכנית על אי שפיות של CNAMEs קווים, ולא חצאית סביב הבעיה כמו שאנחנו עושים בדרך כלל כאשר מישהו הודעות בנושא. RFC1912 הוא מחוץ לתחום, כמו גם כל מידע RFC אחר החלים כאן, כי אני לא חושב. בואו נסגור את התינוק הזה.


108
2017-07-19 10:53




RFC 1034 עושה מראש RFC 2119 על ידי די הרבה זמן וניסיון. - Michael Hampton♦


תשובות:


CNAME היו רשומות במקור נוצר כדי לאפשר שמות מרובים המספקים את אותו משאב להיות aliased ל "שם קנוני" יחיד עבור המשאב. עם הופעת שם אירוח וירטואלי מבוסס, זה במקום להיות רגיל להשתמש בהם כצורה כללית של aliasing כתובת IP. למרבה הצער, רוב האנשים שמגיעים מן אירוח אתרים רקע לצפות CNAME רשומות כדי לציין שקילות ב- DNS, אשר מעולם לא היתה הכוונה. הקודקוד מכיל סוגי רשומות אשר בבירור לא המשמשים לזיהוי משאב המארח הקנוני (NS, SOA), אשר לא ניתן aliased מבלי לשבור את תקן ברמה הבסיסית. (במיוחד לגבי חתכים אזוריים)

לרוע המזל, תקן ה- DNS המקורי נכתב לפני שהסטנדרטים השולטים בגופים הבינו שיש צורך במלל מפורש כדי להגדיר התנהגות עקבית (RFC 2119). היה צורך ליצור RFC 2181 כדי להבהיר כמה פינות במקרים עקב ניסוח מעורפל, ואת המעודכנת המכתב מבהיר כי א CNAME  לא יכול לשמש להשגת aliex apex מבלי לשבור את תקן.

6.1. אזור סמכות

שרתים סמכותי עבור אזור נספרים ברשומות NS      עבור המקור של האזור, אשר, יחד עם התחלה של הרשות      (SOA) הם רשומות חובה בכל אזור.  שרת כזה      הוא סמכותי עבור כל הרשומות משאבים באזור שאינם נמצאים      אזור אחר. רשומות NS המציינות חיתוך אזור הם      רכוש של אזור הילד שנוצר, כמו גם רשומות אחרות עבור      המוצא של אזור הילד, או כל תת-תחומים שלו. שרת עבור      אזור לא צריך לחזור תשובות סמכותי עבור שאילתות הקשורות      שמות באזור אחר, הכולל את NS, ואולי A, רשומות      ב לחתוך אזור, אלא אם כן זה גם קורה לשרת עבור אחרים      אזור.

זה קובע את זה SOA ו NS הרשומות הן חובה, אבל זה לא אומר כלום A או סוגים אחרים המופיעים כאן. זה אולי נראה מיותר שאני מצטט את זה אז, אבל זה יהיה רלוונטי יותר ברגע.

RFC 1034 היה קצת מעורפל על הבעיות שעלולות להתעורר כאשר CNAME קיים לצד סוגי רשומות אחרים. RFC 2181 מסיר את העמימות ומציין במפורש את סוגי התקליטים שמותר להם להתקיים לצדם:

10.1. רשומות CNAME משאבים

שם DNS CNAME ("שם קנוני") קיים כדי לספק את      שם קנוני הקשור לשם כינוי. אולי יש רק אחד      שם קנוני כזה עבור כל כינוי אחד. שם זה צריך להיות בדרך כלל      שם שקיים במקומות אחרים ב- DNS, אם כי יש כמה נדירים      יישומים עבור כינויים עם השם הקנוני המלווה      לא מוגדר ב- DNS. שם כינוי (תווית של רשומת CNAME) עשוי,      אם DNSSEC נמצא בשימוש, יש SIG, NXT, ו REYs KEY, אבל אולי לא      נתונים אחרים.  כלומר, עבור כל תווית ב- DNS (כל שם תחום)      בדיוק אחד מהבאים נכון:

 + one CNAME record exists, optionally accompanied by SIG, NXT, and
   KEY RRs,
 + one or more records exist, none being CNAME records,
 + the name exists, but has no associated RRs of any type,
 + the name does not exist at all.

"שם כינוי" בהקשר זה מתייחס לצד השמאלי של CNAME תקליט. הרשימה המפורסמת עושה את זה ברור במפורש כי א SOA, NS, ו A רשומות לא ניתן לראות בצומת שבו CNAME מופיע גם. כאשר אנו משלבים את זה עם סעיף 6.1, זה בלתי אפשרי עבור CNAME להתקיים בנקודה שבה היא צריכה לחיות לצד חובה SOA ו NS רשומות.

(זה נראה לעשות את העבודה, אבל אם למישהו יש נתיב קצר יותר להוכחה בבקשה לתת סדק על זה.)


עדכון:

נראה כי הבלבול האחרון מגיע ההחלטה האחרונה של קלאודפלייר כדי לאפשר הגדרת רשומת CNAME לא חוקית בקודקוד הדומיינים, שעבורם הם מסנתזים רשומות A. "RFC תואם" כפי שתואר על ידי המאמר המקושר מתייחס לעובדה כי רשומות מסונתז על ידי Cloudflare ישחק יפה עם DNS. זה לא משנה את העובדה כי היא התנהגות מותאמת אישית לחלוטין.

לדעתי, זהו עוול לקהילת ה- DNS הגדולה יותר: הוא אינו למעשה רשומת CNAME, והוא מטעה אנשים להאמין שתוכנה אחרת חסרה בכך שלא אפשרה זאת. (כפי שמראה השאלה שלי)


87
2017-07-19 10:53



אני מסכים עם ההוכחה הזאת ואני לא חושב שדרך ההוכחה של שני הצעדים האלה ארוכה במיוחד או מתפתלת. (1. אזור מובטחת מובטחת לפחות SOA + NS רשומות, 2. CNAME רשומות אינן מותרות לדור בכפיפה אחת עם נתונים אחרים) - Håkan Lindqvist
בסך הכל, אני חושב שזה הסבר טוב מאוד. אם אפשר להוסיף משהו, אני חושב שזה יהיה עוד יותר להסביר מה CNAME למעשה, משמעות הדבר היא שזהו סוג הרשומה הנפוץ ביותר. למרות שזה סוג של מעבר לנקודה, אני חושב שזה להיות שאלה היא תוצאה ישירה של רבים (רוב?) לא צורך הבנה נכונה של CNAME. - Håkan Lindqvist
@Denis זה לא יכול להיות ענה בצורה מקיפה בתוך תגובה. התשובה הקצרה ביותר היא שאתה צריך לקרוא את RFCs (1034, 1035) ויש להם הבנה טובה של מה הם הפניות, מה ההתנהגויות הנדרשות עבור הפניה הם (רשות, נוכחות SOA נוכחות וכו '), ולמה זה סוג של "הפניה פחות" aliasing מפר ציפיות רבות של שרתי DNS ברמה התפקודית. וזה רק כדי להתחיל. שאלה זו היא לא נושא טוב כאן כי זה ספקולטיבי ולא מושרשת בעיה שתיתקל עובד עם שרת DNS תואם כראוי, סטנדרטית תואם. - Andrew B
@DenisHowe בקיצור: אין דבר כזה "תחום" ללא NS ו רשומות SOA. אלה הם הרשומות הלא אופציונליות. - hakamadare
@Ekevoo ניתן לטעון כי יישומי HTTP צריכים להיות מאומצים SRV במקום זאת, זה היה גם להפוך את זה לא בעיה. הבעיה אינה מוגבלת למה שנדון כאן; CNAME הוא, בניגוד לאמונה הרווחת, לא התאמה גדולה למה שנדרש. בסופו של דבר, כמו CNAME לא עובד כמו אנשים מצפים (!) ולא ניתן לעצב מחדש באופן רטרואקטיבי כמו מיישומי HTTP לא משתמשים SRV נראה יותר סביר כי הפונקציונליות "כינוי" סגנון הופך להיות נפוץ יותר כדי לשרת HTTP (סוג שיא aliasing ספציפי מיושם מאחורי הקלעים ולא כסוג רשומה גלוי) - Håkan Lindqvist


אם אתה מפנה אזור שלם, עליך להשתמש ב- DNAME. לפי RFC 6672,

RR של DNAME ו- RR CNAME [RFC1034] גורמים לחיפוש      (פוטנציאל) נתוני החזרה המתאימים לשם תחום שונה      שם הדומיין השאום. ההבדל בין השניים      רשומות משאבים הוא כי RR CNAME מפנה את בדיקת הנתונים ב      הבעלים שלו לשם אחר, בעוד RR DNAME מפנה חיפושי      עבור נתונים בצאצאי שם הבעלים לשמות המתאימים      תחת צומת (יחיד) שונה של העץ.

לדוגמה, נסו להסתכל דרך אזור (ראו RFC 1034 [RFC1034],      סעיף 4.3.2, שלב 3) עבור שם התחום "foo.example.com" ו- a      רשומת משאב DNAME נמצאת בכתובת "example.com" המציינת שכל      שאילתות תחת "example.com" להיות מופנית "example.net". החיפוש      התהליך יחזור לשלב 1 עם שם השאילתה החדש של      "foo.example.net". אם שם השאילתה היה "www.foo.example.com",      שם השאילתה החדש יהיה "www.foo.example.net".


0
2018-03-27 15:41



זוהי פרשנות שגויה. עיין בשורה השנייה של הטבלה RFC 6672 §2.2. קוד Dex משויך לא יגרום לשום התאמה לסוגי שאילתות שאינם DNAME בקודקוד, כלומר לא יביא לחריגה בפועל של רשומת A או AAA. - Andrew B
קודקוד Dex יביא לא ניתוב מחדש עבור שאילתות של שם הקודקוד. זה לא נכון מבחינה טכנית לומר שזה יביא לא התאמה. אתה עדיין מקבל התאמה אם שאילתה עבור NS, SOA, או כל סוגי RR אחרים, כי הם למעשה מתנה עבור שם הקודקוד. מ RFC 6672: "אם קיים רשומת DNAME באזור השיא של האזור, עדיין יש צורך בהרשאות המשאבים המקובלות של SOA ו- NS גם שם, כך שלא ניתן להשתמש ב- DNAME מראה אזור לחלוטין, כפי שהוא לא מראה אזור השיא ". - Quuxplusone