REBUILD://NET المكدّس 0/8RTL · AR / أوامر · ? اختصارات live

المرحلة 06 — الأسماء

لاحظ

الطبقة 7 تطلّ: حلّ الأسماء. نشتقّ /etc/hosts كأقدم مترجمٍ للأسماء، ونفهم ترتيب الاستشارة — وهو كل ما يلزم لسحق مشروع هولبرتون basics_1 task 0.

النبذة

من المرحلة 05: الجهاز يفهم أرقاماً (IP)، ونحن نكتب أسماءً (localhost, facebook.com). لا بد من مترجم. سنبني أبسط مترجمٍ ممكن، ونكتشف أنه ما زال أوّل من يُستشار حتى اليوم — وأنه يمنحنا قدرةً تبدو كالسحر: الكذب على جهازنا.


اللغز

أنت في عام 1975. عشرات الحواسيب على ARPANET، ولا أحد يحب أن يكتب 10.3.0.17 ليصل لزميله؛ يريدون كتابة mit-ai. صمّم أبسط نظامٍ يتيح استخدام الأسماء بدل الأرقام. ما الذي تحتاجه فعلياً؟ وأين يُخزَّن؟ وماذا يحدث حين تكبر الشبكة لآلاف الأسماء؟


الدرس

ليش /etc/hosts: أبسط مترجمٍ ممكن

أبسط حلٍّ يخطر لك: جدولٌ يربط كل اسمٍ بعنوانه، مخزّنٌ كملفٍّ نصّيٍّ على كل جهاز. وهذا بالضبط ما فعلوه: ملفٌّ اسمه HOSTS.TXT يصونه مركزٌ واحد (SRI) ويُنزَّل باليد دورياً لكل جهاز. ذلك الملف هو سلف /etc/hosts الذي ما زال على كل جهاز Unix/Linux حتى الآن:

text
# /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost 127.0.1.1 my-ubuntu-machine

الصيغة بسيطة: العنوان الاسم-الأساسي [أسماء-بديلة...]. سطرٌ لكل تعيين.

ليش لم يكفِ، ومن أين جاء DNS (بذرةٌ لما بعد المنهج)

تخيّل اللغز السابق بمليار جهاز: ملفٌّ واحد يحوي العالم كله، يُنزَّل باليد؟ مستحيل (حجم، تحديث، تعارض أسماء). فوُلد DNS نظاماً موزّعاً هرمياً (كهرمية IP نفسها — لاحظ تكرار الفكرة!) لحلّ الأسماء عند الطلب. لكن /etc/hosts لم يَمُت، لسببٍ حاسم:

ترتيب الاستشارة — ولماذا /etc/hosts يفوز دائماً

حين يحلّ Linux اسماً، يتبع ترتيباً معرّفاً في /etc/nsswitch.conf:

text
hosts: files dns └─┬─┘ └┬┘ /etc/hosts ثم خادم DNS (أولاً!)

files (أي /etc/hosts) يُستشار قبل dns. فإن وجد الاسم في الملف، يتوقّف فوراً ولا يسأل DNS أبداً. هذه هي القوة:

إجابة هولبرتون

مفتاح هولبرتون basics_1 task 0 بالكامل: حين تضيف 8.8.8.8 facebook.com إلى /etc/hosts، فأنت لا «تخترق Facebook». أنت تكذب على محلّل جهازك أنت: قبل أن يسأل DNS الحقيقي (الذي سيعطي IP فيسبوك الصحيح)، يجد جوابك المحقون ويتوقّف. كل برنامجٍ على جهازك (المتصفّح، ping...) سيذهب لـ 8.8.8.8 ظانّاً أنه فيسبوك. هذا أساس أقدم حيلة لحجب الإعلانات: عيّن ads.example.com → 0.0.0.0 فتُرسَل طلبات الإعلانات لـ«لا مكان».

التاسك يطلب: localhost → 127.0.0.2 و facebook.com → 8.8.8.8. مصيدتان:

  1. استبدالٌ لا إضافة لـ localhost. الملف أصلاً فيه 127.0.0.1 localhost. لو أضفتَ سطراً جديداً 127.0.0.2 localhost دون حذف القديم، صار للاسم تعيينان. من يفوز؟ هذا سؤالٌ تجريبي (السلوك: عادةً أوّل تطابقٍ في الملف) — وهو لُبّ لغز الإتقان أدناه. الحل النظيف: عدّل السطر القائم، لا تكدّس.
  2. سطر ::1 (IPv6 loopback). localhost معيّنٌ مرتين: لـ 127.0.0.1 (IPv4) ولـ ::1 (IPv6). بعض البرامج تفضّل IPv6. إن أردت ضماناً كاملاً، فكّر فيما يجب أن يحدث لسطر ::1 أيضاً. (التاسك يُقبَل عادةً بتعديل سطر IPv4، لكن فهم هذا يفصلك عمّن «نجح بالحظّ».)

ولماذا sudo؟ لأن /etc/hosts ملفُ نظامٍ يملكه root (تذكّر منطق الصلاحيات من المرحلة 03). الكتابة فيه تتطلّب رفع صلاحية.


جرّب (احذر — على جهازٍ تستعمله، أعِد الحال بعدها!)
bash
cat /etc/hosts # شاهد الجدول الحالي getent hosts localhost # كيف يحلّه النظام فعلاً (يحترم nsswitch) getent hosts facebook.com # عبر DNS الحقيقي الآن # (لا تعدّل الملف يدوياً إلا في VM/حاوية — وإلّا اكسر اسم جهازك)
تحذير

تحذير هولبرتون نفسه: إن طبّقتَ التاسك على جهازٍ تستعمله، أعِد localhost إلى 127.0.0.1 بعدها، وإلّا تعطّل أشياء كثيرة. الأنظف: جرّبه في VM/حاوية.


لغز الإتقان
  1. دون تشغيل أي شيء، اكتب المحتوى الكامل الذي يجب أن يكون عليه /etc/hosts بعد السكربت بحيث: ping localhost يُظهر 127.0.0.2، وping facebook.com يُظهر 8.8.8.8، ولا ينكسر شيءٌ آخر (اسم الجهاز، IPv6...).
  2. اشرح بدقّة ما الذي ينكسر إن أضفتَ 127.0.0.2 localhost بدل أن تستبدل 127.0.0.1 localhost. هل يفوز أوّل تطابقٍ أم آخره؟ استنتج فرضيتك من «ترتيب الاستشارة»، ثم صمّم تجربة تثبتها أو تنفيها (مثلاً عيّن اسماً وهمياً لعنوانين وشاهد getent). هذا تطبيقٌ لمبدأ «التجريب آخر مصادر الحقيقة» — افترض أولاً.
  3. ما أداة Bash المثلى داخل السكربت لـ«استبدال سطرٍ قائمٍ يبدأ بعنوانٍ ما»؟ ولماذا هي أنظف من «احذف الملف وأعِد كتابته»؟ (لا تكتب السكربت — فقط برّر الاختيار. الكتابة في المرحلة 07.)
  4. لو أردت حجب tracker.ads.com بالكامل عن جهازك عبر /etc/hosts وحده، فإلى أي عنوانٍ تعيّنه ولماذا 0.0.0.0 أنظف من 127.0.0.1 هنا؟ (اربط بالمرحلة 05.)

الخلاصة وموقعك على الشجرة

أكملتَ الجذعين نظرياً. لم يبقَ إلا أن تضع يدك على السلك: أن تفتح كل أداة، تفهم أي طبقةٍ تكشف وكيف، ثم تسحق التاسكات السبعة وأنت تراها أوضح من الشمس.

بذرة

كل أداةٍ تعلّمناها (ip, ss, ping) هي نافذةٌ على طبقة. في المرحلة الأخيرة سنفتح كل النوافذ معاً، ونضيف أداتين تجعلانك تصير العميل أو الخادم بيدك: nc و telnet. وستكتشف أنك تستطيع أن تتكلّم HTTP بأصابعك العارية. ثم — الجدار الأخير: حلول التاسكات. لكن لن تفتحه إلا بعد أن تكتبها بنفسك.

← التالي: 07-hands-on-the-wire.md