المرحلة 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:
texthosts: 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. مصيدتان:
- استبدالٌ لا إضافة لـ localhost. الملف أصلاً فيه
127.0.0.1 localhost. لو أضفتَ سطراً جديداً127.0.0.2 localhostدون حذف القديم، صار للاسم تعيينان. من يفوز؟ هذا سؤالٌ تجريبي (السلوك: عادةً أوّل تطابقٍ في الملف) — وهو لُبّ لغز الإتقان أدناه. الحل النظيف: عدّل السطر القائم، لا تكدّس. - سطر
::1(IPv6 loopback).localhostمعيّنٌ مرتين: لـ127.0.0.1(IPv4) ولـ::1(IPv6). بعض البرامج تفضّل IPv6. إن أردت ضماناً كاملاً، فكّر فيما يجب أن يحدث لسطر::1أيضاً. (التاسك يُقبَل عادةً بتعديل سطر IPv4، لكن فهم هذا يفصلك عمّن «نجح بالحظّ».)
ولماذا sudo؟ لأن /etc/hosts ملفُ نظامٍ يملكه root (تذكّر منطق الصلاحيات من المرحلة 03). الكتابة فيه تتطلّب رفع صلاحية.
bashcat /etc/hosts # شاهد الجدول الحالي getent hosts localhost # كيف يحلّه النظام فعلاً (يحترم nsswitch) getent hosts facebook.com # عبر DNS الحقيقي الآن # (لا تعدّل الملف يدوياً إلا في VM/حاوية — وإلّا اكسر اسم جهازك)
تحذير هولبرتون نفسه: إن طبّقتَ التاسك على جهازٍ تستعمله، أعِد localhost إلى 127.0.0.1 بعدها، وإلّا تعطّل أشياء كثيرة. الأنظف: جرّبه في VM/حاوية.
- دون تشغيل أي شيء، اكتب المحتوى الكامل الذي يجب أن يكون عليه
/etc/hostsبعد السكربت بحيث:ping localhostيُظهر127.0.0.2، وping facebook.comيُظهر8.8.8.8، ولا ينكسر شيءٌ آخر (اسم الجهاز، IPv6...). - اشرح بدقّة ما الذي ينكسر إن أضفتَ
127.0.0.2 localhostبدل أن تستبدل127.0.0.1 localhost. هل يفوز أوّل تطابقٍ أم آخره؟ استنتج فرضيتك من «ترتيب الاستشارة»، ثم صمّم تجربة تثبتها أو تنفيها (مثلاً عيّن اسماً وهمياً لعنوانين وشاهدgetent). هذا تطبيقٌ لمبدأ «التجريب آخر مصادر الحقيقة» — افترض أولاً. - ما أداة Bash المثلى داخل السكربت لـ«استبدال سطرٍ قائمٍ يبدأ بعنوانٍ ما»؟ ولماذا هي أنظف من «احذف الملف وأعِد كتابته»؟ (لا تكتب السكربت — فقط برّر الاختيار. الكتابة في المرحلة 07.)
- لو أردت حجب
tracker.ads.comبالكامل عن جهازك عبر/etc/hostsوحده، فإلى أي عنوانٍ تعيّنه ولماذا0.0.0.0أنظف من127.0.0.1هنا؟ (اربط بالمرحلة 05.)
الخلاصة وموقعك على الشجرة
- بنيتَ أبسط مترجمٍ للأسماء:
/etc/hosts، وفهمتَ ترتيب الاستشارة (filesقبلdns) الذي يمنحه الأولوية المطلقة. - ربطتَ ذلك مباشرةً بـ basics_1 task 0: حلّ الأسماء كذبةٌ محلّيةٌ قابلةٌ للكتابة، وعرفتَ مصيدتَي الاستبدال و IPv6 ولماذا sudo.
- لمحتَ DNS كامتدادٍ هرميٍّ موزّع (يكرّر فكرة هرمية IP) — جبلٌ لما بعد هذا المنهج.
أكملتَ الجذعين نظرياً. لم يبقَ إلا أن تضع يدك على السلك: أن تفتح كل أداة، تفهم أي طبقةٍ تكشف وكيف، ثم تسحق التاسكات السبعة وأنت تراها أوضح من الشمس.
كل أداةٍ تعلّمناها (ip, ss, ping) هي نافذةٌ على طبقة. في المرحلة الأخيرة سنفتح كل النوافذ معاً، ونضيف أداتين تجعلانك تصير العميل أو الخادم بيدك: nc و telnet. وستكتشف أنك تستطيع أن تتكلّم HTTP بأصابعك العارية. ثم — الجدار الأخير: حلول التاسكات. لكن لن تفتحه إلا بعد أن تكتبها بنفسك.
← التالي: 07-hands-on-the-wire.md