مقدمة
قررت أن أكتب الشم ، إذا جاز التعبير ، للمتعة فقط. فقط انظر العناوين التي يتم حلها على نظامي. البروتوكول قديم ، يجب أن يكون هناك الكثير من الوثائق. كثير لكن جميع المقالات غير مكتملة للغاية ونهاية ، في اللحظة الأكثر إثارة للاهتمام. نعم ، هناك rfc1035 ، لكنني أود باللغة الروسية ومع الشرح. في الواقع على تراكم الخبرة وتحليل حزمة قد نضجت هذه المقالة. تم تصميمه لأولئك الذين يفهمون ما هو DNS ويفهم أن هناك طلبات وإجابات. بالنسبة لأولئك الذين يريدون أن يفهموا قليلا في هيكل هذا البروتوكول.
المقالة تنطوي على نظرية ، ثم القليل من الممارسة.
هيكل حزمة DNS
+---------------------+ | Header | +---------------------+ | Question | +---------------------+ | Answer | +---------------------+ | Authority | +---------------------+ | Additional | +---------------------+
العنوان - رأس حزمة DNS ، ويتألف من 12 وحدة.
قسم الأسئلة - في هذا القسم ، يقوم عميل DNS بإرسال الاستعلامات إلى خادم DNS لإبلاغه بالاسم الذي من الضروري حل (حل) سجل DNS ، وكذلك نوع (NS ، A ، TXT ، إلخ). عند الاستجابة ، يقوم الخادم بنسخ هذه المعلومات ويعيدها إلى العميل في نفس القسم.
قسم الإجابة - يخبر الخادم العميل بالإجابة أو بالعديد من الردود على الطلب ، حيث يبلغ عن البيانات المذكورة أعلاه.
القسم الموثوق - يحتوي على معلومات حول الخوادم الموثوقة التي حصلت على المعلومات المضمنة في قسم استجابة DNS.
قسم السجل الإضافي - السجلات الإضافية المتعلقة بالطلب ، ولكنها ليست إجابات صارمة على السؤال.
قد يكون هناك عدة أو عدد قليل من الإدخالات في الأقسام. يتم تحديد كل شيء حسب العنوان.
هيكل رأس DNS
1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
المعرف (16 بت) - يستخدم هذا الحقل كمعرف فريد للمعاملة. يشير إلى أن الحزمة تنتمي إلى نفس جلسة "استجابة الطلب" وتشغل 16 بت.
QR (1 بت) - يتم استخدام هذا البت لتحديد ما إذا كانت الحزمة طلبًا (QR = 0) أو استجابة (QR = 1).
شفرة التشغيل (4 بت) - باستخدام هذا الرمز ، يمكن للعميل تحديد نوع الطلب ، حيث القيمة المعتادة هي:
- 0 - طلب قياسي
- 1 - طلب معكوس ،
- 2 - طلب حالة الخادم.
- 3-15 - محفوظة للمستقبل.
AA (1 بت) - هذا الحقل منطقي في ردود DNS فقط من الخادم ويبلغ ما إذا كانت الإجابة موثوقة أم لا.
TC (1 بت) - يتم تعيين هذه العلامة في حزمة الاستجابة إذا لم يتمكن الخادم من وضع جميع المعلومات الضرورية في الحزمة بسبب القيود الحالية.
RD (1 بت) - يتم تعيين علامة البت الواحد هذه في الطلب ويتم نسخها إلى الاستجابة. إذا تم تعيين العلامة في الطلب ، فهذا يعني أن العميل يطلب من الخادم عدم إخباره بإجابات وسيطة ، ولكن لإرجاع عنوان IP فقط.
RA (1 بت) - يتم إرساله فقط في الردود ، ويذكر أن الخادم يدعم الإعادة
Z (3 بت) - محجوزة ودائما تساوي الصفر.
RCODE (4 بت) - يستخدم هذا الحقل لإعلام العملاء إذا تم إكمال الطلب بنجاح أو مع وجود خطأ.
- 0 - يعني الطلب الذي تم تمريره دون أخطاء ؛
- 1 - يرجع الخطأ إلى حقيقة أن الخادم لم يستطع فهم نموذج الطلب ؛
- 2 - هذا الخطأ مع التشغيل غير الصحيح لخادم الاسم ؛
- 3 - الاسم الذي يسمح للعميل غير موجود في هذا المجال ؛
- 4 - لا يستطيع الخادم تلبية الطلب من هذا النوع ؛
- 5 - يعني هذا الرمز أن الخادم لا يمكنه تلبية طلب العميل بسبب قيود الأمان الإداري.
QDCOUNT (16 بت) - عدد السجلات في قسم الاستعلام
ANCOUNT (16 بت) - عدد الإدخالات في قسم الإجابات
NSCOUNT (16 بت) - عدد الإدخالات في قسم السلطة
ARCOUNT (16 بت) - عدد السجلات في قسم السجل الإضافي
طلب هيكل القسم
1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | / QNAME / / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QTYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QCLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
QNAME -
يبدأ كل طلب وسجل استجابة بـ NAME. هذا هو اسم المجال الذي يرتبط به هذا السجل أو "ينتمي" إليه. تم ترميزه كسلسلة من العلامات. في هذه المرحلة ، يجب أن نتعمق في التفاصيل.
في المقالات التي رأيتها ، نسوا أن نقول إن بروتوكول DNS الأصلي يوفر نوعين من التسميات ، والتي يتم تحديدها بواسطة البتات الأول والثاني:
00 (التسمية القياسية) - تعني أن الـ 6 بت المتبقية تحدد طول الملصق ، متبوعة بعدد معين من الثمانيات. وفقًا لذلك ، لا يمكن أن يتجاوز طول التسمية أكثر من 63 بايت (على سبيل المثال ، ستعرض NSLOOKUP الرسالة "ليس اسمًا قانونيًا (التسمية طويلة جدًا)" عند محاولة إعداد مضيف بتسمية طويلة). ينتهي التسجيل بالرمز 0x00.
11 (تسمية مضغوطة) - ثم تحدد الـ 14 بت التالية رابطًا لعنوان البدء لسلسلة التسميات. كما أظهرت التجربة ، قد تحتوي أيضًا على ملصق مضغوط إلى عنوان آخر. في الطلب ، وكقاعدة عامة ، لا توجد مثل هذه التسميات.
أيضًا ، يمكن أن تحتوي التسمية على القيمة 0x00 (طول صفري) ، مما يعني أنه اسم مجال الجذر (الجذر).
الحد الأقصى لطول NAME هو <= 255. هذا من أجل سهولة التنفيذ.
QTYPE - نوع سجل DNS الذي نبحث عنه (NS ، A ، TXT ، إلخ).
QCLASS - فئة الطلب المحدد (IN للإنترنت).
هيكل قسم الاستجابة
1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | / / / NAME / | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | CLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TTL | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | RDLENGTH | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| / RDATA / / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
NAME - نفس التنسيق مثل QNAME في قسم الطلب.
النوع - نوع سجل المورد. يحدد التنسيق والغرض من سجل المورد هذا.
CLASS - فئة سجل الموارد ؛ من الناحية النظرية ، يمكن استخدام DNS ليس فقط مع TCP / IP ، ولكن أيضًا مع أنواع الشبكات الأخرى ، يحدد الكود الموجود في حقل الفئة نوع الشبكة. أساسا في الإنترنت (الرمز 0x0001)
TTL - (الوقت للعيش) - وقت التخزين الصحيح لسجل المورد هذا في ذاكرة التخزين المؤقت لخادم DNS غير المستجيب.
RDLENGTH - طول حقل البيانات (RDATA).
RDATA - حقل البيانات ، الذي يعتمد شكله ومحتواه على نوع السجل.
ممارسة
النظر في حزمة من طلب حقيقي والاستجابة. إطلاق الشم المفضل لديك وحل habrahabr.ru.
تحقيق
دعنا نحلل بنية رأس نظام أسماء النطاقات.
معرف المعاملة = 0x9bce
التالي هي الأعلام. يتم تمثيل 01 00 كقيمة ثنائية 0'0000'0'0'1'0'000'0000 (يشار إليها فيما يلي ، أفصل البتات بفاصلة علوية للحصول على تمثيل بصري أفضل لتقسيم العلم)
QR = 0 - يعني أن هذه الحزمة هي طلب ؛
شفرة التشغيل = 0000 - طلب قياسي ؛
AA = 0 - هذا الحقل منطقي في إجابات DNS فقط ، لذلك دائمًا 0 ؛
TC = 0 - هذا الحقل منطقي فقط في إجابات DNS ، لذلك دائمًا 0 ؛
RD = 1 - يرجى إعادة عنوان IP فقط ؛
RA = 0 - يتم إرساله فقط بواسطة الخادم ؛
Z = 000 - دائمًا الأصفار ، الحقل المحجوز ؛
RCODE = 0000 - كل شيء ذهب دون أخطاء
QDCOUNT = 00 01 - 1 إدخال في قسم الاستعلام
ANCOUNT = 00 00 - يكون الطلب دائمًا 0 ، قسم للإجابات
NSCOUNT = 00 00 - يكون الطلب دائمًا 0 ، قسم للإجابات
ARCOUNT = 00 00 - يكون الطلب دائمًا 0 ، قسم للإجابات
التالي لدينا أقسام الطلب والاستجابة. مع دخول واحد.
الثماني الأولى التي لدينا هي 0x09 ، تخيلها كقيمة ثنائية 00'001001. أول رقمين يذهبان 00 ، مما يعني أن هذه تسمية عادية. طول التسمية 9 بايت (b001001). "68 61 62 72 61 68 61 62 72". هذه هي 9 بايت. تقول "habrahabr" (بالسداسي عشري). المضي قدما. اوكت 0x02. أول اثنين من البتات هي 00 ، ثم مرة أخرى تسمية عادية بطول 2 بايت. ها هم: "72 75". هو مكتوب "رو". المضي قدما. Octet 0x00. هذا يعني نهاية دخول المضيف. حصلنا على كلمتين "habrahabr" و "ru". نحن توحدهم بنقطة ، نحصل على "habrahabr.ru" ، هذا هو المضيف الذي طلبناه.
QTYPE = 0x0001 - يتوافق مع النوع A (طلب عنوان المضيف)
QCLASS = 0x0001 - يتوافق مع فئة IN.
الجواب
دعنا نحلل بنية رأس نظام أسماء النطاقات.
معرف المعاملة = 0x9bce. يجب أن يكون هو المعرف بالضبط من الطلب.
أعلام مرة أخرى. 81 80 تمثل القيمة الثنائية 1'0000'0'0'1'1'000'0000
QR = 1 - يعني أن هذه الحزمة هي الحل ؛
شفرة التشغيل = 0000 - طلب قياسي ؛
AA = 0 - الخادم غير موثوق للمجال ؛
TC = 0 - جميع المعلومات تناسب في حزمة واحدة ؛
RD = 1 - يرجى إعادة عنوان IP فقط ؛
RA = 1 - خادم يدعم العودية ؛
Z = 000 - دائمًا الأصفار ، الحقل المحجوز ؛
RCODE = 0000 - كل شيء ذهب دون أخطاء
QDCOUNT = 00 01 - 1 إدخال في قسم الاستعلام
الحساب = 00 01 - الآن لدينا إدخال واحد في الإجابة
NSCOUNT = 00 00 - يكون الطلب دائمًا 0 ، قسم للإجابات
ARCOUNT = 00 00 - يكون الطلب دائمًا 0 ، قسم للإجابات
التالي لدينا أقسام الطلب والاستجابة. مع اثنين من المدخلات. سجل واحد من الطلب ، سجل آخر مع الجواب. لن أرسم قسم الطلب ، فسيظل دائمًا 1v1 كما في حزمة الطلب. تابع قسم الإجابة.
الثمانية الأولى هي 0x09 ، أول بتتين هما 00 ، مما يعني تسمية عادية بطول 9 بايت. قراءة 9 بايت ، الحصول على "HABRAHABR". التالي يأتي 0XC0 (b11000000). كما ترون ، تبلغ قيمة البتات الأولين 11 ، مما يعني أن لدينا رابطًا مضغوطًا. ننظر إلى البتات الثمانية التالية (لدينا 0x16 (b00010110)) ونتحد مع البتات الستة الأخيرة الحالية. نحصل على b00000000010110. رابط إلى البايت 22 من حزمة DNS (02 72 75 00). بدءًا من الساعة 22 من اليوم ، نحصل على التصنيفات مرة أخرى. بنفس القواعد. نحصل عليه. نحن نجمع بين كل ما تلقينا ، اتضح "HABRAHABR.ru" هذا هو المضيف ، والتي سيتم مناقشتها أكثر.
QTYPE = 0x0001 - يتوافق مع النوع A (طلب عنوان المضيف)
QCLASS = 0x0001 - يتوافق مع فئة IN.
TTL = 0x00000c90 - بيانات تصل إلى 3216 ثانية.
RDLENGTH = 0x0004 - طول البيانات هو 4 ثمانيات.
RDATA = "b2 f8 ed 44".
كما ذكرنا سابقًا ، يعتمد التنسيق والمحتوى على نوع التسجيل. نوع السجل الذي لدينا هو "A". لذلك ، للحصول على IP ، يجب أن نقرأ 4 بايت. كل بايت هي الثماني المقابلة من عنوان IP ، مكتوبة بالسداسي عشري.
نحصل على IP: b2.f8.ed.44 أو "178.248.237.68". ما هو المطلوب لتلقي.
على سبيل المثال ، بالنسبة للنوع NS ، سيكون التنسيق:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / NSDNAME / / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
وسوف نقرأ الاسم وفقًا لقواعد QNAME.