<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>مدونة معتز شكري</title>
        <link>https://motaz.cc/rss.xml</link>
        <description>مدونةٌ أبثّ فيها ما راق لي من المعارف والخواطر ، وأشارك فيها ما أحببت من أفكارٍ وتجارب، وما استحسنت من علمٍ وأدبٍ.</description>
        <lastBuildDate>Fri, 05 Jun 2026 15:13:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>ar</language>
        <image>
            <title>مدونة معتز شكري</title>
            <url>https://motaz.cc/rss.xml/assets/og.png</url>
            <link>https://motaz.cc/rss.xml</link>
        </image>
        <copyright>© 2026 مدونة معتز شكري</copyright>
        <atom:link href="https://motaz.cc/rss.xml/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[دليل «أوبن بي إس دي» لإعداد جهازٍ موجِّه]]></title>
            <link>https://motaz.cc/rss.xml/blog/2026-05-29-openbsd-router-guide</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2026-05-29-openbsd-router-guide</guid>
            <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[ مقدمة في هذا الدليل سنتعلّم كيف نصنع موجّهًا (راوترًا) بديعًا يعمل بنظام «أوبن بي إس دي»، معتمدين على عتادٍ رخيصٍ متواضع القدرات، لكنه ينهض بالمهمة ع...]]></description>
            <content:encoded><![CDATA[<!--[--><p><img src="/assets/posts-images/openbsd-router/openbsd-icon.webp" alt="OpenBSD icon"/></p> <h2>مقدمة</h2> <p>في هذا الدليل سنتعلّم كيف نصنع موجّهًا (راوترًا) بديعًا يعمل بنظام «أوبن بي إس دي»، معتمدين على عتادٍ رخيصٍ متواضع القدرات، لكنه ينهض بالمهمة على أكمل وجه: جدارٌ عازلٌ وتقسيماتٌ للشبكة المحلية، ونظام اسماء نطاقات مزوّد بحظرٍ للنطاقات، و«معيار تهيئةُ المُضيف الآلية» (DHCP)، وغير ذلك كثير.</p> <p>وسنُنشئ إعدادًا يُقسّم الشبكة المحلية (LAN) إلى ثلاث شبكاتٍ منفصلة: إحداها للكبار في المنزل، وأخرى للأطفال، وثالثة تُجعل منطقةً عامة (<a href="https://en.wikipedia.org/wiki/DMZ_%28computing%29" rel="nofollow">DMZ</a>) تُستضاف فيها الخوادم المواجهة للعامة، كخادمٍ خاصٍّ للشابكة (web) أو خادمٍ للبريد. وسنرى كذلك كيف نُسخّر نظام أسماء النطاقات (DNS) لحجب الإعلانات والمواقع الفاحشة وغيرها من مواقع الشابكة التي لا نرغب بها.ويمكن اعتماد موجّه «أوبن بي إس دي» هذا في المكاتب الصغيرة والمتوسطة، إذ يقدّم أداءً حسنًا لا يُخيّب.</p> <h2>لماذا جدار الحماية؟</h2> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->يتعامل هذا الدليل مع IPv4 فقط، حيث معظم الناس - بل حتى مزوّدي الإنترنت - يعتمدون عليه دون IPv6 إلا ما ندر، على أن يُحدث هذا الدليل في المستقبل ليدعم IPv6.<!--]--></div></div><!----> <p>مهما تكن وسيلتك للاتصال بالإنترنت، من منزلك أو مكتبك، فأنت بحاجة إلى جدار حماية يفصل بين شبكتك وبين المودم أو الموجّه الذي زوّدك به مزوّد الإنترنت.</p> <p>ونادراً ما تحصل اجهزة المودم والموجّهات المنزلية على تحديثات للبرمجيات الثابتة (firmware)، ولذا تكون عرضةً <a href="https://en.wikipedia.org/wiki/Home_router#Security" rel="nofollow">لهجمات الشبكة</a> التي قد تحولها الى جزءٍ من <a href="https://ar.wikipedia.org/wiki/%D8%B4%D8%A8%D9%83%D8%A9_%D8%A7%D9%84%D8%A8%D9%88%D8%AA%D8%A7%D8%AA" rel="nofollow">شبكات «البوتنت» botnets</a>, مثل برمجية <a href="https://ar.wikipedia.org/wiki/%D9%85%D9%8A%D8%B1%D8%A7%D9%8A_(%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC_%D8%AE%D8%A8%D9%8A%D8%AB)" rel="nofollow">«ميراي»</a> الخبيثة. وقد كانت هذه الأجهزة سببًا في بعضٍ من أكبر هجمات <a href="https://ar.wikipedia.org/wiki/%D9%87%D8%AC%D9%85%D8%A7%D8%AA_%D8%A7%D9%84%D8%AD%D8%B1%D9%85%D8%A7%D9%86_%D9%85%D9%86_%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA" rel="nofollow">الحرمان من الخدمة (DDoS)</a>.</p> <p>جدارُ حمايةٍ بينك وبين موديم أو موجه مزود الإنترنت ISP لايحمي الجهاز الموديم نفسه من الهجمات، لكنه يحمي حاسبك واجهزتك، ويتيح لك مراقبة حركة البيانات الواردة والصادرة في شبكتك والتحكم بها.</p> <p>وبدون هذا الجدار بين شبكتك المحلية وجهاز مزود الإنترنت تكون كمن يترك باب بيته مشرعاً، إذ لا يمكن الوثوق بجودة أجهزة مزوّدي الإنترنت دائمًا.</p> <p>وإنه لمن الحكمة وضع جدار حمايةٍ بين شبكتك المحلية والإنترنت، ويقدّم لك نظام «أوبن بي إس دي» حلًّا متينًا لهذا الغرض.</p> <h2>العَتاد</h2> <p>لا تشتري العتاد الغال لتصنع موجه وجدارُ حمايةٍ لبيتك او مكتبك، بل عتاد رخيص ويسير يكفي ويكون ممتازاً.</p> <p>وقد بنيت عدداً من الحلول بلوحة <a href="https://www.asrock.com/mb/Intel/Q1900DC-ITX/" rel="nofollow">ASRock Q1900DC-ITX</a> ذات معالج إنتل Celeron رباعيّ النوى.</p> <p><img src="/assets/posts-images/openbsd-router/asrock-q1900dc-itx.webp" alt="ASRock Q1900DC-ITX motherboard"/></p> <p>وسأعترف، وإن كان في الاعتراف مشقّة، بأنّ هذه اللوحة ليست من عيون العتاد ولا من فرسان السوق، ولكنّها — مع رداءتها — تقضي الحاجة، وتنهض بما يُوكَل إليها. وقد بَنيتُ عليها غيرَ نظام، وجعلتُها قلبَ أكثر من منظومة، فعملت سنواتٍ طوالاً على شبكاتٍ بسرعات الجيجابت. وجدار الحماية و«نظام اسماء النطاقات» وسائر الخدمات تعمل ليلها ونهارها، ومعالجُها لا يكاد يئنّ ولا يجهد.</p> <p>وللوحة ASRock Q1900DC-ITX ميزةٌ ظاهرة، إذ تأتي بمقبس DC-In يقبل مهايئًا بين 9 و19 فولت، فيجعلها مُقتَصدة في الطاقة. غير أنّ هذه اللوحة — ويا للأسف — قد انقطع صنعها، وإنما أذكرها مثالًا، فقد استخدمتُ سواها من اللوحات الرخيصة غير واحدة.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--aqua)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰌶</span> <!--[--><!---->وكثيرٌ من اللوحات المُقتَصدة من شركات شتّى تؤدّي الغرض، كلوحة <a src="https://www.pcengines.ch/apu2.html">APU2</a> الشهيرة من شركة PC Engines. وكذلك أمكن الركون إلى الحواسيب الصغيرة Mini PC من <a src="https://www.qotom.net/product">Qotom</a> أو <a src="https://www.jetwaycomputer.com/Intel.html">Jetway</a>.<!--]--></div></div><!----> <p>وقد جرّبتُ لوحة ASRock Q1900-ITX (وهي بلا مقبس DC-In) مقترنةً بوحدة PicoPSU.</p> <p><img src="/assets/posts-images/openbsd-router/picopsu.webp" alt="PicoPSU power supply"/></p> <p>ستجد لِـ PicoPSU علاماتٍ تجارية وإصداراتٍ شتّى، يختلف بعضها عن بعض في الجودة. ولديّ اثنان منها: الأصلي، وآخر مقلّد زهيد الثمن، وكلاهما يؤديان الغرض أداءً حسناً، ويوفّران قدراً لا بأس به من الطاقة، خلاف ما لو شغّلت اللوحة بمزوّد طاقة اعتيادي.</p> <p>وأخيراً، فإني أستعمل بطاقةَ شبكة NIC رباعيةَ المنافذ مقلّدةً لبطاقات إنتل، زهيدةَ الثمن، تجدُها على Ebay… كهذه:</p> <p><img src="/assets/posts-images/openbsd-router/intel-quad-nic.webp" alt="Intel Quad NIC"/></p> <p>أعلم أنّ من الأجدر استخدام عتادٍ ذي جودة عالية، ولا سيما على شبكةٍ يهمّك أمرُها، ولكن هذا الدليل إنما هو عن كيفية الإفلات باستعمال عتادٍ رخيصٍ نسبيّاً، ومع ذلك تحصل على منتجٍ بالغ النفع، يخدمك سنين طويلة — وهكذا كانت تجربتي على الأقل.</p> <p>أوصيك بالبحث عن لوحة mini-ITX منخفضة الاستهلاك، يكون عتادها <a href="https://www.openbsd.org/amd64.html" rel="nofollow">مدعوماً من نظام «أوبن بي إس دي»</a>، كالمعالجات من فئة إنتل Celeron أو إنتل i3. فهذه اللوحات في العادة رخيصة، قليلة النَّهَم للطاقة، ولا تحتل حيزاً من المكان. ولا أوصي باستخدام معالج إنتل Atom إن كانت لديك شبكة جيجابت، إذ غالباً ما يختنق تحت وطأة مرور البيانات ولا يقوى على مجاراتها، وإن كان الأمر يختلف من مستخدم لآخر.</p> <p>وقد تحتاج إلى بضع محوّلات جيجابت رخيصة لتقسيم الشبكة المحليّة، ولا سيّما إن كان لديك أكثر من حاسوبٍ تودّ وصله بالشبكة ذاتها :)</p> <h2>لِمَ نظام «أوبن بي إس دي»؟</h2> <p>يمكنك الوصول إلى إعدادٍ مشابه باستعمال إحدى <a href="https://en.wikipedia.org/wiki/Comparison_of_BSD_operating_systems" rel="nofollow">نسخ BSD</a> الأخرى أو إحدى <a href="https://en.wikipedia.org/wiki/Linux_distribution" rel="nofollow">توزيعات لينكس</a> الكثيرة, غير أنّ <a href="https://www.openbsd.org/" rel="nofollow">«أوبن بي إس دي»</a> مُصمّمٌ بالأساس لمثل هذه المهام، وهو أنسبها على الإطلاق. فهو لا يأتي بكل ما تحتاجه من برمجيات ضمن التثبيت الأساسي فحسب، بل يملك درجة عالية جداً من الأمان، مع كمٍّ كبير من وسائل الحماية والتخفيفات المبنيّة ضمن النظام نفسه. <a href="https://www.unixdigest.com/articles/openbsd-is-fantastic.html" rel="nofollow">ولهذا أوصي</a> بـ »أوبن بي إس دي« دون غيره لهذا النوع من الاستخدام.</p> <p>وما هو أبعد من ذلك، فإن «أوبن بي إس دي» مميز حقاً، وليس في هذا مبالغة. فكُتيّباته (man pages) واضحة وسهلة القراءة، وغالباً ما تكفي وحدها لإنشاء ملفات الإعداد التي تحتاجها لخدماتك المختلفة دون عناء يُذكر. ويحافظ مشروع »أوبن بي إس دي« على مستوى عالٍ جداً من الجودة، سواء في البرمجيات أو كتيّباتها.</p> <p>هذا الدليل لن يشرح كيفية تثبيت «أوبن بي إس دي». وإن لم يسبق لك القيام بذلك، فأوصيك بتجربة النظام داخل آلة افتراضية، أو على قطعة عتادٍ قديمة مدعومة تتدرب عليها. و »أوبن بي إس دي« من أسهل الأنظمة تثبيتاً وأسرعها. ولا تخشَ غياب الواجهة الرسومية أثناء التثبيت—فما إن تجربه حتى تُقدّر تلك البساطة. وعند التردد، اختر ما افتُرِض من الإعدادات.</p> <p>قبل أن تبدأ رحلتك، احرص على الرجوع إلى توثيق «أوبن بي إس دي»! فالتوثيق دقيق للغاية، وغالباً ستجد كل ما تحتاجه هناك. واقرأ <a href="https://www.openbsd.org/faq/index.html" rel="nofollow">الأسئلة الشائعة</a> واطّلع على <a href="https://man.openbsd.org/" rel="nofollow">كتيّبات الإستعمال</a> للبرامج التي سنستعملها.</p> <p>وهناك مصدر آخر مهم للمعلومات العامة حول «أوبن بي إس دي» وهو أرشيف <a href="https://marc.info/?l=openbsd-misc" rel="nofollow">القوائم البريدية</a>. كما أنصح بالاشتراك في <a href="https://www.openbsd.org/mail.html" rel="nofollow">قوائم الإعلانات والتنبيهات الأمنية</a> للبقاء على اطّلاعٍ دائم بكل جديد.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->أرجو أن <a src="https://www.openbsd.org/donations.html">تدعم مشروع «أوبن بي إس دي»</a>! فحتى إن لم تكن تسعمله يومياً، لكنك تستعمل <a src="https://www.openssh.com">OpenSSH</a> فى لينكس، فأنت في الحقيقة تستعمل برمجيات مشروع »أوبن بي إس دي«. فلتفكّر بتقديم تبرعٍ يسيرٍ — لكن منتظم — دعماً لتطوير هذا الكمّ الرائع من البرمجيات التي يبدعها مطوّرو »أوبن بي إس دي«!<!--]--></div></div><!----> <h2>الشبكة</h2> <p>الـمُوجِّه ـ في حقيقته ـ جهازٌ ينظّم حركة البيانات بين شبكتين أو أكثر من الشبكات المنفصلة. فهو يضمن أن الحركة المقصودة للشبكة المحليّة لا تتسرّب إلى فضاء الإنترنت، وأن ما يجري في الإنترنت مما لا يُقصَد به شبكتك يبقى حيث هو ولا يتعدّى حدوده.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->قد يُسمّى الموجّه أحيانًا «بوّابة» (gateway)، وهذا لا بأس به، غير أنّ الحقيقة أن البوّابة تصل بين أنظمة متباينة، بينما الموجّه يصل بين شبكاتٍ متماثلة. فمثال البوّابة: جهاز يصل شبكة حاسبية بشبكةٍ اتصالية (كالهاتف مثلاً).<!--]--></div></div><!----> <p>في هذا الدليل سنبني موجّهًا، ولدينا أربع شبكات من نفس النوع: إحداها الإنترنت، والثلاث الأُخَر شبكاتٌ محليّة داخليّة مقسّمة (LANs). وبعض الناس يفضّلون العمل مع الشبكات الافتراضية (VLANs)، لكنّا هنا سنستخدم بطاقة الشبكة الرباعية المنافذ المشار إليها آنفًا. ويمكنك أن تبلغ النتيجة نفسها باستخدام عدّة بطاقات شبكيّة أحادية المنفذ، إن أحببت ذلك، شريطة أن يكون في اللوحة الأم حيّزٌ كافٍ وما يكفي من منافذ PCI. وكذلك يمكن استعمال منفذ الشبكة الموجود أصلًا في اللوحة الأم نفسها، لكن الأمر يتوقّف على شأن التعاريف (driver) ودعم النظام للجهاز. ولستُ أذكر أني واجهت مشكلة مع متحكّم Realtek PCI gigabit الموجود في كثيرٍ من اللوحات، وإن كنتُ ـ في الجملة ـ أفضّل منتجات إنتل عليه.</p> <p>وليس لزامًا عليك أن تُقسّم شبكتك إلى أجزاء عدّة إن لم يكن لك حاجة، ويمكن تعديل الإعدادات في هذا الدليل بسهولة. غير أني اخترت هذا النهج لأبيّن لك كيف يمكنك حماية أبنائك بفصل شبكتهم في LAN مستقل، لا يكتفي بحجب الإعلانات ومواقع الفحش عبر حجب «نظام اسماء النطاقات» (وهذا يشمل جميع الشبكات)، بل يمكنك أن تجعل لهم «قائمة مرور» لا ينفذون إلا لما أذنتَ لهم به من أجزاء الإنترنت. غير أن إعداد «قائمة المرور» هذه أمرٌ عسير، ولا يُنصح به غالبًا إلا إن كان أطفالك لا يحتاجون إلا إلى جزءٍ محدود جدًا من الشبكة، لكنه ـ مع ذلك ـ ممكن، وسيرشدك هذا الدليل إلى أحد أساليبه.</p> <p>وهذه صورةٌ توضّح بنيان الشبكة التي سنُعدّها:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>                       الإنترنت</span></span>
<span class="line"><span>                          |</span></span>
<span class="line"><span>                   xxx.xxx.xxx.xxx</span></span>
<span class="line"><span>                 مودِم المزوّد (WAN)</span></span>
<span class="line"><span>                      10.24.0.23</span></span>
<span class="line"><span>                          |</span></span>
<span class="line"><span>                       OpenBSD</span></span>
<span class="line"><span>                      10.24.0.50</span></span>
<span class="line"><span>               (الراوتر / جدار الحماية)</span></span>
<span class="line"><span>                          |</span></span>
<span class="line"><span>    ┌─────────────────────+─────────────────────┐</span></span>
<span class="line"><span>    |                     |                     |</span></span>
<span class="line"><span>   NIC1                  NIC2               NIC3 (DMZ)</span></span>
<span class="line"><span>192.168.1.1           192.168.2.1           192.168.3.1</span></span>
<span class="line"><span> مبدّل LAN1             مبدّل LAN2             مبدّل LAN3</span></span>
<span class="line"><span>    |                     |                     |</span></span>
<span class="line"><span>    └─ 192.168.1.x        ├─ 192.168.2.x        └─ 192.168.3.2</span></span>
<span class="line"><span>       حاسوب البالغين      |   حاسوب طفل 1           خادم ويب عام</span></span>
<span class="line"><span>                          |</span></span>
<span class="line"><span>                          └─ 192.168.2.x</span></span>
<span class="line"><span>                             حاسوب طفل 2</span></span></code></pre> <p>العناوين التي تبدأ بـ 10.24.0 هي ما يعطيك إياه مودم مزود الإنترنت، وقد تكون مختلفة تمامًا عندك. أمّا العناوين التي تبدأ بـ 192.168 فهي ما سنستعمله في هذا الدليل لشبكتنا المحلية (LAN).</p> <p>ولا يشرح هذا الدليل شيئًا من الاتصال اللاسلكي. فالبرمجية الثابتة (firmware) للشرائح اللاسلكية ـ كما هو مشهور ـ كثيرة العلل، سهلة الاستغلال، ولا أنصح باللاسلكي ما استطعت الاستغناء عنه. فإن احتجت إليه فالواجب عندي أن تعطّل الواي فاي في موجه المزود كليًا (إن استطعت)، ثم تبتاع أفضل موجه لاسلكي تجده، وتضعه خلف جدار الحماية في قطعةٍ معزولة من الشبكة. وبهذا، إن أُخترِق الجهاز اللاسلكي لاحقًا استطعت ضبط العواقب وتحديد الضرر. ويمكنك أيضًا أن تُعِدَّ الموجه اللاسلكي بحيث ينال كل جهازٍ يتصل به عنوانَه الخاص الذي يمرّ عبره فقط، مع حجب أي حركة تصدر عن الموجه نفسه، لكي تمنعه من “الاتصال بموطنه (phoning home)” أو إرسال بيانات خفية. ويمكن كذلك أن تقتني بطاقة لاسلكية يدعمها «أوبن بي إس دي» وتجعله هو نفسه نقطة الوصول (Access Point)، غير أني أميل إلى عزل الجزء اللاسلكي في موجه خارجي مستقل، أو في جهاز »أوبن بي إس دي« آخر يقوم بدور نقطة الوصول خلف جدار الحماية .</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->فيما أعلمه اليوم، لا تزال كل التعريفات (drivers)اللاسلكية في «أوبن بي إس دي» تعاني بعض المشكلات، ولم يسلم منها واحد.<!--]--></div></div><!----> <h3>إعداد الشبكة</h3> <p>أول ما نبدأ به هو تهيئة بطاقات الشبكة (NICs) المختلفة في موجّهنا العامل بـ «أوبن بي إس دي». أمّا في جهازي هذا فقد عطّلتُ بطاقة الشبكة المدمجة في اللوحة الأم من الـبايوس، ولن أستعمل إلا بطاقة إنتل المقلّدة ذات المنافذ الأربعة.</p> <p>فإن كنت تتّبع هذا الدليل، ولا تريد إلا جدارَ حمايةٍ يسير، فحسبُك بطاقتا شبكة منفصلتان على الأقل.</p> <p>وقبل الشروع، احرص على قراءة كتيّب <a href="https://man.openbsd.org/hostname.if" rel="nofollow">hostname.if</a> وفهم مختلف خياراتها. وانظر أيضًا قسم الشبكات في <a href="https://www.openbsd.org/faq/faq6.html" rel="nofollow">سؤال وجواب عن «أوبن بي إس دي»</a>.</p> <p>ولأنّي أستخدم بطاقات إنتل، فإن التعريف (driver) الذي يحمّله «أوبن بي إس دي» هو <a href="https://man.openbsd.org/em" rel="nofollow">em</a> وتُعدّ كل منفذٍ من منافذ البطاقة كأنه بطاقة مستقلة. فيُسمّى كلٌّ منها: <code>emX</code> حيث X هو رقم المنفذ في البطاقة.</p> <p>وعند تشغيل أمر <code>dmesg</code> تظهر بطاقة الشبكة ذات المنافذ الأربعة عندي على هذا النحو:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dmesg</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">em0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> at</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pci2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dev</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> function</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">Intel I350</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rev</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0x01:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> msi,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a0:36:9f:a1:66:b8</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">em1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> at</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pci2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dev</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> function</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">Intel I350</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rev</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0x01:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> msi,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a0:36:9f:a1:66:b9</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">em2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> at</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pci2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dev</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> function</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 2</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">Intel I350</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rev</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0x01:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> msi,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a0:36:9f:a1:66:ba</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">em3</span><span style="color:#79740E;--shiki-dark:#B8BB26"> at</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pci2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dev</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> function</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 3</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">Intel I350</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rev</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0x01:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> msi,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a0:36:9f:a1:66:bb</span></span></code></pre> <p>وهذا يُظهر أنّ بطاقتي قد عرفها النظام على أنها Intel I350-T4 PCI Express Quad Port Gigabit NIC.</p> <p>والخطوة التالية هي معرفة أيّ منفذٍ فعليّ يقابل الرقم المذكور آنفًا. ويمكنك عمل ذلك بسهولة: أوصل سلك الإيثرنت القادم من مُبدّل أو مودم أو موجه فعّال — واحدًا بعد الآخر — في كل منفذ، لترى أيُّها ينشط، ثم دوّن ذلك عندك.</p> <p>ويمكنك التحقق من حالة النشاط بأمر <code>ifconfig</code> فالمنافذ التي لا سلك فيها ستظهر حالتها <code>no carrier</code> في قسم <code>status</code> وأما المنفذ الذي فيه السلك فسيكون حاله <code>active</code>. على نحوٍ كهذا:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ifconfig</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">em1:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> flags=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">8843</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">UP,BROADCAST,RUNNING,SIMPLEX,MULTICAS</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">T</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> mtu</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1500</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        lladdr</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a0:36:9f:a1:66:b9</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        index</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> priority</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> llprio</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 3</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        media:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> Ethernet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> autoselect</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (none)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        status:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> active</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">em2:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> flags=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">8843</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">UP,BROADCAST,RUNNING,SIMPLEX,MULTICAS</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">T</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> mtu</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1500</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        lladdr</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a0:36:9f:a1:66:ba</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        index</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 3</span><span style="color:#79740E;--shiki-dark:#B8BB26"> priority</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> llprio</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 3</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        media:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> Ethernet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> autoselect</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (none)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        status:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> no</span><span style="color:#79740E;--shiki-dark:#B8BB26"> carrier</span></span></code></pre> <p>سنجعل المنفذ <code>em0</code> هو المنفذ الموصول بالمودم أو الموجّه القادم من مزوّد الإنترنت، أي منفذ الإنترنت. وفي حالتي لديّ عنوان شبكي عام من مزودي، وهذا ضروري إن أردتَ تشغيل خادم شابكة من بيتك، أمّا إن لم تكن بحاجة لذلك فيمكنك ضبط البطاقة على معيار تهيئةُ المُضيف الآلية.</p> <p>وعندي، يجب أن أضع عنوانًا ثابتًا للمنفذ <code>em0</code> ثم يقوم مزوّد الإنترنت بتمرير الحركة القادمة من عنواني العام إليه. ولعمل ذلك أضبط بطاقة <code>em0</code> بالمعلومات الآتية:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26">  echo</span><span style="color:#7C6F64;--shiki-dark:#A89984"> '</span><span style="color:#79740E;--shiki-dark:#B8BB26">inet 10.24.0.50 255.255.254.0 NONE</span><span style="color:#7C6F64;--shiki-dark:#A89984">'</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/hostname.em0</span></span></code></pre> <p>فإن لم تكن بحاجةٍ إلى عنوانٍ عام، وكان مزوّدك يمنحك العنوان عبر معيار تهيئةُ المُضيف الآلية، فحسبك أن تضع كلمة <code>dhcp</code> مكان الإعداد السابق:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> echo</span><span style="color:#7C6F64;--shiki-dark:#A89984"> '</span><span style="color:#79740E;--shiki-dark:#B8BB26">dhcp</span><span style="color:#7C6F64;--shiki-dark:#A89984">'</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/hostname.em0</span></span></code></pre> <p>ثم أُهيّئ بقيّة منافذ بطاقة الشبكة بالعناوين الشبكية التي بيّنتُها في التصوير السابق.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> echo</span><span style="color:#7C6F64;--shiki-dark:#A89984"> '</span><span style="color:#79740E;--shiki-dark:#B8BB26">inet 192.168.1.1 255.255.255.0 NONE</span><span style="color:#7C6F64;--shiki-dark:#A89984">'</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/hostname.em1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> echo</span><span style="color:#7C6F64;--shiki-dark:#A89984"> '</span><span style="color:#79740E;--shiki-dark:#B8BB26">inet 192.168.2.1 255.255.255.0 NONE</span><span style="color:#7C6F64;--shiki-dark:#A89984">'</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/hostname.em2</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> echo</span><span style="color:#7C6F64;--shiki-dark:#A89984"> '</span><span style="color:#79740E;--shiki-dark:#B8BB26">inet 192.168.3.1 255.255.255.0 NONE</span><span style="color:#7C6F64;--shiki-dark:#A89984">'</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/hostname.em3</span></span></code></pre> <p>اطَّلع على كتيب <a href="https://man.openbsd.org/hostname.if" rel="nofollow">hostname.if</a> لمزيد من المعلومات.</p> <p>ثم نحتاج إلى ضبط العنوان الـشبكي الخاص ببوّابة مزوّد الإنترنت (ISP gateway). وقد يكون هذا العنوان مختلفًا عن عنوان المودم أو الموجّه نفسه وفق إعداد مزوّدك . وإن لم تُنشئ الملف <code>/etc/mygate</code> فلن يُضاف أيُّ بوابة افتراضية (default gateway) إلى <a href="https://en.wikipedia.org/wiki/Routing_table" rel="nofollow">جدول التوجيه</a>. ولا تحتاج إلى ملف <code>/etc/mygate</code> أصلًا إن كنت تحصل على عنوانك من المودم أو الموجّه عبر معيار تهيئةُ المُضيف الآلية. فحين تستعمل توجيه <code>dhcp</code> في أيّ ملف <code>hostname.ifX</code> فإن النظام يتجاهل ما في <code>/etc/mygate</code> لأن البطاقة التي تتلقّى عنوانها بواسطة معيار تهيئةُ المُضيف الآلية تحصل كذلك على معلومات البوّابة والتوجيه من خادم تهيئةُ المُضيف الآلية.</p> <p>وأخيرًا، وليس آخرًا، نحتاج إلى تمكين تمرير الحزم IP forwarding. وتمريريّة العنوان الشبكي هي العملية التي تتيح للحزم أن تنتقل بين وجهات الشبكة المختلفة في الموجّه. وبشكلٍ افتراضي لا يقوم «أوبن بي إس دي» بتمرير الحزم بين الواجهات، أي إن وظائف التوجيه — أو ما يُعرف بوظائف البوّابة — معطّلة.</p> <p>ويمكننا تفعيل تمرير الحزم بالأوامر الآتية:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> sysctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> net.inet.ip.forwarding=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> echo</span><span style="color:#7C6F64;--shiki-dark:#A89984"> '</span><span style="color:#79740E;--shiki-dark:#B8BB26">net.inet.ip.forwarding=1</span><span style="color:#7C6F64;--shiki-dark:#A89984">'</span><span style="color:#427B58;--shiki-dark:#8EC07C"> >></span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/sysctl.conf</span></span></code></pre> <p>الآن، سيكون النظام قادرًا على تمرير رزم IPv4 من بطاقة شبكة إلى أخرى. أو في حالتنا المحددة مع بطاقة الشبكة ذات الأربع منافذ، من منفذ إلى آخر. وإن احتجت إلى إعداد IPv6، فألقِ نظرة على كتيّبه.</p> <h2>معيار تهيئةُ المُضيف الآلية(DHCP)</h2> <p>جاهزون الآن لإعداد <a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84_%D8%AA%D9%87%D9%8A%D8%A6%D8%A9_%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81_%D8%A7%D9%84%D8%A2%D9%84%D9%8A%D8%A9" rel="nofollow">«معيار تهيئة المضيف الآلية»</a> التي سنشغلها للحواسيب ومختلف المعدات المتصلة بشبكات محلية لدينا. قبل أن نبدأ، تأكد من أنك قرأت وفهمت الخيارات في كُتيّب <a href="https://man.openbsd.org/dhcpd.conf" rel="nofollow">dhcpd.conf</a>. وألقِ نظرة على <a href="https://man.openbsd.org/dhcp-options" rel="nofollow">dhcp-options</a> للتعرّف على الخيارات التي يدعمها dhcpd.</p> <p>نستطيع أن نربط عناوين شبكية معيّنة بأجهزة أو حواسيب محددة تتصل بمنافذ LAN مختلفة. هذا الأمر ضروري إذا أردنا تمرير أي حركة بيانات (Traffic) قادمة من الإنترنت إلى خادم شابكة مثلاً. ويمكننا ربط عنوان شبكي محدد بجهاز معيّن عبر <a href="https://ar.wikipedia.org/wiki/%D8%B9%D9%86%D9%88%D8%A7%D9%86_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85_%D8%A8%D8%A7%D9%84%D9%86%D9%81%D8%A7%D8%B0_%D9%84%D9%84%D9%88%D8%B3%D8%B7" rel="nofollow">عنوان الMAC</a> الخاص ببطاقة الشبكة في ذلك الجهاز.</p> <p>في هذا المثال سأخصص كل العناوين الشبكية من 10 إلى 254 للاستعمال بواسطة معيار تهيئةُ المُضيف الآلية، بينما سأترك ما تبقى من العناوين لأي عناوين ثابتة قد أحتاجها.</p> <p>عدّل ملف <code>/etc/dhcpd.conf</code> بمحررك المفضل واضبطه بما يناسبك.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">subnet</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> netmask</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 255.255.255.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name-servers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> routers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    range</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.10</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.254</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">}</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">subnet</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> netmask</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 255.255.255.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name-servers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> routers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    range</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.10</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.254</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">}</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">subnet</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> netmask</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 255.255.255.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name-servers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> routers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    range</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.10</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.254</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    host</span><span style="color:#79740E;--shiki-dark:#B8BB26"> web.example.com</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        fixed-address</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 191.168.3.2</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        hardware</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ethernet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 61:20:42:39:61:AF</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host-name</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">webserver</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">    }</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">}</span></span></code></pre> <p>السطر <code>option domain-name-servers</code> يحدد خادم نظام أسماء النطاقات الذي سنقوم بتشغيله على موجّهنا.</p> <p>والحاسب الذي يعمل كخادم للشابكة على الشبكة المحلية العامة قد حصل على عنوان شبكي ثابت، و زُوٍد باسم مضيف (hostname) ثابت.</p> <p>كذلك، إن كنت لا تريد تقسيم الشبكة إلى أجزاء، بل ترغب في وجود شبكة محلية واحدة فقط، يمكنك حذف الشبكات الفرعية الأخرى، فيبقى لديك هذا:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">subnet</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> netmask</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 255.255.255.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name-servers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> routers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    range</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.10</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.254</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">}</span></span></code></pre> <p>بعد ذلك نتأكد من تفعيل وتشغيل خدمة <code>dhcpd</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> enable</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dhcpd</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> start</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dhcpd</span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->انظر إلى باب «إضافة خيار domain-name إلى تهيئةُ المُضيف الآلية واستعمال FQDN» لتعرف كيف تضيف <a src="https://ar.wikipedia.org/wiki/%D8%A7%D8%B3%D9%85_%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82_%D8%A7%D9%84%D9%85%D8%A4%D9%87%D9%84_%D8%A7%D9%84%D9%85%D9%83%D8%AA%D9%85%D9%84">اسم نطاق كامل (FQDN)</a> بسهولة إلى إعدادك، وكيف يمكنك استعمال خيار `domain-name` لتجنّب كتابة الـ FQDN في كل مرة تحتاجه فيها. سيُوضّح لك هذا القسم أيضًا كيف تتجنّب نسيان العناوين الشبكية في حال كان لديك عدة أجهزة أو حواسيب متصلة على الشبكة المحلية لديك.<!--]--></div></div><!----> <h2>جدارُ حمايةٍ يُصَفّي الرُزم (A Packet Filtering Firewall)</h2> <p>جدار الحماية الذي يُصَفي الرُزم يقوم بفحص كل رزمةِ بياناتٍ تمرّ عبره، ثم يقرّر قبولها أم لا، بناءً على تفحّص الحقول الموجودة في ترويسة IP و TCP/UDP، وذلك وفقًا للقواعد التي يحددها المستعمل.</p> <p>تعمل مُصفيات الرُزم بفحص عنواني المصدر والوجهة الشبكيان، كذلك أرقام المنافذ (ports) الموجودة داخل كل رزمة TCP/IP. والمنافذ هي أرقام مخصّصة لخدمات معينة، وتُستعمل لمعرفة الخدمة التي يجب أن تستقبل الرُزمة.</p> <p>ومن نقاط الضعف الشائعة في جدران الحماية أنها قد تتعامل مع كل رزمة على أنها وحدة مستقلة، من غير نظر إلى كونها جزءًا من اتصال سابق أو من سلسلة رزم متتابعة. ويُسمّى هذا النوع من الجدران الجدارَ عديمَ الحالة (Stateless Firewall)، وهو أسهل تحايُلًا من غيره. أمّا مُصفّي الرزم في «أوبن بي إس دي» فليس عديم الحالة، بل هو جدار <a href="https://en.wikipedia.org/wiki/Stateful_firewall" rel="nofollow">ذو حالة (stateful)</a>.</p> <p>يتتبّع الجدار ذو الحالة الاتصالات المفتوحة، ولا يسمح بالمرور إلا للرزم التي تنتمي إلى اتصال قائم أو التي تبدأ اتصالًا جديدًا أُجيز مسبقًا. وعند تحديد الخيار state في إحدى القواعد، ينشئ مُصفّي الرزم قواعد داخلية آلية لكل تبادل متوقّع للرزم خلال الجلسة. كما يستطيع التحقّق من كون الرزمة صالحة ضمن سياق الجلسة أم لا، ويرفض أي رزمة لا تطابق نمط الجلسة المتوقَّع.</p> <p>وتتميّز الجدران ذات الحالة بكفاءتها العالية؛ إذ يكفي التركيز على السماح أو الحظر عند إنشاء الجلسات الجديدة. فإذا سُمِح بإنشاء جلسة جديدة، مرّت جميع رزمها اللاحقة تلقائيًا، بينما تُرفض أي رزمة دخيلة أو مزوّرة. وإذا حُظرت الجلسة منذ بدايتها، فلن يُسمح بمرور أي رزمة تابعة لها. كذلك تتيح التصفية ذات الحالة قدرات مطابقة متقدّمة تمكّنها من التصدّي لكثير من الهجمات الشائعة.</p> <p>وتسمح ميزة ترجمة عناوين الشبكة (NAT) للأجهزة الموجودة خلف جدار الحماية بمشاركة عنوان شبكي عام واحد. وبذلك تستطيع جميع الأجهزة داخل الشبكة المحلية الوصول إلى الإنترنت من غير حاجة إلى تخصيص عنوان عام مستقل لكل جهاز. وتقوم هذه الميزة بترجمة العنوان الداخلي عند خروج الرزمة إلى الإنترنت، ثم تجري الترجمة العكسية عند عودة الرزم. كما تتيح إعادة توجيه حركة مرور معيّنة — غالبًا بحسب أرقام المنافذ — من العنوان العام إلى خادم محدّد داخل الشبكة.</p> <p>ويُعدّ <a href="https://man.openbsd.org/pf" rel="nofollow">مُصفي الرُزم Packet Filter (PF)</a> جدار الحماية في «أوبن بي إس دي» وهو المسؤول عن تصفية حركة TCP/IP وتنفيذ ترجمة العناوين. كما يوفّر إمكانيات تطبيع الحزم ومعالجتها، فضلًا عن التحكّم في عرض النطاق (Bandwidth) وترتيب أولويات المرور.</p> <p>ويُطوَّر مُصفّي الرزم ويُصان باستمرار من قِبَل فريق «أوبن بي إس دي».</p> <h2>إعداد مُصفي الرُزم PF</h2> <p>قبل أن نبدأ، أفتَرِضُ أنك قد قرأت <a href="https://www.openbsd.org/faq/pf/index.html" rel="nofollow">دليل استعمال مُصفي الرُزم</a> وكُتيّب <a href="https://man.openbsd.org/pf.conf" rel="nofollow">pf.conf</a>، ولاسيما هذا الأخير فهو عمدةُ هذا الباب. وإن لم يتبيّن لك كل ما فيه من الخيارات، فاحرص على قراءته، فالتوثيق لا يُستغنى عنه. ومن أراد الإحاطة بما يقدر عليه مُصفي الرُزم، فليرجع لكُتيّبه <a href="https://man.openbsd.org/pf" rel="nofollow">pf</a>.</p> <p>وأحب أن أنبّه أن صيغة مُصفي الرُزم واضحة العبارة وسهلة القراءة، غير أن <strong>الزلل فيها قريب</strong> ، حتى على كبار مديري الأنظمة وأهل الخبرة. فكم من قاعدة كُتبت بحسن نية وأفسدت الأمر كله.</p> <p>وكتابة قواعد جدار الحماية تحتاج إلى تخطيطٍ سابق، وفهمٍ دقيق للغاية المقصود من الإعداد، ومعرفةٍ بكيفية ترتيب القواعد لتحقيق ذلك المقصود، مع التنبّه لمواضع الخطأ والاحتياط من أن تغلق على نفسك باب الوصول إلى النظام من حيث لا تشعر. وأحسب أن هذا قد وقع لكثير منا في وقتٍ من الأوقات؛ استعجالًا أو إرهاقًا أو غفلةً، وقد ذقت ذلك بنفسي غير مرة.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->حرصت ما استطعت على تبسيط الإعداد، والإكثار من التعليقات التي تبيّن وظيفة كل قاعدة. كما اختبرت القواعد واحدةً واحدة، وراقبت أثر كل منها، وبذلت جهدي في تقليل التعقيد واجتناب مواطن الخطأ.<!--]--></div></div><!----> <p>وأهم ما أوصي به ألا تفترض شيئًا. اختبر قواعدك اختبارًا دقيقًا، فإن وجدت خللًا فابدأ بحذف ما أمكن من القواعد حتى لا يبقى إلا الأصل الذي يقوم عليه الإعداد، ثم أعد إضافة القواعد واحدةً بعد أخرى حتى يتبيّن لك موضع الخلل، وعندئذٍ عالجه على مهل.</p> <p>ولعل أصعب ما في الأمر أن تتصوّر مسار الرُّزم: كيف تدخل من بطاقة شبكة، ثم كيف تُمرَّر إلى جهاز عبر بطاقة أخرى، وكيف تُطابق هذه الرحلة مع المصطلحات: <strong>pass in</strong> و <strong>pass out</strong> و <strong>block in</strong> و <strong>block out</strong> و <strong>from</strong> and <strong>to</strong>. فكثيرًا ما تخالف هذه الألفاظ ما يتبادر إلى الذهن لأول وهلة.</p> <p>أما طريقتي في الفهم، فأني أتخيّل نفسي سائرًا مع الرُّزم، واقفًا عند منفذٍ بعينه، أراقب ما يدخل وما يخرج، ومن أين جاء وإلى أين يمضي. وقد يبدو هذا التصوّر ساذجًا، لكنه أعانني غير مرة على فهم المسألة وضبطها وتجنّب الخطأ.</p> <h3>إيضاحات</h3> <p>أحب أن أبدأ بتوضيح جملةٍ من الإعدادات الافتراضية والكلمات الشائعة في مصفي الرزم PF، فكثير من اللبس إنما يأتي من سوء فهمها.</p> <p>حين نتحدث عن تمرير الحركة <strong>إلى الداخل pass in</strong> أو <strong>إلى الخارج pass out</strong> ، فأنفع طريقة للفهم أن تتخيّل رُزم البيانات نفسها. فنحن <strong>نُمرِّر إلى الداخل pass in</strong> الرُزم الآتية من الحواسيب إلى بطاقة الشبكة NIC (أي من الأجهزة المتصلة بذلك المنفذ)، <strong>ونُمرِّر إلى الخارج pass out</strong> الرُزم الخارجة من بطاقة الشبكة إلى تلك الأجهزة.</p> <p>وصيغة القاعدة تكون على أحد وجهين:</p> <p>إمّا تصفية الرُزم بحسب الوجهة:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> source</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IP</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> destination</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IP</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> [on]  port</span></span></code></pre> <p>أو تصفيتها بحسب المصدر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> source</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IP</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> [on] port to destination</span></span></code></pre> <p>والجزء <code>[on]</code> هنا للشرح فقط، وليس جزءًا من صيغة مُصفي الرُزم PF.</p> <ul><li><p><code>quick</code></p> <ul><li>إذا طابقت الرزمة قاعدة تمرير <code>pass</code>, أو حظر <code>block</code> أو مطابقة <code>match</code>، ومعها الموصوف <code>quick</code>، فإن مُصفي الرزم <strong>يقبل القرار فورًا ولا ينظر في القواعد التي بعدها</strong>. وتُعدّ هذه القاعدة آخر ما يُحتكم إليه لتلك الرُزمة.</li></ul></li> <li><p><code>keep state</code></p> <ul><li>لا تحتاج غالبًا لكتابة <code>keep state</code> لقاعدة <code>pass</code> أو <code>block</code>، فحين تطابق الرُزمة قاعدة <code>pass</code> أو <code>block</code> <strong>يُنشأ لها حالة تلقائيًا</strong>.</li></ul></li></ul> <p>وإذا لم تطابق الرُزمة أي قاعدة، يكون الإجراء الافتراضي: <strong>تمريرها دون إنشاء حالة.</strong></p> <ul><li><code>on</code> interface/<code>any</code> <ul><li>تُقيِّّّّّّّّّد هذه العبارة القاعدة لتُطبَّق فقط على الرُزم <strong>الداخلة</strong> أو <strong>الخارجة</strong> من بطاقة شبكة معيّنة أو مجموعة بطاقات.</li></ul></li></ul> <p>أما <code>on any</code> فتنطبق على كل الواجهات الموجودة، ما عدا بطاقة الحلقة المحلية (loopback).</p> <ul><li><code>inet</code>/<code>inet6</code> <ul><li>تدل <code>inet</code> و <code>inet6</code> على أن هذه القاعدة تخص الرُزم <strong>الداخلة</strong> أو <strong>الخارجة</strong> ضمن نطاق توجيه بعينه، فإن قيل inet انصرف إلى IPv4، وإن قيل inet6 اختُصّ بـ IPv6.</li></ul></li></ul> <p>ولك أن تُجري القواعد على نطاق التوجيه نفسه دون أن تُسمّي بطاقة شبكة بعينها، فتسري القاعدة حينئذٍ على كل حركة من ذلك النوع في جميع البطاقات. فإذا صرّحت بـ <code>inet</code> فقد قصرت النظر على حركة IPv4 وحدها.</p> <ul><li><p><code>proto</code></p> <ul><li>ويكون تقييد القواعد بحسب نوع المعيار باستعمال الموصوف <code>proto</code>. فتُطبَّق القاعدة على الرُزم التابعة لذلك المعيار وحده، ولا تمتدّ إلى غيره. ويمكنك الرجوع إلى ملف <code>/etc/protocols</code> لمعرفة المعايير المعتمدة. ومن أشهرها وأكثرها تداولًا: <a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84_%D8%B1%D8%B3%D8%A7%D8%A6%D9%84_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85_%D9%81%D9%8A_%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA" rel="nofollow">ICMP</a>و <a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85_%D8%A8%D8%A7%D9%84%D8%A5%D8%B1%D8%B3%D8%A7%D9%84" rel="nofollow">TCP</a> و <a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84_%D8%AD%D8%B2%D9%85_%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA_%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85" rel="nofollow">UDP</a>.</li></ul></li> <li><p><code>in</code> و <code>out</code></p> <ul><li>وهذا الموضع من أيسر المواضع خطأً، وأكثرها إشكالًا على الفهم. فالرُزمة لا بد لها من حالتين لا ثالث لهما: إمّا داخلة عبر منفذ الإيثرنت، أو خارجة منه على بطاقة الشبكة. فصفتا <code>in</code> و <code>out</code> إنما يُراد بهما دخول الرُزم وخروجها عبر المنفذ الفيزيائي الذي اتصل به سلك الشبكة. <strong>فإن لم يُذكر واحد منهما، انصرفت القاعدة إلى الحزم في الجهتين معًا.</strong></li></ul></li></ul> <p>واعلم أن صفتا <code>in</code> و <code>out</code> لا تُستعملان لمعالجة انتقال الحزم من بطاقة شبكة إلى بطاقة أخرى، فإنما يكون ذلك بترجمة العناوين الشبكية (NAT)، وذلك باستعمال خياري <code>nat-to</code> و <code>rdr-to</code>. وصفتا <code>in</code> و <code>out</code> دورهما مقصور على الحركة الداخلة إلى المنفذ الفيزيائي أو الخارجة منه، لا ما جاوزه إلى غيره.</p> <ul><li><code>from</code> و <code>to</code> <ul><li>يُقصد بهذين الوصفين أن تُقيَّد القاعدة بالرُزم التي لها مصدرٌ ووجهة معلومان، من حيث العنوان والمنفذ، ويجوز لك أن تُهمل اسم المضيف أو عنوانه، أو المنفذ، أو حتى توصيف نظام التشغيل، إن لم يكن لك حاجة.</li></ul></li></ul> <p>وعند العمل على موجّهٍ ذي بطاقات شبكة متعددة، يسهل على المرء أن يتوهّم الأمر على هذا النحو: <em>أُمرّر الرُزم الداخلة من البطاقة الخارجية المتصلة بالإنترنت، ثم أجعلها تخرج إلى بطاقة الشبكة الداخلية، ومنها إلى حاسب بعينه.</em> فيتبع المرء في ذهنه أثر الرزمة، ثم يكتبه في قاعدة كهذه: <code>pass in on $ext_if from $ext_if to $dmz port 80</code>. غير أن هذه القاعدة لا تجعل حركة HTTP تظهر في المنفذ 80 على الشبكة الـمحلية LAN عند حاسب ذي عنوان معيّن. بل لا بدّ حينئذٍ من قاعدة <code>pass out</code>، ومن تعيين الجهاز المقصود. والحق أن مثل هذه القواعد لا حاجة إليها في عامة الأحوال، إلا إن كنت بصدد مطلب خاصّ نادر. فخاصية <a href="https://www.openbsd.org/faq/pf/filter.html#urpf" rel="nofollow">Unicast Reverse Path Forwarding (uRPF)</a> في مُصفي الرزم تكفل حماية الشبكة الداخلية على أحسن وجه، ومع إعدادٍ سليم لترجمة العناوين (NAT) باستعمال <code>nat-to</code>، وإعادة التوجيه بـ <code>rdr-to</code>، يتولى مُصفي الرزم تدبير الحزم من الداخل إلى الخارج وبالعكس دون عناء.</p> <p>أما المعامل <code>all</code> فهو نظير قولك <code>from any to any</code>. <strong>بل إن هذا هو الأصل ما لم يصرّح بخلافه</strong>. فقولك مثلا: <code>pass in on $dmz proto udp to port dns</code> يؤول في حقيقته إلى: <code>pass in on em3 inet proto udp from any to any port = 53</code></p> <p>ولا حاجة الى كتابة <code>to any port dns</code>، لأن <code>any</code> مفهومة ضمناً، غير أن تعيين المنفذ بـ <code>to port dns</code> لا غنى عنه.</p> <ul><li><code>nat-to</code> و <code>rdr-to</code> <ul><li>تُعنى صفتا nat-to و rdr-to بترجمة عناوين الشبكة (NAT)، <strong>إذ إذ تُغيّران عنوان المصدر أو الوجهة، أو المنفذ، للرزم المرتبطة باتصال ذي حالة</strong>. ويقوم مصفي الرُزم PF عند ذلك بتعديل العنوان أو المنفذ المحدد، ثم يُعيد حساب قيم التحقق الخاصة بـ IP و TCP و UDP كلما اقتضى الأمر.</li></ul></li></ul> <p>وتدل <code>nat-to</code> على أن <strong>عناوين الرزم تُبدّل وهي تعبر بطاقة بعينها،</strong>. وبذلك يُمكِّن عنوانٌ عام واحد — أو عناوين قليلة — على الموجّه من خدمة عدد كبير من الأجهزة الكائنة خلفه في الشبكة الداخلية، أعني شبكة الـ LAN.</p> <p>وغالب استعمال <code>nat-to</code> يكون للحزم الخارجة، <strong>أي تلك المنصرفة من الشبكة الداخلية إلى الإنترنت</strong>. ولا يُدعم توجيه <code>nat-to</code> إلى عنوانٍ محلي.</p> <p>أما <code>rdr-to</code> فموضعها الغالب في الحزم الداخلة، <strong>إذ تُعيد توجيه الحركة الواردة من الإنترنت إلى جهازٍ أو خدمة داخل الشبكة المحلية</strong>.</p> <ul><li>قائمة العناصر ونطاقات العناوين والمنافذ <ul><li>إذا احتجت إلى تعيين أكثر من عنصر — كأن تُحدّد عدة منافذ — جاز لك أن تفصل بينها بمسافة أو بفاصلة، فتقول مثلًا: <code>port { 53 853 }</code> أو <code>port { 53, 853 }</code></li></ul></li></ul> <p>وأما نطاقات العناوين فتُبَيَّن باستعمال الشرطة <code>-</code>، فقولك: <code>192.168.1.2 - 192.168.1.10</code> يعني جميع العناوين الـشبكية IP من 192.168.1.2 إلى 192.168.1.10 داخلين في الحكم.</p> <p>وأما نطاقات المنافذ فلها صيغ متعددة وأحكام متفرعة، يُرجع فيها إلى كتيّب <a href="https://man.openbsd.org/pf.conf" rel="nofollow">pf.conf</a>، وتنظر تحت العبارة: “Ports and ranges of ports are specified using these operators”، ففيها البيان الشافي.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--red)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰀦</span> <!--[--><!---->اعلم أن كل رُزمةٍ تمرّ عبر مُصفي الرزم، داخلةً كانت أو خارجةً من بطاقة شبكة، تُعرَض على القواعد واحدةً بعد أخرى، من أولها إلى آخرها. ففي قواعد `block` و `pass`، يكون الحكم **لآخر قاعدة طابقت الرزمة**. فإن لم توافق الرزمة أيَّ قاعدة، جرى عليها الأصل، وهو تمريرها دون إنشاء حالة. وأما قواعد `match`، فإنها تُقيَّم **كلما تحققت المطابقة** ، ولا يُكتفى فيها بآخر حكم كما هو الشأن في الحظر والتمرير أي `block` و `pass`.<!--]--></div></div><!----> <h3>حلّ أسماء النطاقات وأسماء المضيفين</h3> <p>إذا عزمتَ على استعمال أسماء المضيفين (hostnames) و/أو أسماء النطاقات (domain names) في إعداد مصفي الرزم لديك، فاعلم أن <strong>جميع عمليات حلّ الأسماء لا تتم إلا عند تحميل مجموعة القواعد</strong>. ومعنى ذلك أنه إذا تغيّر العنوان الشبكي المرتبط بمضيفٍ أو نطاقٍ ما، وجب إعادة تحميل القواعد حتى ينعكس هذا التغيير داخل النواة.</p> <p>ولا يُفهم من ذلك أن مُصفّي الرُّزم يجري استعلامًا إلى «نظام اسماء النطاقات» كلما طُبّقت قاعدة تحتوي على اسم مضيف أو اسم نطاق؛ فليس الأمر كذلك. وإنما يُجرى الاستعلام مرةً واحدة عند تحميل ملف القواعد، ثم تُستعمل النتائج المستخرجة منه بعد ذلك كما هي.</p> <p>ويترتب على هذا أنك مطالب بالتأكد من توافر خادم نظام أسماء النطاقات الذي تعتمد عليه وسلامة عمله قبل تحميل قواعد مُصفّي الرُّزم، وإلا تعذر تحميلها لعجز النظام عن حلّ أسماء المضيفين أو النطاقات الواردة فيها.</p> <p>وفي «أوبن بي إس دي» يبدأ مصفي الرزم عمله قبل تشغيل Unbound أو غيره من خوادم نظام أسماء النطاقات، وهذا هو الترتيب السليم من الناحية الأمنية.</p> <p>ولهذا أنصح بتجنّب استعمال أسماء المضيفين وأسماء النطاقات في قواعد مُصفّي الرُّزم ما أمكن، والاقتصار على العناوين الشبكية المباشرة. فمع أن استعمال الأسماء جائز ومدعوم، فإن الاعتماد على عناوين IP أبسط وأوثق وأقل عرضة للمشكلات التشغيلية.</p> <h3>القواعد</h3> <p>من الحكمة أن تختبر القواعد على جهازٍ تجريبي قبل اعتمادها نهائيًا؛ فغالبًا ما تتعدد السُّبل المؤدية إلى النتيجة نفسها. وبرأيي المتواضع، خيرُ تلك السبل ما كان أوضح لك فهمًا وأسهل عليك إدراكًا.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--red)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰀦</span> <!--[--><!---->إيّاك أن تكتب قواعد جديدة على جهازٍ بعيد (remote) أنت متصل به حاليًا، إلا إذا كنت على درايةٍ تامة بما تفعل؛ ففقدان الاتصال بجهازٍ بعيد ليس بالأمر الهيّن ولا بالممتع.<!--]--></div></div><!----> <p>حاوِل أن تستبين السُّبل التي تُبقي بها قواعدك واضحة وموجزة قدر الإمكان، مع الاعتماد على القيم الافتراضية متى أمكن ذلك. ومع هذا، لا تتحرّج من التصريح بالمُعدِّلات التي تزيد القاعدة بيانًا ووضوحًا، ولو كانت مطابقة للقيم الافتراضية. فالقيمة الافتراضية قد تكون مثلًا <code>any to any</code>، ويمكن حينئذٍ الاستغناء عن ذكرها، غير أنّ التصريح بها في نص ملف الإعداد قد يجعل القاعدة أسهل فهمًا وأجلى قصدًا عند المراجعة والقراءة لاحقًا.</p> <p>يمكنك دائمًا تحليل القواعد والتحقّق من خلوّها من الأخطاء دون تفعيلها، وذلك بالأمر: <code>pfctl -nf /etc/pf.conf</code>. فإذا اطمأننتَ إلى سلامتها، أمكنك تحميلها بالأمر: <code>pfctl -f /etc/pf.conf</code> وبعد التحميل، تستطيع الاطّلاع على الصيغة التي حوّل بها مصفي الرزم (PF) القواعد داخليًا باستخدام الأمر: <code>pfctl -s rules</code> وأوصي بالمواظبة على استعماله؛ إذ يُعين على الفهم والمراجعة واكتشاف ما قد يخفى.</p> <p>وأميل إلى تنظيم القواعد في أقسام واضحة، مع الإكثار من التعليقات، ليظلّ الملف مقروءًا مفهومًا، وسأسير على هذا النهج في هذا المثال كذلك.</p> <p>افتح الآن الملف <code>/etc/pf.conf</code> باستعمال محرّر النصوص الذي تألفه.</p> <p>وسنبدأ أولًا بتعريف بعض المُعرِّفات (macros)، لتسهيل تذكّر أيّ بطاقات الشبكة (NICs) نستخدم، ولأي غرض خُصِّصت. كما أنّ اعتماد هذه المعرّفات يجعل تغيير اسم برنامج تشغيل البطاقة أمرًا يسيرًا، إن استُبدلت البطاقة لاحقًا أو أُضيفت بطاقات جديدة.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># المُعرِّفات (Macros) </span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#076678;--shiki-dark:#83A598">ext_if</span><span style="color:#427B58;--shiki-dark:#8EC07C">=</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26">em0</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"> # كرت الشبكة الخارجي المتصلة بمودِم مزوّد الخدمة (NIC). </span></span>
<span class="line"><span style="color:#076678;--shiki-dark:#83A598">g_lan</span><span style="color:#427B58;--shiki-dark:#8EC07C">=</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26">em1</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">  # شبكة البالغين المحلية. </span></span>
<span class="line"><span style="color:#076678;--shiki-dark:#83A598">c_lan</span><span style="color:#427B58;--shiki-dark:#8EC07C">=</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26">em2</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">  # شبكة الأطفال المحلية.</span></span>
<span class="line"><span style="color:#076678;--shiki-dark:#83A598">dmz</span><span style="color:#427B58;--shiki-dark:#8EC07C">=</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26">em3</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # الشبكة العامة (المنطقة المعزولة DMZ).</span></span></code></pre> <p>ثم ننتقل بعد ذلك إلى إعداد جدولٍ للعناوين غير القابلة للتوجيه (non-routable IP addresses). نقوم بهذا الإجراء لأنّ من أشيع أخطاء تهيئة الشبكات السماحُ بمرور حركة تحمل عناوين غير قابلة للتوجيه إلى شبكة الإنترنت. وهذه عناوين لا ينبغي لها، من حيث الأصل، أن تظهر خارج الشبكات المحليّة. وسنستعمل هذا الجدول ضمن مجموعة القواعد لحظر أي محاولة لبدء اتصال بعناوين غير قابلة للتوجيه عبر بطاقة الشبكة الخارجيّة للموجّه (external NIC). وبهذا نمنع تسرّب هذا النوع من الحركة إلى الإنترنت، ونغلق بابًا من أبواب الخلل وسوء الضبط قبل وقوعه.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># الجداول (Tables) </span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># جدول بالعناوين الخاصة غير القابلة للتوجيه عبر الإنترنت.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">table</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">martian</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">s</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0/8</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 10.0.0.0/8</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 127.0.0.0/8</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 169.254.0.0/16</span><span style="color:#8F3F71;--shiki-dark:#D3869B">     \</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">                   172.16.0.0/12</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.0.0.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.0.2.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 224.0.0.0/3</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> \</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">                   192.168.0.0/16</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 198.18.0.0/15</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 198.51.100.0/24</span><span style="color:#8F3F71;--shiki-dark:#D3869B">        \</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">                   203.0.113.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--red)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰀦</span> <!--[--><!---->تنَبَه الى أن المعرفات (macros) والجداول توضع أعلى الملف <code>/etc/pf.conf</code>، قبل أي قواعد ترشيح أخرى، إذ يعتمد مصفي الرزم (PF) عليها أثناء تفسير بقية القواعد.<!--]--></div></div><!----> <p>بعد ذلك نبدأ بوضع <strong>سياسة الحظر الافتراضي</strong> ، ونفعّل معها عددًا من الخصائص الوقائيّة التي تشكّل خطّ الدفاع الأوّل، بحيث لا يُسمح بمرور أي حركة إلا ما نصرّح به صراحةً ضمن القواعد اللاحقة.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># الحماية والحظر الافتراضي </span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">set</span><span style="color:#79740E;--shiki-dark:#B8BB26"> skip</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> lo0</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># حماية من انتحال العناوين على جميع كروت الشبكة.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> no-route</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> urpf-failed</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># حظر العناوين الخاصة غير القابلة للتوجيه. </span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># نستخدم المعلمة "quick" لجعل هذه القاعدة فاصلة ولا يُنظر لما بعدها. </span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">martian</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">s</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> return</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">martian</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">s</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># الحظر الافتراضي لكل حركة البيانات الداخلة عبر كروت الشبكات المحلية،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># من أي حاسب أو جهاز متصل بها.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> return</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># الحظر الافتراضي لكل حركة البيانات الداخلة من الإنترنت عبر كروت الشبكة الخارجية،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># مع تسجيلها في السجل.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> log</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># السماح بمعيار ICMP.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> icmp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> icmp-type</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {echoreq</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tag</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ICMP_IN</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> icmp</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> icmp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tagged</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ICMP_IN</span><span style="color:#79740E;--shiki-dark:#B8BB26"> max-pkt-rate</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 100/10</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># نحتاج أن يكون للموجّه اتصال بالإنترنت،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># لذا نُجيز افتراضًا مرور الرزم الخارجة من الموجّه</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># عبر الكرت الخارجي إلى الإنترنت.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span></span></code></pre> <p>إن العناوين الـشبكية (IP) المندرجة في المعرف <code>martians</code> هي عناوين <a href="https://tools.ietf.org/html/rfc1918" rel="nofollow">RFC1918</a> ، وهذه عناوين خُصِّصت للاستعمال الداخلي، ولا موضع لها على شبكة الإنترنت العامّة. ولما كانت هذه العناوين لا تنتمي إلى الفضاء العام للشبكة، سُمّيت martians، كأنها أتت من المريخ، ويُطلق عليها كذلك اسم <a href="https://en.wikipedia.org/wiki/Bogon_filtering" rel="nofollow">bogons</a>. وأيّ حركة مرورٍ صادرةٍ من هذه العناوين أو واردةٍ إليها تُسقَط عند البطاقة الخارجيّة للموجّه، إذ لا خير في استقبالها ولا في تمريرها، وحجبها من صميم الحيطة وسلامة الإعداد.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->مع أنّنا نحجب عناوين المريخ (martians) حجبًا ضمنيًّا بعبارة <code>block drop in log on $ext_if</code> التي تجعل الأصل هو المنع، فإننا نعود فنحجب هذه العناوين حجبًا صريحًا قبل ذلك. وليس هذا من باب التكرار، بل هو من محاسن الصنعة وأحسن الممارسات. فالراوتر، وإن أُحسن ضبطه في ترجمة العناوين (NAT)، يبقى عُرضةً للخطأ البشري، وسوء الإعداد وارد لا يُنكر. ومن أشهر هذه الزلّات أن يُسمح، من غير قصد، بمرور حركةٍ تحمل عناوين غير قابلة للتوجيه إلى الإنترنت. ولما كانت الحزم الصادرة من عناوين غير قابلة للتوجيه قد تُستغل في ضروبٍ من هجمات الحرمان من الخدمة (DoS) وغيرها من المآخذ الأمنيّة، فإن التصريح بحجبها عند البطاقة الخارجيّة يُعدّ من جهة الأمن سلوكًا محمودًا، واحتياطًا واجبًا لا يُستغنى عنه.<!--]--></div></div><!----> <p>في الإصدارات السابقة من هذا الدليل -قبل النسخة 1.5.0- كنتُ أُدرج قاعدة <a href="https://man.openbsd.org/pf.conf#Scrub" rel="nofollow">scrub</a> ضمن الإعدادات المقَدمَة أعلاه. غير أنّي، بعد مشاورة <a href="http://henningbrauer.com/" rel="nofollow">هننغ براور</a> -له الشكر- من فريق «أوبن بي إس دي»، والاطلاع على مزيدٍ من البحث والتوثيق، آثرتُ حذفها؛ إذ تبيّن لي أنّها تُعالج حالاتٍ نادرة مخصوصة، لا يحتاجها عموم المستخدمين (ومن أراد التفصيل فليراجع الكتيّبات). فأنت لا تحتاج إلى قاعدة <code>scrub</code> إلا إذا كان في شبكتك مضيفٌ يُنشئ حزمًا مُجزّأة مع ضبط راية عدم التجزئة (dont-fragment). أمّا السلوك الافتراضي لـمصفي الرزم عند الاستغناء عن هذه القاعدة، فهو في الجملة أنسب وأقوم للاستعمال العام.</p> <p>وتجدر الإشارة إلى أنّ <a href="https://www.openbsd.org/faq/pf/example1.html" rel="nofollow">أسئلة «أوبن بي إس دي» الشائعة</a> تورد مثالًا لإعداد موجّهٍ بسيط، وفيه قيم معيّنة لقاعدة <code>scrub</code>. غير أنّ نصيحتي — عن تجربة — ألا تُدخل هذه القاعدة إلا إذا كنتَ على يقينٍ تامٍّ من حاجتك إليها. فإن دعتك الضرورة لاستعمالها، فموضعها الصحيح أن تُدرج بعد قاعدة <code>set skip</code> الخاصة ببطاقة loopback، على هذا النحو.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">set</span><span style="color:#79740E;--shiki-dark:#B8BB26"> skip</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> lo0</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> all</span><span style="color:#79740E;--shiki-dark:#B8BB26"> scrub</span></span></code></pre> <p>ثم بعد ذلك أضِف إلى قاعدة <code>scrub</code> ما تحتاجه من معاملات وضوابط، بحسب حال شبكتك ومتطلباتها.</p> <p>و كنتُ فيما مضى أُدرج القاعدة الآتية من قواعد <a href="https://man.openbsd.org/pf.conf#Blocking_Spoofed_Traffic" rel="nofollow">antispoof</a> ضمن قسم الحماية من الانتحال (spoofing protection)، قبل أن أُعيد النظر في موضعها واستعمالها.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">antispoof</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> for</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span></code></pre> <p>ثم إني عدلتُ عن استعمال قاعدة <code>antispoof</code> إذ تبيّن أن خاصية <a href="https://www.openbsd.org/faq/pf/filter.html#urpf" rel="nofollow">Unicast Reverse Path Forwarding (uRPF)</a> في مصفي الرزم تؤدي <a href="https://www.openbsd.org/faq/pf/filter.html#antispoof" rel="nofollow">الغرض نفسه</a> ، فلا حاجة لنا بها بعد اليوم. وعليه اكتفينا بالقاعدة: <code>block in quick from urpf-failed</code> فهي أبلغ في المقصود وأوجز في السبك.</p> <p>ومع ذلك أبقيتُ الحديث عن معامل <code>antispoof</code> هنا لا للعمل به، بل للتعليم والفهم.</p> <p>والانتحال (Spoofing) هو أن يتزيّا المهاجم بغير زيه، فيزوّر العنوان الـشبكي، فيُظهر الرزمة كأنها صادرة من غير مصدرها. ومعامل <code>antispoof</code> ما هو إلا اختصار يتوسّع به مصفي الرزم إلى مجموعة من قواعد التصفية، غايتها حظر كل حركة يكون عنوان مصدرها من شبكةٍ موصولة مباشرة بواجهةٍ معيّنة، ثم تحاول النفاذ إلى النظام عبر واجهةٍ أخرى غير تلك. ويُسمّى هذا عند أهل الصنعة «تسرّب العناوين» أو «تجاوز الواجهات»، إذ ينزلق العنوان من موضعه المشروع إلى موضعٍ ليس له.</p> <p>وأما توجيه <code>antispoof</code> المذكور آنفًا، فإن مصفي الرزم (PF) لا يتركه على إجماله، بل يفسّره ويحوّله إلى قواعد صريحة مفصّلة، على النحو التالي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> !</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.1.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> !</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.2.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> !</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em3</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.3.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span></span></code></pre> <p>فلو أخذنا – على سبيل المثال – قاعدة البطاقة <code>em1</code> الآتية: <code>block drop in quick on ! em1 inet from 192.168.1.0/24 to any</code> فمعناها: <em>حظرُ كلِّ حركةٍ صادرةٍ من شبكة عناوينها من 192.168.1.1 إلى 192.168.1.255، إذا لم تكن واردةً من البطاقة em1 نفسها، أياً كانت وجهتها</em>. ووجه ذلك أن البطاقة <code>em1</code> هي المسؤولة عن هذا النطاق من العناوين، فلا يُتصوَّر – ولا يُسمَح – أن تصدر حزمٌ تحمل هذه العناوين من واجهةٍ أخرى؛ فإن وقع ذلك كان قرينةً على انتحالٍ أو خلل.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--red)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰀦</span> <!--[--><!---->ينبغي قصرُ استعمال خيار <code>antispoof</code> على الكروت التي أُسنِد إليها العنوانُ الشبكي (IP). فإن كان لديك بطاقاتٌ أو منافذُ غير مستخدمة، فإمّا أن تُسنِد إليها عناوين، وإمّا أن تُخرِجها من نطاق قواعد <code>antispoof</code>، لئلا يقع الحظر على غير وجهه.<!--]--></div></div><!----> <p>وكما تقدّم، فقد أزلتُ قاعدة <code>antispoof</code> ، واستعضتُ عنها بفحص uRPF الصارم. فعند تمرير رزمةٍ عبر فحص uRPF، يُراجَع عنوانُ المصدر في جدول التوجيه؛ فإن وُجدت الواجهةُ التي يُفترض أن تخرج منها تلك الرزمة، وكانت هي نفس البطاقة التي دخلت منها فعلاً، اجتاز الفحص. أمّا إن اختلفت الواجهتان، فذلك دليلٌ محتمل على انتحال عنوان المصدر، فتُحظَر الرزمة ولا يُسمَح بمرورها. وبهذا الأسلوب، يتحقّق المقصود من منع الانتحال، مع بساطةٍ في القواعد، وثباتٍ في السلوك، وأمنٍ أوثق في إدارة الحركة.</p> <p>ونحن نسمح بمرور <a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84_%D8%B1%D8%B3%D8%A7%D8%A6%D9%84_%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85_%D9%81%D9%8A_%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA" rel="nofollow">ICMP</a> في هذا الإعداد، بالرغم من أن بعض مديري الشبكات يعمدون إلى حجبه حجبًا تامًّا. وإنما يلجأ هؤلاء إلى ذلك خوفًا من ممارساتٍ غير مشروعة، كاستكشاف الشبكات، وإنشاء قنوات اتصالٍ خفيّة، ومسح العناوين بالـ <a href="https://en.wikipedia.org/wiki/Ping_sweep" rel="nofollow">ping sweep</a>, وإغراق الشبكة بالـ<a href="https://en.wikipedia.org/wiki/Ping_flood" rel="nofollow">ping flood</a>, وتمرير البيانات عبر أنفاق <a href="https://en.wikipedia.org/wiki/ICMP_tunnel" rel="nofollow">ICMP tunneling</a> أو <a href="https://en.wikipedia.org/wiki/ICMP_Redirect_Message#Redirect" rel="nofollow">ICMP redirecting</a>. غير أن ICMP أوسع شأنًا من الردّ على طلبات ping. فهو ركنٌ أساس في تشخيص الأعطال، وضبط الاعتمادية، وتحسين أداء الشبكة. فإذا حُجب المعيار حجبًا كليًّا تعطّلت آلياتٌ مهمّة يعتمد عليها النظام في الإبلاغ عن الأخطاء، وتحديد المسارات، والتعامل السليم مع حالات الفشل.</p> <p>ومن جملة الأسباب التي تجعل حجب ICMP حجبًا مطلقًا أمرًا مذموماً:</p> <ul><li>يُستعمل (Path MTU Discovery – PMTUD) لمعرفة أكبر حجمٍ للرزمة يمكن أن تعبُر أجهزة الشبكة الواقعة بين المصدر والوجهة دون أن تتجزأ. ويعتمد معيار TCP في ذلك على رسائل ICMP من النوع (3) والرمز (4). فإذا تجاوزت الرزمة حجم الـ MTU لجهازٍ ما في الطريق، أعاد ذلك الجهاز رسالة ICMP تُبيّن الخطأ وتذكر الحجم الأقصى المسموح به. فإذا حُجبت هذه الرسائل، ظلّ النظام الوجهة يطلب الرزم التي لم تصله، وظلّ المصدر يعيد إرسالها عبثًا، لا تبلغ غاية ولا تحلّ عقدة، حتى تنشأ ما يُعرف ب<a href="https://en.wikipedia.org/wiki/Black_hole_%28networking%29" rel="nofollow">الثقب الأسود</a> لـ ICMP، فتختنق الاتصالات وتتعطّل عمليات الإرسال.</li> <li>يحدد زمن الحياة (Time to live TTL) العمر الأقصى لرزمة البيانات في الشبكة. فإذا حُجب ICMP، لم تصل رسائل الخطأ من النوع (11) والرمز (0) التي تُفيد بانقضاء زمن الحياة أثناء العبور. وبذلك لا يُخطر المضيفُ المصدرُ بضرورة زيادة قيمة TTL، فتظل الرزم تفشل في بلوغ مقصدها دون علمٍ بسبب الفشل ولا سبيل إلى تصحيحه.</li> <li>تدنّي الأداء بسبب حجب (ICMP Redirect). فتُستعمل رسائل إعادة التوجيه ليُعلم الموجّهُ المضيفَ بوجود مسارٍ أقصر وأكفأ إلى الوجهة المقصودة، مما يقلّل عدد القفزات التي تقطعها البيانات. فإذا مُنع ICMP، بقي المضيف جاهلًا بالمسار الأمثل، فسلك طرقًا أطول وأثقل، وانخفض الأداء تبعًا لذلك.</li></ul> <p>في الإعداد المتقدّم آنفًا أجزنا ICMP، غير أنّا قيّدناه بقيودٍ تردع الإفراط، فجعلنا له حدًّا في المعدّل، حتى لا يُستغل في الإزعاج أو الإغراق. فبالمُعدِّل <code>max-pkt-rate 100/10</code> لا يجيب الموجّه على طلبات ping إذا جاوز الواردُ مئة طلبٍ في عشر ثوانٍ، فيسكت بعد الحدّ، ويكفّ عن الاستجابة.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->إن أردتَ – لسببٍ تراه – حجب ICMP حجبًا تامًّا، فالأمر يسير: احذف القواعد الثلاث التي تلي تعليق Allow ICMP، فينقطع أثره جملةً.<!--]--></div></div><!----> <p>وبعد هذا ننتقل إلى الشبكة الخاصة بالبالغين في الدار.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># إعداد شبكة البالغين</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># السماح لأي حاسب أو جهاز على شبكة البالغين</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># بإدخال الرزم عبر هذا الكرت.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># أي جهاز متصل بهذا الكرت يمكنه إرسال البيانات</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># إلى أي وجهة: الإنترنت أو بقية الأجهزة المتصلة بالموجّه.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># حظر استعلامات «نظام اسماء النطاقات» التي لا تتجه إلى خادم ال«نظام اسماء النطاقات» الخاص بنا.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> return</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#79740E;--shiki-dark:#B8BB26"> udp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> !</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> port</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 53</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 853</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># لدي طابعة شبكية لا أريد لها الاتصال بخوادمها الخارجية،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># لذا أقوم بحظرها.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># عنوان الطابعة هو 192.168.1.8.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.8</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># السماح بمرور الرزم من الموجّه إلى الخارج عبر كرت البالغين</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># نحو الأجهزة المتصلة بها.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># من دون هذه القاعدة لا يمكن حتى تنفيذ ping</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># من الموجّه إلى أجهزة شبكة البالغين.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> keep</span><span style="color:#79740E;--shiki-dark:#B8BB26"> state</span></span></code></pre> <p>في هذا المثال لديَّ طابعةٌ شبكية موصولة بشبكة البالغين، ولا أرغب أن يكون لها أي اتصال بالإنترنت ولا بغيره، احتياطًا لما قد يكون فيها من برمجياتٍ متجسِّسة أو سلوكٍ غير مأمون. ولأجل ذلك أقرِّر حظر كل حركة بياناتٍ تدخل عبر البطاقة em1، إذا كان مصدرها العنوان 192.168.1.8، متجهةً إلى أي عنوانٍ كان._.</p> <p>وكذلك نحرص على أن تكون جميع طلبات «نظام اسماء النطاقات» على المنفذين 53 (وهو «نظام اسماء النطاقات» التقليدي) و 853 (وهو «نظام اسماء النطاقات» عبر TLS) محظورةً دائمًا، ما لم تكن موجَّهة إلى خادم «نظام اسماء النطاقات» الخاص بنا. وبهذا نمنع الأجهزة من الالتفاف على سياسات الحجب أو استخدام خوادم أسماءٍ خارجية دون علمنا، ونُبقي حلَّ الأسماء تحت سيطرة الموجّه وحده.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->كنتُ في السابق أُعيد توجيه كل حركة البيانات الواردة على المنفذ 53، إن لم تكن موجَّهة إلى خادم «نظام اسماء النطاقات» الخاص بنا، إليه قسرًا. وفعلتُ ذلك لأن حظر طلبات «نظام اسماء النطاقات» على هذا المنفذ ـ سواء بالحظر مع الإرجاع `return` أو بالإسقاط `drop` ـ يجعل الطلب ينتهي بالمهلة (timeout) عند العميل، مما يُحدث تأخيرًا ملحوظًا في الاستجابة لدى معظم الأجهزة. غير أنني عدلتُ عن ذلك إلى الحظر الصريح، إذ أراه النهج الأقوم. فلابد أن تدرك جميع الأجهزة أن التواصل عبر المنفذ 53 ممنوع، إلا إذا كان القصد خادم «نظام اسماء النطاقات» الذي نحدده. وهذا أدعى إلى الوضوح، ولا سيما عند استكشاف أخطاء الشبكة؛ إذ إن الردود المُعاد توجيهها من خادمنا قد تُخفي حقيقة وقوع إعادة توجيه من الأصل.<!--]--></div></div><!----> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->يعتمد «نظام اسماء النطاقات» في الأساس على معيار «يو دي بي» UDP عبر المنفذ 53 لخدمة الاستعلامات، غير أنه إذا تجاوز حجم الرد 512 بايت، وكان كلٌّ من العميل والخادم يدعم EDNS، استُخدمت رُزم «يو دي بي» أكبر. أما إذا لم يتوفر ذلك، فيُعاد إرسال الاستعلام باستخدام بروتوكول «تي سي بي» TCP. وبعض مُحلِّلات «نظام اسماء النطاقات» تعتمد «تي سي بي» في جميع الاستعلامات أصلًا. ولهذا السبب لزم أن نُضمِّن في القاعدة الواحدة كِلَا البروتوكولين: «يو دي بي» و «تي سي بي» عند التعامل مع المنفذ 53.<!--]--></div></div><!----> <p>جزء شبكة الأطفال من الشبكة المحلية يشبه ما سبق.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># إعداد شبكة الأطفال </span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># السماح لأي حاسب أو جهاز على شبكة الأطفال بإدخال رُزم البيانات</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># عبر بطاقة الشبكة. أي إن كل جهاز موصول بهذه البطاقة</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># يُسمح له بإرسال البيانات إلى أي جهة، سواء إلى الإنترنت</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># أو إلى أي جهاز موصول بالموجّه.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># حظر جميع استعلامات «نظام اسماء النطاقات» التي لا تكون موجَّهة إلى خادم «نظام اسماء النطاقات» الخاص بنا.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> return</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#79740E;--shiki-dark:#B8BB26"> udp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcp}</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> !</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> port</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 53</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 853</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># السماح بمرور رُزم البيانات من الموجّه إلى الخارج عبر بطاقة شبكة الأطفال</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># نحو الحواسيب والأجهزة المتصلة بها.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># وبدون هذا الإذن لن نتمكن حتى من تنفيذ أمر ping</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># من الموجّه نفسه إلى أجهزة شبكة الأطفال.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> keep</span><span style="color:#79740E;--shiki-dark:#B8BB26"> state</span></span></code></pre> <p>في الإعداد الحالي لدى كل من شبكة البالغين وشبكة الأطفال بدرجة الوصول نفسها إلى الإنترنت. أمّا الإعداد الأكثر تقييدًا فسيَرِد ذكره لاحقًا في قسم ائمة السماح الخاصة بشبكة الأطفال.</p> <p>ثم نصل بعد ذلك إلى منطقة DMZ، أي بطاقة الشبكة المتصلة بخادم ويب مكشوف للعامة. وبما أنّ لدينا خادمًا ظاهرًا للإنترنت، فنحن نضع له جملةً من القيود. فإذا قُدِّر لهذا الخادم أن يُخترق يومًا، كان على المتطفّل أن يشقّ طريقًا وعرًا قبل أن يهتدي إلى ما وراءه في شبكتنا الداخلية.</p> <p>ولهذا نحظر جميع أوجه الوصول، ما عدا «معيار تهيئةُ المُضيف الآلية»، ليتمكّن خادم الويب من الحصول على العنوان الشبكي من الموجّه. ثم لا نبيح غير ذلك إلا يدويًا، وعند الحاجة فقط، كحال تحديث النظام أو إجراء صيانة لازمة. وقد علّقتُ القواعد التي نحتاجها عند فتح الوصول، مع إبقاء القيود الصارمة فعّالة. فإذا دعت الحاجة إلى تحديث الخادم، فتحنا له مؤقتًا باب «نظام اسماء النطاقات» والوصول العام إلى الإنترنت، ثم أعدنا إغلاقه بعد الفراغ من الأمر.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->بدل أن نُغيّر مجموعة القواعد يدويًا في كل مرة نحتاج فيها إلى فتح الوصول لتحديث خادم الويب، يمكننا الاستعانة بما يُسمّى <a src="https://man.openbsd.org/pf.conf#ANCHORS">anchor</a>، غير أنّا آثرنا في هذا الدليل ترك هذا الخيار جانبًا، طلبًا للتبسيط، واجتنابًا لما قد يورثه من تعقيد في هذا المقام.<!--]--></div></div><!----> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># DMZ Setup</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># السماح لأي حاسب أو جهاز موصول ببطاقة DMZ بإجراء استعلامات «نظام اسماء النطاقات»</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># (أزل التعليق عند الحاجة).</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#pass in on $dmz inet proto udp from any port 53</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># حظر جميع طلبات «نظام اسماء النطاقات» التي لا تكون موجّهة إلى خادم «نظام اسماء النطاقات» على الراوتر. </span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> return</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#79740E;--shiki-dark:#B8BB26"> udp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcp}</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> !</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26"> port</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 53</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 853</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># عند الرغبة في تمكين أي حاسب موصول بواجهة DMZ من النفاذ إلى الإنترنت،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># أزل التعليق عن هذا السطر لفتح الوصول.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># وهذا عند ترقية النظام أو تحديثه.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#pass in on $dmz inet</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># مهما يكن، لا نريد لقطاع DMZ أن يصل إلى أي من قطاعات الشبكة الأخرى،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># لذا نصرّح بالحظر صراحة في النهاية.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># لدينا أكثر من خيار. فلو استعملنا مثلًا:</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#   block drop in on $dmz to 192.168/16</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># فإننا نحظر الوصول إلى جميع الشبكات الفرعية،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># غير أن هذا يمنع كذلك الأجهزة الموصولة بـ DMZ</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># من إجراء استعلامات «نظام اسماء النطاقات» عند الحاجة إلى التحديث.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># وفي تقديري أن التصريح الصريح أدقّ وأحكم،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># فنحظر فقط القطاعات التي نريد منع الوصول إليها.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># هذا السطر يمنع الحواسيب الموصولة بواجهة DMZ</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># من الوصول إلى أي حاسب أو جهاز في القطاعين الآخرين. </span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drop</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26">:network</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26">:network</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># أخيرًا، لا بد من السماح بمرور الرزم الصادرة من بطاقة DMZ</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># إلى الأجهزة الموصولة بها، وإلا فلن يتمكن أحد من «مخاطبتها».</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># وبدون هذا السطر لا يمكن حتى تنفيذ ping من الراوتر</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># إلى الأجهزة المتصلة ببطاقة DMZ.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> keep</span><span style="color:#79740E;--shiki-dark:#B8BB26"> state</span></span></code></pre> <p>والآن نصل إلى ترجمة عناوين الشبكة (NAT)؛ وهي الموضع الذي يتولّى فيه الموجّه نقل الرزم بين مقاطع الشبكة المختلفة — وفي مثالنا هذا من شبكتنا الداخليّة إلى شبكة الإنترنت الخارجية — ثم إعادة توجيه الردود الواردة من الإنترنت إلى صاحب الطلب في الداخل. وأفضّل استعمال الوسيط <code>:network</code> ، إذ يُعبّر عن الشبكة (أو الشبكات) المتصلة بالبطاقة نفسها، كما أفضّل التصريح والتخصيص بقاعدة واحدة لكل مقطع ذي صلة.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># NAT — ترجمة عناوين الشبكة </span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26">:network</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span><span style="color:#79740E;--shiki-dark:#B8BB26"> nat-to</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> ($ext_if)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26">:network</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span><span style="color:#79740E;--shiki-dark:#B8BB26"> nat-to</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> ($ext_if)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> out</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26">:network</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span><span style="color:#79740E;--shiki-dark:#B8BB26"> nat-to</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> ($ext_if)</span></span></code></pre> <p>يتولّى مُصفي الرُزم (PF) تتبّع حركة البيانات كلّها؛ فإذا طلب متصفّحٌ في شبكة البالغين صفحةً من موقع على الإنترنت، فإن جواب خادم الويب يعود عبر بطاقتنا الخارجيّة، ثم يُوجَّه إلى بطاقة شبكة البالغين الداخليّة، ومنها مباشرةً إلى الحاسب الذي أنشأ الطلب ابتداءً.</p> <p>ثم نصل أخيرًا إلى قسم إعادة التوجيه في قواعدنا؛ وفيه نتيح لحركةٍ قادمة من الإنترنت من الخارج أن تُوجَّه إلى خادم الويب العلني الموضوع على بطاقة DMZ. وينبغي — بطبيعة الحال — ترك هذا القسم إن لم تكن لديك خوادم عامة تحتاج إلى إعادة توجيه. وفي هذا المثال لا نتيح إلا حركة IPv4.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># Redirects</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># خادم الويب لدينا هو 192.168.3.2 — دع الإنترنت يصل إليه.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#076678;--shiki-dark:#83A598"> $ext_if</span><span style="color:#79740E;--shiki-dark:#B8BB26"> port</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 80</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 443</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rdr-to</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.2</span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--red)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰀦</span> <!--[--><!---->دائماً يجب وضع قواعد اعادة التوجيه في آخر القواعد.<!--]--></div></div><!----> <p>وبذا نكون قد أنهينا إعدادنا الأساسي لقواعد جدار الحماية.</p> <h3>قائمة السماح الخاصة بالأطفال</h3> <p>إذا أردت حجب الإنترنت كاملًا عن الأطفال مع استثناء عدد محدود من المواقع أو ربما بعض خوادم الألعاب، فعليك أولًا معرفة العناوين الشبكية (IP) الخاصة بهذه الخدمات، ومن ثم إنشاء قائمة سماح (pass list) باستخدام تلك العناوين.</p> <p>وإذا كان الأمر يتعلق بموقع واحد يملك عنوان شبكي واحدًا، فسهل جدًا، ويمكنك فعل ذلك بهذه القاعدة التي توضع في آخر قسم إعدادات شبكة الأطفال (مع استبدال x.x.x.x بالعنوان الـشبكي المناسب):</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># إعداد شبكة الأطفال</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># اسمح لأي حاسب أو جهاز متصل بكرت شبكة الأطفال بإرسال</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># طلبات «نظام اسماء النطاقات».</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> inet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> udp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> any</span><span style="color:#79740E;--shiki-dark:#B8BB26"> port</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 53</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># امنع طلبات «نظام اسماء النطاقات» التي لا تكون موجهة إلى خادم «نظام اسماء النطاقات» الخاص بنا.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> return</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> proto</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#79740E;--shiki-dark:#B8BB26"> udp</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcp}</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> !</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> port</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 53</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 853</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># ثم اسمح لأي حاسب أو جهاز على شبكة الأطفال بالوصول</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># إلى العنوان الـشبكي IP x.x.x.x فقط.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> x.x.x.x</span></span></code></pre> <p>فإن كان للموقع أكثرُ من عنوانٍ شبكيّ، وجب عليك استقصاء جميع العناوين. فكثيرًا ما يكشفُ طلبُ الاستعلام عن النطاق دفعةً واحدةٍ جميعَ العناوين ذات الصلة، كأن تُجري مثلًا: <code>$ dig example.com ANY</code> أو <code>drill example.com ANY</code>. غيرَ أنّ الأمر لا يكون دومًا بهذا اليسْر؛ ففي أحايين أخرى يلزمك تكرارُ الاستعلام في أوقاتٍ متباينة من اليوم، حتى تستوفي نطاق العناوين كلَّه. ولَكَ أن تُنيب عن نفسك سكربتًا آليًّا ينهض بهذه المهمّة، فيتولّى جمعها على مَهَلٍ بلا عناء.</p> <p>وقد يحدثُ أحيانًا أن تحتاج إلى مراسلة الجهة المالكة للخدمة، لتسأل عمّا إذا كان بالإمكان تزويدُك بنطاق العناوين الشبكيّة المطلوب لإدراجه في قائمة السماح. فبعضُ الشركات تُتيح تلك المعلومات على الملأ، بينما تأبى نشرها أخرى خشيةَ إساءة استعمالها. فإذا تبيَّن لك نطاقُ العناوين واعتمدتَه، أمكنك أن تضعه في <code>table</code> ضمن مصفي الرزم وأن تبني عليه القاعدة.</p> <p>وفي هذا المثال نُضيف جدولًا جديدًا إلى قسم الجداول في القواعد، ثم نُعدِّل إعدادات قسم شبكة الأطفال:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># الجداول</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">#---------------------------------#</span></span>
<span class="line"></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">...</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># قائمة السماح للأطفال</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">table</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">passlis</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">t</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#79740E;--shiki-dark:#B8BB26"> x.x.x.x</span><span style="color:#79740E;--shiki-dark:#B8BB26"> y.y.y.y</span><span style="color:#79740E;--shiki-dark:#B8BB26"> z.z.z.z</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span></code></pre> <p>ثم نغيّر في قسم الأطفال السطر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#79740E;--shiki-dark:#B8BB26"> x.x.x.x</span></span></code></pre> <p>إلى:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">passlis</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">t</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <p>وليس من اليسير دائمًا جمعُ جميع العناوين المطلوبة دفعةً واحدة وإيداعُها في قائمة السماح؛ غير أنّ بوسعك — عبر مراقبة الشبكة، باستخدام أدواتٍ مثل <a href="https://man.openbsd.org/tcpdump" rel="nofollow">tcpdump</a>، أثناء محاولة اللعبة الاتصالَ بخادمها — أن تُشيّد قائمةً صالحةً، شيئاً فشيئاً. قد سلكتُ هذا المسلك مع خوادم تسجيل الدخول الخاصة بـ Minecraft، ومع عددٍ من الألعاب الشبكية الأخرى، فكان نافعًا في بناء قوائم سماح عملية ودقيقة.</p> <h4>إستعمال جدول دائم</h4> <p>ومنهجٌ آخر في جمع العناوين الشبكية اللازمة لقائمة السماح أن تُنشئ جدولًا دائمًا (<a href="https://man.openbsd.org/pf.conf#TABLES" rel="nofollow">persistent table</a>)، وتستعين به مع الملف <code>/etc/rc.local</code> واستعلامات أسماء النطاقات. ويُنفَّذ الملف <code>/etc/rc.local</code> بعد تشغيل مصفي الرزم، وبذلك لا تؤثر مشكلات حلّ أسماء النطاقات في تحميل القواعد أو استقرار عمل مُصفي الرزم.</p> <p>فإذا أردتَ استعمال جدولٍ دائم، فأضِفه إلى قسم الجداول في الملف <code>/etc/pf.conf</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">table</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">passlis</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">t</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> persist</span></span></code></pre> <p>وفي قسم شبكة الأطفال، يبقى من اللازم السماح بحركة البيانات المتجهة إلى قائمة السماح، كما في المثال السابق:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pass</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">passlis</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">t</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <p>ثم أضف إلى الملف <code>/etc/rc.local</code> الأمر الآتي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -t</span><span style="color:#79740E;--shiki-dark:#B8BB26"> passlist</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -T</span><span style="color:#79740E;--shiki-dark:#B8BB26"> add</span><span style="color:#79740E;--shiki-dark:#B8BB26"> example.com</span></span></code></pre> <p>حيث إن <code>example.com</code> هو اسم النطاق الذي تريد من مصفي الرزم استخراج عناوينه الشبكية وإضافتها إلى الجدول.</p> <p>وإذا تعذّر على الأطفال الوصول إلى خدمةٍ ما بسبب تغيّر عناوينها الشبكية، أمكنك تسجيل الدخول إلى جدار الحماية وتحديث الجدول يدويًا بإضافة العناوين الجديدة عبر تنفيذ الأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -t</span><span style="color:#79740E;--shiki-dark:#B8BB26"> passlist</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -T</span><span style="color:#79740E;--shiki-dark:#B8BB26"> add</span><span style="color:#79740E;--shiki-dark:#B8BB26"> examples.com</span></span></code></pre> <p>ولعرض العناوين الشبكية الموجودة في قائمة السماح، استعمل الأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -t</span><span style="color:#79740E;--shiki-dark:#B8BB26"> passlist</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -T</span><span style="color:#79740E;--shiki-dark:#B8BB26"> show</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">74.6.143.25</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">74.6.143.26</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">74.6.231.20</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">74.6.231.21</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">98.137.11.163</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">98.137.11.164</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">216.58.208.110</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">2001:4998:24:120d::1:0</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">2001:4998:24:120d::1:1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">2001:4998:44:3507::8000</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">2001:4998:44:3507::8001</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">2001:4998:124:1507::f000</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">2001:4998:124:1507::f001</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">2a00:1450:400e:80e::200e</span></span></code></pre> <p>وأخيرًا، إذا جمعت عددًا كافيًا من العناوين الشبكية وأردت الاحتفاظ بها على نحوٍ دائم، فبوسعك وضعها في ملف مستقل، إذ يستطيع الجدول الدائم أيضًا تحميل محتواه من ملف:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">table</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">passlis</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">t</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> persist</span><span style="color:#79740E;--shiki-dark:#B8BB26"> file</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/etc/pf-passlist.txt</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->لا تُضاف العناوين المدرجة بواسطة الأمر <code>pfctl -T add</code> إلى الملف تلقائيًا؛ إذ إن هذا الأمر يُعدِّل الجدول المقيم في الذاكرة فحسب، ولا يكتب شيئًا إلى القرص. أما إذا كان الجدول يُحمَّل من ملف، فينبغي تحديث ذلك الملف يدويًا بمحرّر نصوص كلما أردت إضافة عناوين جديدة أو حذف عناوين قديمة.<!--]--></div></div><!----> <h3>تحميل القواعد</h3> <p>بعد الفراغ من إعداد القواعد، اختبر سلامتها بالأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -nf</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/pf.conf</span></span></code></pre> <p>فإذا لم تظهر أخطاء، فحمِّل قواعد جدار الحماية بإزالة الخيار <code>-n</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -f</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/pf.conf</span></span></code></pre> <p>وللاطلاع على القواعد بعد أن يفسِّرها مُصفي الرزم ويحوِّلها إلى صيغتها الداخلية، استعمل الأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -s</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rules</span></span></code></pre> <h3>لا تُحاوِل حجب «معيار تهيئةُ المُضيف الآلية DHCP»</h3> <p>على سبيل التنبيه، لا يمكنك حجب حركة DHCP المتجهة إلى <code>dhcpd</code> (المنفذ 67) باستعمال مصفي الرزم، ذلك لأن كلًّا من <a href="https://man.openbsd.org/dhcpd" rel="nofollow">dhcpd</a> وdhclient في نظام «أوبن بي إس دي» يستعملان — افتراضيًّا — <a href="https://man.openbsd.org/bpf" rel="nofollow">bpf</a> في إرسال الرزم واستقبالها. وهذا يعني أنّ الرزم تُرسَل وتُستقبَل قبل أن يباشر مصفي الرزم عمله.</p> <p>ولأن <code>bpf</code> يوفّر وصولًا مباشرًا إلى طبقة ربط البيانات (Data Link Layer) دون الاعتماد على بروتوكولٍ بعينه، فإنه يستطيع رؤية جميع الرزم المارّة عبر بطاقة الشبكة، حتى تلك الموجَّهة إلى أجهزة أخرى على الشبكة.</p> <p>ولهذا السبب لا تنطبق قواعد التصفية على حركة DHCP بالطريقة المعتادة التي تنطبق بها على بقية معيارات TCP/IP.</p> <p>ولمن أراد مزيدًا من التفصيل، فليراجع المناقشة الموسومة ب«<a href="https://misc.openbsd.narkive.com/7SGmbxm0/allow-dhcpd-with-pf" rel="nofollow">allow dhcpd with pf»</a> في قوائم «أوبن بي إس دي» البريدية، ففيها تعليقـات نافعة تشرح هذا السلوك وأسبابه.</p> <h3>الرصد والتسجيل (Logging and monitoring)</h3> <p>وهذا مثالٌ من مخرجات سجلّ مصفي الرزم يُظهِر محاولاتٍ محجوبةً للوصول إلى بطاقة الشبكة الخارجية في أحد إعداداتي. وقد نقّيتُ المخرجات قليلًا وحذفتُ بعض البيانات المحدّدة، كما أنّ العنوان 0.0.0.0 ليس — بطبيعة الحال — عنواني العلني، ولكن لا شكّ أنّك أدركت ذلك آنفًا ;)</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcpdump</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -n</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -e</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -ttt</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -r</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/log/pflog</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:11:12</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.3422:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1501043655:1501043655</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:11:12</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.3481:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 311078394:311078394</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:11:31</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 176.214.44.229.25197</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.23:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2084440900:2084440900</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 33620</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:11:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.3431:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2774981044:2774981044</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:11:43</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 81.68.114.52.17191</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.23:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1346864438:1346864438</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 26375</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:12:08</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 193.27.229.26.53865</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.443:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1057596009:1057596009</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:12:31</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.4186:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1233742605:1233742605</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:12:44</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 74.120.14.70.65509</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.9125:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1836577847:1836577847</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">mss</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 146</span><span style="color:#427B58;--shiki-dark:#8EC07C">0></span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> [tos </span><span style="color:#79740E;--shiki-dark:#B8BB26">0x20]</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:12:44</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.4128:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2112968453:2112968453</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:13:15</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.3669:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 3627248539:3627248539</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:13:19</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.3654:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 3889665614:3889665614</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:13:29</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.129.42239</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.4997:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2249816896:2249816896</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:13:37</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.3612:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 3797528151:3797528151</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:14:03</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 190.207.89.17.64372</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.445:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1097568353:1097568353</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 8192</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">mss</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1460,nop,wscale</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2,nop,nop,sackO</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">K</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (DF)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:14:15</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.4219:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2834775769:2834775769</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:14:39</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.3702:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1855726637:1855726637</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:14:39</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rule</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 14/</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">match</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 45.129.33.4.45980</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0.4210:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 3052103070:3052103070</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1024</span></span></code></pre> <p>على ما ترى، فالسجل مزدحمٌ بالحركات، مع أنّه لا توجد في ذلك الإعداد أيةُ خدمةٍ مكشوفةٍ إلى الإنترنت.</p> <p>ويمكنك كذلك مراقبة مصفي الرزم آنيًّا بالأمر التالي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcpdump</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -n</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -e</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -ttt</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -i</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pflog0</span></span></code></pre> <h2>خدمة أسماء النظاقات (DNS)</h2> <p><a href="https://ar.wikipedia.org/wiki/%D9%86%D8%B8%D8%A7%D9%85_%D8%A3%D8%B3%D9%85%D8%A7%D8%A1_%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA#%D8%B7%D8%B1%D9%8A%D9%82%D8%A9_%D8%B9%D9%85%D9%84_%D8%A7%D9%84%D9%86%D8%B8%D8%A7%D9%85" rel="nofollow">خدمةُ أسماء النطاقات (DNS)</a> إنما وُضعت لتكون الترجمانَ بين الأسماء والعناوين؛ فهي تُحوِّل اسمَ النطاق إلى عنوانٍ شبكيٍّ أو تُعيده بالعكس. فحين يكتب المرء في المتصفّح «<a href="https://wikipedia.org" rel="nofollow">wikipedia.org</a>» يتولّى خادمُ أسماءٍ مُخَوَّل ترجمةَ هذا الاسم إلى عنوانٍ من عناوين IPv4 — نحو: 91.198.174.192 — أو إلى عنوانٍ من عناوين IPv6 — كـ 2620:0:862:ed1a::1.</p> <p>ولهذه الخدمة وظائفُ أُخَرُ جمّة، منها — على سبيل المثال — تسجيلُ الخوادم البريدية التي يتبعها نطاقٌ معيّن، إن كان له من خادم بريد.</p> <p>وإن كنتَ على نظامٍ شبيهِ بيونكس، فافتح الترمينال، وجَرِّب استعلامَ الاسم يدويًّا بأداة <code>host</code>، على نحوٍ كهذا:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26"> has</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 91.198.174.192</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26"> has</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IPv6</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2620:0:862:ed1a::1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26"> mail</span><span style="color:#79740E;--shiki-dark:#B8BB26"> is</span><span style="color:#79740E;--shiki-dark:#B8BB26"> handled</span><span style="color:#79740E;--shiki-dark:#B8BB26"> by</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 10</span><span style="color:#79740E;--shiki-dark:#B8BB26"> mx1001.wikimedia.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26"> mail</span><span style="color:#79740E;--shiki-dark:#B8BB26"> is</span><span style="color:#79740E;--shiki-dark:#B8BB26"> handled</span><span style="color:#79740E;--shiki-dark:#B8BB26"> by</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 50</span><span style="color:#79740E;--shiki-dark:#B8BB26"> mx2001.wikimedia.org.</span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->إن لم تكن أداة <a href="https://man.openbsd.org/host">host</a> مثبتةً لديك، فقد يلزم — بحسب منصّتك — تثبيتُ حزمة <a href="https://www.isc.org/bind">bind</a> أو <code>dnsutils</code>. ويمكنك استعمال أداة <a href="https://man.openbsd.org/dig">dig</a>(وهي من حزمة <a href="https://www.isc.org/bind">bind</a> أيضًا)، أو <a href="https://linux.die.net/man/1/drill">drill</a> التابعة لـ <a href="https://nlnetlabs.nl/projects/ldns/about">ldns</a><!--]--></div></div><!----> <p>وهذه جملةُ مصطلحاتٍ تُستعمل في عالم DNS:</p> <ul><li><p><code>Forward DNS</code></p> <ul><li>وهو إسنادُ أسماءِ الأجهزة والنطاقات إلى العناوين الشبكية.</li></ul></li> <li><p><code>Reverse DNS</code></p> <ul><li>وهو إسنادُ العناوين الشبكية إلى أسماءِ الأجهزة والنطاقات.</li></ul></li> <li><p><code>Resolver</code></p> <ul><li>هو النظام الذي تستفهمُ منه الآلةُ خادمَ الأسماء عن معلومات المنطقة (zone)، أي هو — من وجهٍ آخر — هو المكوّن البرمجي المسؤول عن إجراء استعلامات «نظام أسماء النطاقات» نيابةً عن التطبيقات.</li></ul></li> <li><p><code>Root zone</code></p> <ul><li>وهي مبدأُ شجرةِ نطاقات الإنترنت؛ فجميعُ المناطق تندرج تحت<a href="https://ar.wikipedia.org/wiki/%D9%85%D9%86%D8%B7%D9%82%D8%A9_%D8%AC%D8%B0%D8%B1_(%D9%86%D8%B8%D8%A7%D9%85_%D8%A3%D8%B3%D9%85%D8%A7%D8%A1_%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA)" rel="nofollow">منطقة الجذر</a>، كما تندرج جميعُ الملفات تحت المسار الجذر / في أنظمة الملفات.</li></ul></li></ul> <p>ومثالُ ذلك في تقسيم المناطق:</p> <ul><li>الرمز <code>.</code> (النقطة) هو الاسمُ الشائع لمنطقة الجذر في الكتب والوثائق.</li> <li>النطاق <code>org.</code> هو نطاقٌ أعلى <a href="https://en.wikipedia.org/wiki/Top-level_domain" rel="nofollow">(TLD)</a> تحت الجذر.</li> <li>النطاق <code>wikipedia.org.</code> يقع تحت النطاق <code>org.</code></li> <li>والمنطقة <code>1.168.192.in-addr.arpa</code> تشير إلى العناوين الشبكية الواقعة ضمن المجال <code>192.168.1.*</code>.</li></ul> <p>فإذا احتاج حاسبٌ على الشبكة إلى حلِّ اسمِ نطاق، عمد المُحَلِّل إلى تقسيم الاسم إلى مقاطعه من اليمين إلى اليسار. فيستعلم أولًا عن نطاق المستوى الأعلى (TLD) عبر خادمٍ جذريٍّ ليحصل على الخادم المخوَّل المسؤول عنه؛ ثم يتابع الاستعلامُ طبقةً بعد طبقة، حتى يبلغَ خادمًا يُعيد الجوابَ النهائي المطلوب.</p> <p>ومع أنّ أيَّ خادمٍ محلِّيٍّ قد يستطيع إنشاء خوادم جذريّةٍ خاصّةٍ به، فإن اصطلاح «خوادم الجذر» يُطلق — في الغالب — على <a href="https://en.wikipedia.org/wiki/Root_name_server#Root_server_addresses" rel="nofollow">الخوادم الجذرية الثلاثة عشر المنطقية التي تُجَسِّد مساحةَ أسماء الجذر</a> لنظام أسماء النطاقات على الإنترنت. ويستعمل المُحَلِّلون ملفًا صغيرًا يُسمّى <code>root.hints</code> — حجمه قرابة 3 كيلوبايت — تصدره <a href="https://en.wikipedia.org/wiki/InterNIC" rel="nofollow">Internic</a>لتهيئة قائمة عناوين تلك الخوادم. وفي برامج كثيرة — مثل Unbound — تكون هذه القائمةُ مضمَّنةً داخل البرنامج نفسه.</p> <p>وعلى قاعدة <a href="https://www.iana.org/domains/root/db" rel="nofollow">بيانات منطقة الجذر (The Root Zone Database)</a> يمكنك الاطلاعُ على تفاصيل تفويض نطاقات المستوى الأعلى، سواءً العامة منها كـ .com و .org، أو نطاقات الدول كـ .uk و .de.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->بما أنّه يمكن الاطلاع على تفاصيل تفويض نطاقات المستوى الأعلى، فقد يظنُّ المرء أنّ بالإمكان النزولُ إلى طبقاتٍ أعمق، والنظرُ في كلِّ نطاقٍ مسجَّلٍ لدى خادم أسماءٍ بعينه. فمثلاً، ما دمنا قادرين على الحصول على قائمة خوادم النطاقات المسؤولة عن النطاق الأعلى <a href="https://www.iana.org/domains/root/db/dk.html">.dk</a> قد نتوقّع أن نقدر على الاستعلامُ من أحد تلك الخوادم عن كامل قاعدة بياناته من الخوادم المخوَّلة، ثم نستعلم من أحد تلك الخوادم عن جميع النطاقات المسجَّلة لديه. غير أنّ «نظام اسماء النطاقات» لا يعمل على هذا النحو. فلا سبيلَ للحصول على الخريطة الكاملة لقاعدة بيانات خادم «نظام اسماء النطاقات» إلا بطريقين اثنين: إمّا أن تكون لك صلاحيةُ الوصول إلى ملفات المنطقة (zone files) ذات الصلة؛ أو أن تُنشئ — مادّيًا — قاعدةَ بياناتٍ عبر فحص حركة مرور «نظام اسماء النطاقات» المارّة بخادمٍ (recursive)، ثم تعيدَ تركيبَ بيانات المناطق استنادًا إلى ما جُمِع من بيانات، إلى أن تكتمل الصورة — وهو أمرٌ من النادر جدًا أن يتحقق كاملًا.<!--]--></div></div><!----> <p>يوجد نوعان أساسيّان من إعدادات خوادم «نظام اسماء النطاقات»:</p> <ul><li><code>Authoritative</code> <ul><li><a href="https://en.wikipedia.org/wiki/Authoritative_name_server" rel="nofollow">أولها الخادمُ الـموثوق (Authoritative)</a> هو الذي يتولّى نشر عناوين النطاقات التي هو مسؤول عنها، فيجيب إجابةً واضحة قاطعة، لأنه صاحبُ الأصل والمرجع.</li></ul></li></ul> <p>وقد يكون خادماً أساسياً (Master) عنده البيانات الأصلية، وقد يكون خادماً تابعاً (Slave) يملك نسخة من تلك البيانات يحصل عليها بالمزامنة مع الخادم الأساسي.</p> <p>والخادم الموثوق لا يجيب إلا بما كُتب وضُبط من مصدرٍ صحيح، كمدير النطاق أو المسؤول عنه.</p> <p>ولكلِّ منطقة «نظام اسماء النطاقات» يجب تعيين مجموعة من الخوادم الموثوقة، وتُسجَّل أسماؤها في النطاق الأعلى عبر سجلات NS. وعندما يجيب الخادم إجابةً نهائية، يضع في ردّه علَماً يسمّى “Authoritative Answer – AA” ليدلّ أنه الجواب الموثوق.</p> <p>ومن أراد التأكد من كون الخادم موثوقاً أم لا، فله أن يستعمل أدوات الشبكة مثل <a href="https://man.openbsd.org/dig" rel="nofollow">dig</a> أو <a href="https://linux.die.net/man/1/drill" rel="nofollow">drill</a> ، فستبيّن له الأداة إن كان الجواب موثوقاً أم لا.</p> <ul><li><code>Recursive</code> <ul><li>وأما الصنفُ الثاني من خوادم نظام الأسماء فهو <a href="https://en.wikipedia.org/wiki/Domain_Name_System#Recursive_and_caching_name_server" rel="nofollow">الخادمُ الـمُستقصي Recursive</a>، ويُعرف أحياناً بخادمِ الذاكرة المؤقّتة أو “DNS Cache”. ووظيفته أن يتولّى حلَّ الأسماء للتطبيقات، فيحمل سؤالَ المستخدم، ويسير به في سلسلة الخوادم الموثوقة حتى يظفر بالجواب التامّ لاسم الشبكة. ثم يحفظ النتيجة في ذاكرته زمناً محدوداً، ليجيب بها إن تكرّر السؤال.</li></ul></li></ul> <p>وأكثرُ مستخدمي الشبكة يعتمدون على خوادم مستقصية عامة، إمّا يوفّرها مزوّد الإنترنت، أو إحدى خدمات «نظام اسماء النطاقات» العامة.</p> <p>ونظريا، تكفي الخوادمُ الموثوقة لقيام الشبكة بأمرها. غير أنّ الاقتصار عليها وحدها يجعل كلَّ استعلام يبدأ من الجذور، ويُلزم كلَّ جهازٍ بامتلاك محلّلٍ قادرٍ على الاستقصاء الكامل، وهو أمر يرهق الشبكة ويكثر به التدفّق. ولهذا جاء دعم الخوادم المستقصية، لتزيد الكفاءة، وتخفّ من حركة «نظام اسماء النطاقات» في أرجاء الإنترنت، وتُسرّع أداء التطبيقات.</p> <p>والاستعلام المستقصي هو ذاك الذي يتكفّل فيه خادمُ «نظام اسماء النطاقات» بالجواب التام، فيسأل الخوادم الأخرى عند الحاجة حتى يتمّ الجواب.</p> <p>وقد يكون الخادِم الواحد جامعاً بين الإعتماد والاستقصاء، فيكون موثوقا ومستقصياً سواءً، غير أنّ أهل الخبرة لا يستحسنون جمعَ هاتين الخصلتين في آنٍ واحد. ذلك أنّ الخوادم الموثوقة ينبغي أن تبقى في متناول جميع العملاء على الدوام، تؤدي جوابها سريعاً بلا تعطيل. أمّا الخوادم المستقصية، فاستعلامُها أطولُ مساراً وأبعدُ رحلة، ولذا يُستحبّ أن يُقتصر نفعُها على جماعةٍ محدودة من العملاء؛ إذ إن فتحَها للعامة يعرّضها لسيلٍ من الطلبات قد ينقلب <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" rel="nofollow">هجوماً مُوزّعاً يحجب الخدمة (DDoS)</a>.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->ولمن أراد مزيدَ بيان، فليُراجع بابَ “كيف يعمل «نظام اسماء النطاقات»” في <a href="https://tldp.org/LDP/nag2/x-087-2-resolv.howdnsworks.html">الفصل السادس من دليل إدارة شبكات لينكس</a>. وليطالع مقال <a href="https://en.wikipedia.org/wiki/Domain_Name_System#Operation">«نظام أسماء النطاقات»</a> في موسوعة ويكيبيديا؛ ففيهما بسطٌ للقول وتفصيل.<!--]--></div></div><!----> <h2>وهاكمُ “Unbound”</h2> <p><a href="https://nlnetlabs.nl/projects/unbound/about/" rel="nofollow">وهو</a> مُستقصٍ لنظام أسماء النطاقات، يحفظُ المعلومة في ذاكرته، ويُصدِّقها ويصونها، وهو مشروعٌ حرٌّ مفتوحُ المصدر، قد جُمعت فيه خصالٌ شتّى:</p> <ul><li>ففيه ذاكرةٌ مُخبِّئة، مع قدرةٍ على استباق الطلب على البنود الشائعة قبل انقضاء أجلها.</li> <li>ويدعم ترحيل الاستعلام عبر “DNS over TLS” مع التحقّق من النطاقات.</li> <li>وكذلك (DNS over HTTPS-DoH).</li> <li>وله خاصية تقليل اسم الاستعلام (Query Name Minimization).</li> <li>والاستفادةُ مما ثَبُتَ من ذاكرةٍ مُصدَّقةٍ بمعايير DNSSEC.</li> <li>ويتيح مناطقَ الإعتماد لنسخةٍ محليّةٍ من نطاق الجذر.</li> <li>DNS64.</li> <li>DNSCrypt.</li> <li>والتحقّقَ بتوقيعات DNSSEC.</li> <li>وامتدادَ عميل EDNS Subnet.</li></ul> <p>وقد صيغ Unbound ليكون سريعاً وأميناً، ينهل من المعايير المفتوحة وخصائص العصر؛ وقد خضع — في أواخر عام 2019 — <a href="https://ostif.org/wp-content/uploads/2019/12/X41-Unbound-Security-Audit-2019-Final-Report.pdf" rel="nofollow">لتدقيقٍ صارمٍ محكم</a>.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--aqua)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰌶</span> <!--[--><!---->«إنّ من أعظم الدوافع إلى اختيار “Unbound” دون غيره من خزّاني الذاكرة البُسَطاء — كـ <a href="https://en.wikipedia.org/wiki/Dnsmasq">dnsmasq</a> مثلاً — أنّك إن تركتَ خيار <code>forward</code> مُهملاً في إعداداته، انطلق Unbound يُخاطب خوادم الجذر رأساً، بأرقام عناوينها المثبتة في ملف <a href="https://www.iana.org/domains/root/files">Root Hints File</a>، غير ملتفتٍ إلى خوادم مزوّد الخدمة، ولا إلى الخوادم العامّة أمثال Google وCloudflare، وما عساه أن يكون من تسجيلٍ أو بيعٍ أو عبثٍ بالبيانات. أمّا الخادم البسيط — كـ dnsmasq — فطريقُه الدهرُ كلّه الإحالةُ إلى غيره؛ بينما يمضي Unbound صاعداً في سُلّم النطاقات من الجذر، حتى يبلغ الخادمَ المُخوَّل الحديثَ باسم النطاق، فيأخذ عنه الجواب اليقين. وبهذا يكون مَن يَعلم حقيقةَ ما تسأل عنه هو نفسُه صاحبَ السّلطة على الجواب، لا واسطةَ بينكما ولا حجاب.»<!--]--></div></div><!----> <div class="callout svelte-1ezppec" style="--callout-color: var(--red)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰀦</span> <!--[--><!---->«فإن كان مزوِّدُ الإنترنت يسلبُ الطرائقَ سلباً، فيعطفُ مسارَ الاستعلامات ويختطفُ رزم أسماءِ النطاقات اختطافاً — فـ Unbound عندئذٍ لا يُغني عنك شيئاً ولا يدفع عنك بأساً. وارجع إلى فصل “اختطاف «نظام اسماء النطاقات»” لتقف على سُبل التثبّت، وتعلمَ كيف تَميز إن كان مسراك يُحرَّف، واستعلامُك يُختَطف.»<!--]--></div></div><!----> <p>في إعدادنا مع Unbound، تمرّ استعلامات «نظام اسماء النطاقات» لنطاق مثل “wikipedia.org” بهذه المراحل:</p> <ol><li>يرسل المتصفح طلبًا إلى النظام يسأل فيه: «ما العنوان الشبكي الخاص بـ wikipedia.org؟».</li> <li>يقوم نظام التشغيل — من خلال إجراءات الـ resolver في مكتبة C — بإرسال الطلب إلى خوادم «نظام اسماء النطاقات» الموجودة في الملف <a href="https://man.openbsd.org/resolv.conf" rel="nofollow">/etc/resolv.conf</a>.</li> <li>يستقبل Unbound الطلب، فيفحص أوّلًا ذاكرة التخزين المؤقت لديه، وإن وجد نتيجة سابقة، يعيدها فورًا، وإن لم يجد، يرسل استعلامًا إلى أحد خوادم الجذر المذكورة في ملف Root Hints ليسأل عن نطاق .org.</li> <li>يرد خادم الجذر بإحالة إلى خوادم النطاق العلوي .org.</li> <li>يرسل Unbound استعلامًا إلى أحد خوادم .org ليعرف الخوادم الموثوقة (authoritative) الخاصة بـ wikipedia.org.</li> <li>يرد الخادم بقائمة الخوادم الموثوقة للنطاق.</li> <li>يرسل Unbound استعلامًا إلى أحد هذه الخوادم الموثوقة طالبًا العنوان الشبكي للنطاق wikipedia.org.</li> <li>يجيب الخادم الموثوق بعنوان IPv4 (نوع A) و/أو عنوان IPv6 (نوع AAAA).</li> <li>يعيد Unbound النتيجة إلى العميل (النظام ثم المتصفح).</li> <li>وإذا كانت ميزة التخزين المؤقت مفعلة، يحتفظ Unbound بالنتيجة مدةً زمنية محددة لاستخدامها في الاستعلامات القادمة.</li></ol> <p>ويمكنك رؤية هذا المسار عمليًا بإجراء تتبّع <code>trace</code> للاستعلام بأداة مثل <a href="https://linux.die.net/man/1/drill" rel="nofollow">drill</a> مع خيار التتبّع <code>-T</code>.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drill</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -T</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      l.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      k.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      e.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      a.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      m.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      h.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      i.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      f.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      c.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      b.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      g.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      d.root-servers.net.</span></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       518400</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      j.root-servers.net.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">    172800</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      a0.org.afilias-nst.info.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">    172800</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      a2.org.afilias-nst.info.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">    172800</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      b0.org.afilias-nst.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">    172800</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      b2.org.afilias-nst.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">    172800</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      c0.org.afilias-nst.info.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">    172800</span><span style="color:#79740E;--shiki-dark:#B8BB26">  IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      d0.org.afilias-nst.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">  86400</span><span style="color:#79740E;--shiki-dark:#B8BB26">   IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      ns0.wikimedia.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">  86400</span><span style="color:#79740E;--shiki-dark:#B8BB26">   IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      ns1.wikimedia.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">  86400</span><span style="color:#79740E;--shiki-dark:#B8BB26">   IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      NS</span><span style="color:#79740E;--shiki-dark:#B8BB26">      ns2.wikimedia.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org.</span><span style="color:#8F3F71;--shiki-dark:#D3869B">  600</span><span style="color:#79740E;--shiki-dark:#B8BB26">     IN</span><span style="color:#79740E;--shiki-dark:#B8BB26">      A</span><span style="color:#8F3F71;--shiki-dark:#D3869B">       91.198.174.192</span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->إنَّ Unbound يملك قدرةَ التثبّت من صِحّة الأجوبة التي تبلُغُه. ويكون ذلك — في الغالب — عبر امتدادات <a href="https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions">أمن نظام أسماء النطاقات DNSSEC</a> أو باستعمال بِتّاتٍ عشوائيةٍ مُشفَّرةٍ بنمط 0x20 داخل نصّ الاستعلام، تُفسدُ على المزوِّرين حِيَلَ الانتحال. وممّا يُطمئن الخاطر أنّه — عدا <a href="https://man.openbsd.org/unbound.conf#use~3">0x20-encoded random bits</a> التي لها سِياقُها الخاص — فإنَّ سائر إعدادات التوثيق والتشديد، كـ <a href="https://man.openbsd.org/unbound.conf#harden~3">harden-glue</a> و <a href="https://man.openbsd.org/unbound.conf#harden~4">وتشديد البيانات المجرَّدة من توقيع DNSSEC</a> ، إنما هي مفعَّلةٌ افتراضاً في Unbound على نظام «أوبن بي إس دي».<!--]--></div></div><!----> <h2>الحجب عبر نظام اسماء النطاقات (DNS)</h2> <p>الحجب عبر «نظام اسماء النطاقات» — ويُعرف كذلك بالتصفية أو تسميم الاستعلامات — هو أن تُزوَّد الجهةُ السائلةُ عن العنوان بإجابةٍ «مزوّرة» مقصودة. فنحن نَحُولُ دون بلوغها العنوانَ الصحيح، إمّا بردٍّ يُصرّح بأنّ النطاق غير موجود <a href="https://tools.ietf.org/html/rfc8020" rel="nofollow">(NXDOMAIN)</a>، أو بتحويل الطلب إلى عنوانٍ آخر غير الذي أراده مالكُ النطاق.</p> <p>وبهذا نستطيع أن نصنع قائمةً — أو قوائم — بالنطاقات المراد حجبها؛ فإذا استفسر المستخدم عن أحدها، لم نُعطه العنوانَ الحقّ، بل نردّ عليه بأنّ «هذا النطاق غير موجود»، فتَنقُطع سُبُلُ التطبيق إلى وجهته المقصودة.</p> <p>ولِلعِلْمِ، فإنّ طلبات «نظام اسماء النطاقات» تُرسَل — في الأصل — إلى المنفذ 53 عبر بروتوكولَي UDP أو TCP. فإذا أعددنا خادماً للأسماء — كما نفعل مع Unbound — وتأكدنا أن كلَّ حركةٍ متجهةٍ إلى هذا المنفذ إمّا تبلغ خادمَنا وإمّا تُحجَب، ضَمِنّا أن تكون جميعُ الردود الصادرة في شبكتنا آتيةً من خادم Unbound الداخلي القائم على موجّهنا العامل بـ «أوبن بي إس دي».</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->لا يُمكن الاتّكال على الحجب عبر «نظام اسماء النطاقات» اعتمادًا كليًّا، إذ يمكن التحايل عليه. فمع أنّ لدينا آليةً متينة، فإنّ في وُسع أيّ شخص استخدام <a href="https://ar.wikipedia.org/wiki/%D8%B4%D8%A8%D9%83%D8%A9_%D8%AE%D8%A7%D8%B5%D8%A9_%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9">خدمة VPN</a> لتجاوز هذا الضبط. ولسنا هنا نسعى إلى بناء منظومةٍ محكمةٍ بنسبة 100% — وإن كُنّا سنتطرّق لاحقًا في هذا الدليل إلى وسائل أعمق — بل غايتُنا أن نزيد وسائل الحماية لأسرِنا قدر المستطاع. ثمّ إنّ منافذ الوصول إلى الإنترنت لا تنحصر في جهازٍ واحد، فهناك الهواتف، وهواتف الأصدقاء، ومنازل الأقارب، والوايفاي العام… وكلّها ينبغي وضعُه في الحسبان.<!--]--></div></div><!----> <h3>NXDOMAIN أم إعادة التوجيه</h3> <p>حين نريد حجب نطاقٍ ما بواسطة نظام أسماء النطاقات، فلدينا أكثر من سبيل. ومن أشهرها أن نُعيد توجيه الاستعلام إلى عنوانٍ محلّي، كالعنوان 127.0.0.1 أو 0.0.0.0، أو أن نردّ على الطالب برسالة NXDOMAIN، ومعناها أنّ النطاق المطلوب غير موجود.</p> <p>وتُعدّ NXDOMAIN استجابةً قياسيةً في نظام أسماء النطاقات، ومعناها أن اسم النطاق المطلوب غير موجود. فإذا عجز خادم «نظام أسماء النطاقات» عن العثور على سجلٍّ للاسم المستعلَم عنه، أعاد هذا الردّ إلى العميل ليُعلمه بأن النطاق غير موجود أصلًا.</p> <p>ولنجرّب ذلك عمليًّا بالاستعلام عن نطاقٍ غير موجود باستعمال الأمر <code>host</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a1b7c3n9m3b0.com</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Host</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a1b7c3n9m3b0.com</span><span style="color:#79740E;--shiki-dark:#B8BB26"> not</span><span style="color:#79740E;--shiki-dark:#B8BB26"> found:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 3</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">NXDOMAIN</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span></span></code></pre> <p>ولأنّ اسم النطاق “a1b7c3n9m3b0.com” غيرُ مسجَّلٍ لدى أحد (على الأقل ساعةَ أكتب هذه السطور)، فإن خادم «نظام أسماء النطاقات» يعيد ردًّا من نوع NXDOMAIN.</p> <p>ويمكننا كذلك استعمال أداة <code>drill</code>؛ إذ تظهر المعلومة الأهم في الحقل <code>rcode</code> ضمن قسم HEADER، فهو الذي يبيّن نوع الاستجابة وما إذا كان النطاق موجودًا أم غير موجود:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drill</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a1b7c3n9m3b0.com</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">;;</span><span style="color:#B57614;--shiki-dark:#FABD2F"> -</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">>></span><span style="color:#79740E;--shiki-dark:#B8BB26">HEADER</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;&lt;-</span><span style="color:#7C6F64;--shiki-dark:#A89984"> opcode:</span><span style="color:#B57614;--shiki-dark:#FABD2F"> QUERY,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcode:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NXDOMAIN,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> id:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 39710</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">…</span></span></code></pre> <p>وإن كنت تفضّل أداة <code>dig</code>، فستجد المعلومة نفسها في الحقل <code>status</code> ضمن قسم HEADER:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dig</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a1b7c3n9m3b0.com</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">;</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;&lt;</span><span style="color:#7C6F64;--shiki-dark:#A89984">>></span><span style="color:#B57614;--shiki-dark:#FABD2F"> DiG</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 9.16.8</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;&lt;</span><span style="color:#7C6F64;--shiki-dark:#A89984">>></span><span style="color:#B57614;--shiki-dark:#FABD2F"> +search</span><span style="color:#79740E;--shiki-dark:#B8BB26"> a1b7c3n9m3b0.com</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; global options: +cmd</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; Got answer:</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NXDOMAIN, id: 48858</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">…</span></span></code></pre> <p>وإجابة NXDOMAIN ليست أوفق من جهة المعايير فحسب، كما بيّنته وثيقة <a href="https://tools.ietf.org/html/rfc8020" rel="nofollow">RFC 8020</a>، بل هي كذلك أوضح في التعبير عن المقصود؛ إذ تُخبر العميل صراحةً بأن النطاق المطلوب غير موجود.</p> <p>أما إرجاع عنوانٍ مثل 127.0.0.1 أو 0.0.0.0 لا تفعلُ أكثرَ من حمل العميلِ السائلِ إلى أن يُحادثَ نفسَه.</p> <p>وربّما ينبري المتصفّح قائلاً: «<code>لا يستطيع Firefox إنشاء اتصال مع الخادوم عند 0.0.0.0</code>»، غير أنّ هذا العنوان إنما يُترجَم إلى جهازنا المحلي، فنظلُّ — من الوجهة التقنية — قادرين على تنفيذ أمر ping عليه، إذ لا يختلف في معناه عن 127.0.0.1:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ping</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.0.0.0</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">PING</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.0.0.0</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (127.0.0.1) 56(</span><span style="color:#B57614;--shiki-dark:#FABD2F">84</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">) bytes of data.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">64</span><span style="color:#79740E;--shiki-dark:#B8BB26"> bytes</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 127.0.0.1:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> icmp_seq=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ttl=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">64</span><span style="color:#79740E;--shiki-dark:#B8BB26"> time=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">0.019</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ms</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">64</span><span style="color:#79740E;--shiki-dark:#B8BB26"> bytes</span><span style="color:#79740E;--shiki-dark:#B8BB26"> from</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 127.0.0.1:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> icmp_seq=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">2</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ttl=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">64</span><span style="color:#79740E;--shiki-dark:#B8BB26"> time=</span><span style="color:#8F3F71;--shiki-dark:#D3869B">0.049</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ms</span></span></code></pre> <p>وعليه، فإنّي أوصيك بأن تجعل جواب NXDOMAIN هو عدّتك الأولى، وهو ما سنجري عليه العمل في هذا الدرس.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--aqua)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰌶</span> <!--[--><!---->إنّ Unbound يُحسنُ التعامل مع القوائم الضخمة من النطاقات المحجوبة بإجابة NXDOMAIN، غير أنّه لا يُحسنُ قَبول القوائم الكبيرة من النطاقات التي يُرادُ إعادةُ توجيهها إلى عنوان معين. <p>فإن رأيت — لسببٍ ما — أن تعتمد أسلوب إعادة التوجيه بدل الحجب بـ NXDOMAIN، فالأوفق أن تُثبّت <a href="http://www.thekelleys.org.uk/dnsmasq/doc.html" rel="nofollow">dnsmasq</a> وتُشغّله بالخيار <code>--addn-hosts=&lt;file></code>، ثم تجعله يُصغي على المنفذ 53، فيتولّى إعادة توجيه النطاقات المحجوبة، بينما يُمرّر سائر الاستعلامات إلى Unbound.</p> <p>وبعد ذلك اضبط Unbound ليُصغي على منفذٍ آخر، مثل 5353.</p> <p>وعلى خلاف Unbound، يستطيع dnsmasq التعامل بكفاءة مع القوائم الكبيرة من عناوين إعادة التوجيه، غير أنّ أداءه يتراجع عند التعامل مع القوائم الضخمة من نطاقات NXDOMAIN. لذلك، إذا كانت غالبية النطاقات المحجوبة لديك ستُعاد بإجابة NXDOMAIN، فالأفضل أن تُوكل هذه المهمّة إلى Unbound، أمّا إذا كنت تعتمد إعادة التوجيه إلى عناوين محلّية على نطاقٍ واسع، فغالبًا ما يكون dnsmasq الخيار الأنسب.</p><!--]--></div></div><!----> <h2>مشكلة «نظام اسماء النطاقات» عبر HTTPS (DoH)</h2> <p>ولمّا طلع علينا <a href="https://en.wikipedia.org/wiki/DNS_over_HTTPS" rel="nofollow">«نظام اسماء النطاقات» عبر HTTPS</a> (DoH)، تعقّد الأمر، وصار الحجبُ «بنظام اسماء النطاقات» أعسرَ . وإن كنتُ أُقدِّر الدافعَ الأوّل للترويج لـ DoH من جهة الخصوصية، فإنّي أراه — من زاوية الأمن — بناءً سيّئ الأساس، ونهجًا في غير موضعه.</p> <p>فمع ازدياد عدد خوادم DoH العامة، صار في مقدور أي تطبيق أن يلجأ إليه، فيتجاوز حجب «نظام اسماء النطاقات» المحلي، سواء على مستوى البيوت أو المؤسّسات، تجاوزَ من وجد منفذًا في سور.</p> <p>وازداد الأمر تعقيدًا حين بدأت بعض التطبيقات والمتصفحات بتضمين إعدادات DoH خاصة بها، أو الاعتماد على مزوّدين محددين لخدمة DoH بصورة مستقلة عن إعدادات نظام التشغيل. ويشتدّ الخطب حين يكون الحديث عن <a href="https://en.wikipedia.org/wiki/Proprietary_software" rel="nofollow">البرمجيات المملوكة (Proprietary Software)</a>، التي لا يُرى مصدرها، ولا تُعدَّل إعداداتها، ولا يُتحكَّم في خيارات DoH فيها.</p> <p>ولهذا، لم نعد — في زمن DoH — قادرين على الاكتفاء بحجب النطاقات، كالإعلانات والمواقع الفاحشة، بل صار لزامًا علينا أن نشرع كذلك في حجب خوادم DoH العامّة على مستوى جدار الحماية. غير أنّ هذا المسلك ليس هيّنًا؛ إذ يتطلب المحافظة على قوائم متجددة لعناوين تلك الخوادم، وهي قوائم تتغير باستمرار.</p> <p>أمّا الاحتفاظ بقائمة بخوادم DoH غير المعروفة — والتي قد تستخدمها برمجيّات مملوكة أو <a href="https://en.wikipedia.org/wiki/Internet_of_Things" rel="nofollow">عتاد ذكي (IoT)</a> ببرمجيات خفيّة — فذاك أمرٌ يكاد يكون مستحيلًا.</p> <p>وزِد على ذلك أنّ DoH كان وبالًا ثقيلًا على كاهل المؤسّسات، إذ أتاح التحايل على إعدادات «نظام اسماء النطاقات» المفروضة مركزيًا. وبذلك صار من العسير، بل من المتعذّر، تصفية وحجب الإعلانات والمحتوى الفاحش -كالذي نبنيه في هذا الدليل-، كما غدا من المستحيل على مديري الأنظمة مراقبة إعدادات «نظام اسماء النطاقات» عبر أنظمة التشغيل المختلفة لمنع هجمات <a href="https://ar.wikipedia.org/wiki/%D8%A7%D8%AE%D8%AA%D8%B7%D8%A7%D9%81_%D9%86%D8%B8%D8%A7%D9%85_%D8%A3%D8%B3%D9%85%D8%A7%D8%A1_%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA" rel="nofollow">اختطاف «نظام اسماء النطاقات»</a> . ووجودُ عدّة تطبيقات، لكلٍّ منها إعدادات DoH خاصّة به، لكابوسٌ لا يُطاق.</p> <p>ولم يقف الضرر عند هذا الحدّ؛ إذ عبث DoH بتحليل الشبكة ومراقبة حركة «نظام اسماء النطاقات» لأغراضٍ أمنيّة، فطمس المعالم وغطّى الآثار. وفي عام 2019 ظهر Godlua، وهو برنامج خبيث من فئة بوتات حجب الخدمة (DDoS) على لينكس، كأوّل <a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9_%D8%AE%D8%A8%D9%8A%D8%AB%D8%A9" rel="nofollow">برمجية خبيثة</a> تُشاهَد وهي <a href="https://www.zdnet.com/article/first-ever-malware-strain-spotted-abusing-new-doh-dns-over-https-protocol/" rel="nofollow">تستعمل DoH لإخفاء حركة «نظام اسماء النطاقات»</a> الخاصة بها.</p> <p>ثم إنّ الأهمّ — وربما الأخطر — أنّ <strong>DoH لا يمنع تتبّع المستعملين</strong> كما يُروَّج له. فبعض أجزاء اتصال HTTPS ما تزال غير مُعمّاة، مثل <a href="https://en.wikipedia.org/wiki/Server_Name_Indication#Security_implications" rel="nofollow">حقول SNI</a> (وإن كانت <a href="https://blog.mozilla.org/security/2018/10/18/encrypted-sni-comes-to-firefox-nightly/" rel="nofollow">في طريقها إلى التحسين</a>)، و<a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84_%D8%A3%D9%88%D8%B6%D8%A7%D8%B9_%D8%A7%D9%84%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA_%D8%B9%D9%84%D9%89_%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA" rel="nofollow">اتصالات OCSP</a>، ناهيك عن <strong>العناوين الشبكية للوجهة</strong> ، وهي — في رأيي المتواضع — جوهر الاتصال وأخطر ما ينبغي ستره وإخفاؤه.</p> <p>أمّا من كانت الخصوصية عنده ضرورة لا ترفًا — كصحفيٍّ يعيش في بلدٍ تُنتهك فيه الحقوق — فلا ينبغي له أن يطمئن إلى DoH ولا أن يتّكئ عليه. فالعنوان الشبكي للخادم المقصود لا يمكن إخفاؤه بـDoH، مهما أُحكمت تعمية محتوى الحركة نفسها. ومن أراد حقًّا تعمية الاتصال وحمايته، فلا بدّ له من نهجٍ آخر غير هذا النهج.</p> <p>وهنا يثور العجب في النفس: من ذا الذي رأى في DoH فكرةً سديدة من الأصل؟ أكان غافلًا عن أبجديات الاتصال عبر HTTPS؟ أم لعلّ الدافع كان أجندةً دفعتها شركات «نظام اسماء النطاقات» خاصّة، كـGoogle وCloudflare، ممن ينتفعون بتجميع مزيدٍ من بيانات المستخدمين؟</p> <p>يزعم بعض مزوّدي «نظام اسماء النطاقات» العموميين أنّ DoH، من زاوية الخصوصية، أرجح من بدائله مثل <a href="https://en.wikipedia.org/wiki/DNS_over_TLS" rel="nofollow">DNS over TLS (DoT)</a>، إذ تُدفن استعلامات «نظام اسماء النطاقات» داخل السيل الأعظم من حركة HTTPS. وهذا — وإن قلّل من رؤية مديري الشبكات — يمنح المستخدم قدرًا أوفر من الخصوصية.</p> <p>هذه الرسالة في حقيقتها مُلتبسة، بل وفيها إشكال. نعم، قد يُخفى طلب اسم النطاق الأوّلي داخل حركة HTTPS، غير أنّ العنوان الشبكي المقصود الذي يُرجعه خادم DoH لا يُخفى. فما إن ينتقل تطبيق العميل إلى زيارة ذلك العنوان، حتى يُسجَّل عنوانا المصدر والوجهة على مستوى مزوّد الإنترنت، وربما على مستويات أخرى كذلك.</p> <p>وصحيحٌ أنّه لا يمكن، للوهلة الأولى، الجزم باسم النطاق الذي يقصده المستخدم على الخادم الوجهة، ولا سيّما إن كان ذلك الخادم يستضيف عدّة نطاقات على عنوان شبكي واحد؛ غير أنّ هذا الأمر ليس مستحيلًا ولا عسيرًا.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->ستجد في الملحق قسمًا بعنوان فحص Inspecting DNS over HTTPS (DoH)، نعرض فيه مثالًا عمليًا يبيّن كيف ينكشف العنوان الشبكي المقصود ضمن تواصل DoH. كما ستجد قسمًا آخر بعنوان «حجب نظام اسماء النطاقات عبر HTTPS (DoH)» ، نستخدم فيه مُصفي الرزم لحجب خوادم DoH العمومية المعروفة.<!--]--></div></div><!----> <h2>إعداد Unbound</h2> <h3>الإعدادات الأساسية</h3> <p>إنّ إعداد Unbound من أيسر الأمور؛ إذ جاء محمّلًا بإعدادات افتراضية حسنة، ومسنودًا بتوثيقٍ وافٍ لا يترك لطالب العلم عذرًا. وقبل أن نشرع في العمل، أُشير عليك أن تُطالع كُتيّبات «أوبن بي إس دي» لكلٍّ من: <a href="https://man.openbsd.org/unbound" rel="nofollow">unbound</a>و <a href="https://man.openbsd.org/unbound-checkconf" rel="nofollow">unbound-checkconf</a> و <a href="https://man.openbsd.org/unbound.conf" rel="nofollow">unbound.conf</a>.</p> <p>ولمّا كان Unbound يعمل في «أوبن بي إس دي» داخل بيئةٍ معزولة <a href="https://ar.wikipedia.org/wiki/Chroot" rel="nofollow">chrooted</a>، فإن ملف الإعداد <code>unbound.conf</code> لا يستقرّ في <code>/etc</code> كما هو الشأن في غيره من الأنظمة، بل مقامه في: <code>/var/unbound/etc/</code>.</p> <p>فابدأ بنسخ ملف إعداد Unbound الحالي، تمهيدًا للتعديل والبناء عليه.:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> mv</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/etc/unbound.conf</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/etc/unbound.conf.backup</span></span></code></pre> <p>ثم استعمل ما تحبه من محررات النصوص وانشئ ملف <code>/var/unbound/etc/unbound.conf</code> جديد، واملأه بالتالي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">server:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # التسجيل (Logging).</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # جُعلت أسطر التسجيل مُعلّقة،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # لأنّ تفعيله وإن كان نافعًا في التتبّع والتشخيص، فإنّه يُثقِل الخادم ويُبطِئه.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # فإن دعت الحاجة، رُفِع الحجاب عن هذه الأسطر، وإلا فتركها أسلم.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # verbosity: 2</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # log-queries: yes</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # log-replies: yes</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # log-tag-queryreply: yes</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # log-local-actions: yes</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    interface:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 127.0.0.1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    interface:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    interface:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    interface:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.1</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # وإن أردتَ أن تُغيّر المنفذ، فالسطر المعلّق يبيّن لك السبيل،</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # بأن تُقرَن العنوان برقم المنفذ اقترانًا صريحًا.</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # interface: 127.0.0.1@5353</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # تحكم بمن يريد الوصول.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    access-control:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0.0.0.0/0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> refuse</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    access-control:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ::0/0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> refuse</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    access-control:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 127.0.0.0/8</span><span style="color:#79740E;--shiki-dark:#B8BB26"> allow</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    access-control:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ::1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> allow</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    access-control:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.1.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> allow</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    access-control:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.2.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> allow</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    access-control:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.3.0/24</span><span style="color:#79740E;--shiki-dark:#B8BB26"> allow</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # رفض الإستعلام عن "id.server" و "hostname.bind".</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    hide-identity:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> yes</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # رفض الإستعلام عن "version.server" و "version.bind".</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    hide-version:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> yes</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # ميزة حسنة، بها يجدد ما في الذاكرة، فتجاب الطلبات سريعا، ولا ينتظر انقضاء الصلاحية.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    prefetch:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> yes</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # هذه عناوين داخلية لا يعامها معاملة عناوين الإنترنت العامة.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    private-address:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.0.0/16</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    # نتحقق من DNSSEC.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    auto-trust-anchor-file:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/var/unbound/db/root.key</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># نفعل أمر unbound-control.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">remote-control:</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    control-enable:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> yes</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    control-interface:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/run/unbound.sock</span></span></code></pre> <p>وقد علّقتُ على الخيارات المتقدّمة آنفًا، فإن احتجتَ إلى مزيد بيان، أو أردتَ الوقوف على سرّ كل توجيهٍ ودقيق معناه، فارجع إلى كُتيّب <a href="https://man.openbsd.org/unbound.conf" rel="nofollow">unbound.conf</a>.</p> <p>والتسجيل (Logging) في Unbound يكون ـ افتراضًا ـ إلى syslog، حيث تجتمع أخبار النظام وتُدوَّن آثاره. فإن لم يُرضِك ذلك، وأحببتَ أن يكون للخادم سجلٌّ خاص به، مستقلٌّ لا يختلط بغيره، فلك أن تنشئ ملفّ تسجيل داخل بيئة العزل (chroot) الخاصة بـ Unbound، ثم تأمره أن يكتب فيه.:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> mkdir</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/log</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> touch</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/log/unbound.log</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> chown</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -R</span><span style="color:#79740E;--shiki-dark:#B8BB26"> root._unbound</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/log</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> chmod</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -R</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 774</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/log</span></span></code></pre> <p>ثمّ اضف الخيارات التالية في قسم التسجيل (Logging) في ملف <code>unbound.conf</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">logfile:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/log/unbound.log</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">use-syslog:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> no</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">log-time-ascii:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> yes</span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->لا نكتب المسار الكامل لملف لأن Unbound يعمل داخل بيئة عزل (chroot). فحين نحدّد خيار <code>logfile</code> كما ذُكر آنفًا، فإنّ ملفّ التسجيل يستقرّ في <code>/var/unbound/log/unbound.log.</code><!--]--></div></div><!----> <p>ثمّ أعد تشغيل Unbound:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> restart</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound</span></span></code></pre> <p>وفي الإعدادات آنفًا، قد أذنتُ لـ Unbound أن يُنصت على الواجهة المحلية 127.0.0.1، كي يتيسّر لتطبيقات النظام نفسها أن تسأل وتستفهم إن دعت الحاجة. فليس كل سؤال يُقصد به الجوار، ولا كل طلب يُبعث إلى الخارج. وأمّا في ملفّ <code>/etc/resolv.conf</code> على موجّه «أوبن بي إس دي»، فقد قيّدتُ القلم وكتبتُ اسم خادم Unbound خاصّتنا وحده، إذ لا رغبة لي أن يستجير شيءٌ على هذا الموجّه بخوادم مزوّد الإنترنت. فبهذا، تكون الاستفسارات كلّها مردودةً إلى خادمنا، محفوظةً في نطاقنا، لا تتيه في فضاء المزوّد:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">nameserver</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 127.0.0.1</span></span></code></pre> <p>وإن كنتَ تستعمل «تهيئةُ المُضيف الآلية» للحصول على العنوان الشبكي للكرت الخارجيّ (المتّصل بمودِم المزوّد أو بموجّهه)، فاحذر أن يعبث <a href="https://man.openbsd.org/dhcpleased" rel="nofollow">dhcpleased</a> بملفّ <code>/etc/resolv.conf</code> فيبدّل ما ثبّتناه. فحرّر إذًا ملفّ <code>/etc/dhcpleased.conf</code>، وزِد فيه ما يَحجز هذا الباب ويمنع التغيير، وذلك بإضافة السطر الآتي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">interface</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ignore</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dns</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span></span></code></pre> <p>وبذلك نضمن ألّا يُذكر خادمُنا المحليّ وحده، فلا يندسّ بيننا وبين أسمائنا خادمٌ غريب.</p> <p>ولتشغيل Unbound وتمكينه:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> enable</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound</span></span></code></pre> <p>وكلّما بدّلتَ شيئًا من إعدادات Unbound، فلك أحد طريقين، إمّا أن تعيد تشغيله إعادةً كاملة بالأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> restart</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound</span></span></code></pre> <p>أو تكتفي بأن تعيد تحميل الإعدادات من جديد دون إيقاف الخدمة، مع تنقية الذاكرة المخبّأة في الوقت نفسه، وذلك بالأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound-control</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reload</span></span></code></pre> <p>وإن أردت أن تطّلع على الإعدادات التي أُطلق بها Unbound عند بدء تشغيله ـ وهذا جارٍ على سائر الخدمات في «أوبن بي إس دي» ـ فلك أن تستعلم عنها بالأمر الآتي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> get</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound</span></span></code></pre> <p>وإن أحببتَ أن تستخرج شيئًا من الإحصاءات، فلك أن تُجري الأمر الآتي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound-control</span><span style="color:#79740E;--shiki-dark:#B8BB26"> stats_noreset</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">thread0.num.queries</span><span style="color:#79740E;--shiki-dark:#B8BB26">=2056</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">thread0.num.queries_ip_ratelimited</span><span style="color:#79740E;--shiki-dark:#B8BB26">=0</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">thread0.num.cachehits</span><span style="color:#79740E;--shiki-dark:#B8BB26">=678</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">thread0.num.cachemiss</span><span style="color:#79740E;--shiki-dark:#B8BB26">=1378</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">thread0.num.prefetch</span><span style="color:#79740E;--shiki-dark:#B8BB26">=15</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">thread0.num.expired</span><span style="color:#79740E;--shiki-dark:#B8BB26">=0</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">…</span></span></code></pre> <p>بوسعك كذلك أن تستخرج تفريغًا كاملًا من الذاكرة المخبأة (الكاش):</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound-control</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dump_cache</span><span style="color:#427B58;--shiki-dark:#8EC07C">|</span><span style="color:#B57614;--shiki-dark:#FABD2F">less</span></span></code></pre> <p>وإن خطر ببالك أن تعرف أيَّ خَدَمَةِ الأسماء يقصدها Unbound، ولأيِّ نطاقٍ يتوجّه بالسؤال:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound-control</span><span style="color:#79740E;--shiki-dark:#B8BB26"> lookup</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span></code></pre> <p>وإن أدت مسح الذاكرة المخبأة لمجال معين، فعليك بالأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound-control</span><span style="color:#79740E;--shiki-dark:#B8BB26"> flush</span><span style="color:#79740E;--shiki-dark:#B8BB26"> example.com</span></span></code></pre> <p>وإن اردت ان تعرف بقية الخيارات فألقِ نظرة على كُتيّب <a href="https://man.openbsd.org/unbound-control" rel="nofollow">unbound-control</a>.</p> <h3>تجاوز قيم TTL المتدنّية حدّ السخف</h3> <p>واعلم أنّ من أعظم ما أزعج أهل الشبكات في هذا الزمان أن ترى أقوامًا يضعون لقيم TTL أرقامًا هزيلة، لا تكاد تبلغ ستين ثانية! وقد صار هذا، لسببٍ لا يُدرى، كأنه موضة العصر.</p> <p>ومكمن البلاء في TTL القليل، أنّه يُفرغ التخزين المُخبأ من معناه. فالاستعلام لا يُنتفع بالإجابة المخزّنة إلا ما دامت مدة الـ TTL قائمة، فإذا انقضت، عاد يسأل من جديد، وكأن شيئًا لم يكن. ومع أنّ المعايير (RFCs) توجب احترام قيمة الـ TTL، فإن هذه القيم المتدنية تجعل نظام «نظام اسماء النطاقات» بطيئًا غير كفء، كثير الطلب، قليل النفع. ولهذا أوصي ـ عن تجربة وبصيرة ـ أن تُبطِل هذا العبث، وتفرض حدّك الأدنى بنفسك، فتجعل الـ TTL ساعةً كاملة. وزد على ذلك تحسينًا آخر، وهو أن تُقدِّم الإجابة القديمة للعميل فورًا، ثم تُحدِّثها في الخلفية، بدل أن ينتظر السائل حتى يتم التحديث.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">cache-min-ttl:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 3600</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">serve-expired:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> yes</span></span></code></pre> <p>إحدى المشكلات في زيادة TTL: يُحتمل أن يتغيّر عنوان النطاق، فتبقى عالقًا بإجابة قديمة في الذاكرة، وهذا واردٌ لكنه نادرٌ في العمل. واحتمال الوقوع في سجلٍّ قديم ضئيل، لا يُقاس بما تكسبه من سرعةٍ، وكفاءةٍ، وحُسن استغلالٍ للكاش. ولعمري، إن جعل الحد الأدنى للـ TTL ساعةً واحدة صفقةٌ رابحة، يغتفر فيها هذا الاحتمال اليسير في سبيل منفعةٍ عظيمة.</p> <h3>هلمّ بنا نصدّ النطاقات!</h3> <p>والآن نبلغ لبّ الحديث، وموضع المتعة، وميدان الحجب والمنع.</p> <p>أنشأتُ نصًّا بسيطًا من نصوص القُمرة (Shell Script) سمّيتُه <a href="https://codeberg.org/unixdigest/dnsblockbuster" rel="nofollow">DNSBlockBuster</a>، غايته أن يجوب الشبكة، فيجلب جملةً من ملفات المُضيفين hosts من مصادر شتّى، ثم يضمّ بعضها إلى بعض، ويُنقّيها من الشوائب، ويحوّل حاصلها إلى قائمة نطاقات محجوبة تصلح لكلٍّ من Unbound و dnsmasq. ومعظم ما يحجبه هذا النص: إعلانات، ومواقع فُحش، ومتعقِّباتٍ لا تعرف الحياء (tracking).</p> <p>ويمتاز هذا النص أنّه يتيح لك إنشاء قائمة سماح، إن وجدتَ نطاقًا أُدرج ظلمًا أو اشتباهًا، فتستثنيه، كما يمكنك أن تُنشئ قائمة حظر خاصّة بك، تحجب بها ما تشاء مما لم تذكره القوائم الأصلية. ولا يعسر عليك كذلك أن تُضيف مصادر جديدة للحظر أو تحذف ما استغنيت عنه منها.</p> <p>ولستَ ـ بالطبع ـ مُلزَمًا باستعمال نصّي هذا، لكنني سأعتمده في هذا الدليل.</p> <p>واعلم أن النص، في صورته الراهنة، يُنتج قائمةً ضخمة تقارب مليوني نطاق، ويستهلك Unbound عند تحميلها كاملةً قرابة 705 ميجابايت من الذاكرة.</p> <p>ولكي لا يضيق صدر Unbound ولا يَنفد صبره أثناء تحميل هذه القائمة العظيمة، ينبغي لك أن تُعدّل الملف: <code>/etc/rc.conf.local</code> وتُضيف إليه السطر الآتي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#076678;--shiki-dark:#83A598">unbound_timeout</span><span style="color:#427B58;--shiki-dark:#8EC07C">=</span><span style="color:#79740E;--shiki-dark:#B8BB26">240</span></span></code></pre> <p>ثم أعد تشغيل Unbound:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> restart</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound</span></span></code></pre> <p>ألقِ نظرةً على قسم <a href="https://codeberg.org/unixdigest/dnsblockbuster#user-content-usage" rel="nofollow">Usage</a> في توثيق DNSBlockBuster لتعلم كيف يُستعمل.</p> <p>فإذا فرغتَ من إنشاء قائمة الحظر الخاصة بـ Unbound، فضعها في المسار: <code>/var/unbound/etc/</code>، ثم افتح ملف إعدادات Unbound، وهو: <code>/var/unbound/etc/unbound.conf</code> وأدرج السطور المطلوبة في قسم <code>server</code> من ملف الإعداد، على أن يكون ذلك قبل قسم <code>remote-control</code> ، إذ ذاك موضعها:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">include:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/var/unbound/etc/unbound-blocked-hosts.conf</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span>
<span class="line"></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># Enable the usage of the unbound-control command.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">remote-control:</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    control-enable:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> yes</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    control-interface:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/run/unbound.sock</span></span></code></pre> <p>والآن أعد تشغيل Unbound:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound-control</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reload</span></span></code></pre> <p>وإذا أجريت أمر <code>top</code> في ترمينال اخرى ، رأيتَ Unbound قد شغل شيئا غير يسير من المعالج، ويستأثر بنصيبٍ غير يسيرٍ من الذاكرة، وذلك في ساعة التحميل الأولى لقائمة الحظر.</p> <p>والآن اختبر حجب «نظام اسماء النطاقات» بطلب أحد النطاقات المحجوبة في قائمتك:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drill</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 3lift.com</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">;;</span><span style="color:#B57614;--shiki-dark:#FABD2F"> -</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">>></span><span style="color:#79740E;--shiki-dark:#B8BB26">HEADER</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;&lt;-</span><span style="color:#7C6F64;--shiki-dark:#A89984"> opcode:</span><span style="color:#B57614;--shiki-dark:#FABD2F"> QUERY,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcode:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NXDOMAIN,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> id:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 55906</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">…</span></span></code></pre> <p>ثم أَعِدِ الكَرّة، ولكن هذه المرّة مع خادم كلاودفلير «لنظام اسماء النطاقات»:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drill</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 3lift.com</span><span style="color:#79740E;--shiki-dark:#B8BB26"> @1.1.1.1</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">;;</span><span style="color:#B57614;--shiki-dark:#FABD2F"> -</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">>></span><span style="color:#79740E;--shiki-dark:#B8BB26">HEADER</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;&lt;-</span><span style="color:#7C6F64;--shiki-dark:#A89984"> opcode:</span><span style="color:#B57614;--shiki-dark:#FABD2F"> QUERY,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcode:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> id:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 48771</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">…</span></span></code></pre> <p>وكما يتبيّن لنا من مخرجات الاستعلامين، فإن خادم «نظام اسماء النطاقات» الخاص بنا قد سدّ الطريق إلى النطاق 3lift.com، فردّ عليه بجواب NXDOMAIN كأنه يقول: لا وجود له ولا سبيل إليه. أمّا خادم Cloudflare، فقد أجاب بالعنوان الشبكي الصحيح، لأنه لا علم له بحجبنا.</p> <h2>أمن نظام اسماء النطاقات</h2> <p>أمن نظام أسماء النطاقات باب واسع، وفي هذا الفصل لا نخوضه كلَّه، بل نقتصر على ما يهمّنا نحن، إذ عزمنا على تشغيل خادم «نظام اسماء النطاقات» بأيدينا وتحت نظرنا.</p> <p>اعلم أن «نظام اسماء النطاقات» في أصله غير مُعمى، ولا يضع افتراضًا ضمان السريّة، ولا سلامة البيانات، ولا توثيق الجهة المُجيبة. فإذا اتصلتَ بشبكة لا تُؤتمن، أو بموفّر خدمة خبيث الطويّة، أمكنه أن يتنصّت على استعلاماتك، أو يبدّل الأجوبة كما يشاء. بل قد يزيد في العبث فيلجأ إلى ما يُعرف بـ اختطاف «نظام اسماء النطاقات».</p> <h3>اختطاف نظام اسماء النطاقات</h3> <p>واختطاف «نظام اسماء النطاقات» معناه أن استعلاماتك لا تذهب إلى حيث تظن، بل تُحوَّل قسرًا إلى خادم آخر. وغالبًا ما يتم ذلك بتحويل كلّ الحركة المتجهة إلى المنفذ 53 من مقصدها الأصلي إلى مقصد بديل.</p> <p>ومن أبسط الطرق لاكتشاف ما إذا كان مزوّد الخدمة يعبث باستعلاماتك، أن تُجري السؤال مباشرة على خادم «نظام اسماء النطاقات» موثوق وصاحب سلطة.</p> <p>لدينا عدّة أدوات لهذا الغرض. في هذا المثال نستخدم أداة <code>drill</code>، وخياراتها هنا مماثلة لما في <code>dig</code>. وسنعود، كما ألفنا، إلى النطاق wikipedia.org.</p> <p>أولًا، لا بد أن نعرف الخوادم الموثوقة (Authoritative). وستجدها مذكورة في قسم الإجابة “ANSWER SECTION”:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drill</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NS</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">;;</span><span style="color:#B57614;--shiki-dark:#FABD2F"> -</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">>></span><span style="color:#79740E;--shiki-dark:#B8BB26">HEADER</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;&lt;-</span><span style="color:#7C6F64;--shiki-dark:#A89984"> opcode:</span><span style="color:#B57614;--shiki-dark:#FABD2F"> QUERY,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcode:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> id:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 28789</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; flags: qr rd ra ; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; QUESTION SECTION:</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; wikipedia.org.       IN      NS</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; ANSWER SECTION:</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">wikipedia.org.  85948   IN      NS      ns2.wikimedia.org.</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">wikipedia.org.  85948   IN      NS      ns0.wikimedia.org.</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">wikipedia.org.  85948   IN      NS      ns1.wikimedia.org.</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; AUTHORITY SECTION:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; ADDITIONAL SECTION:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; Query time: 1 msec</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; SERVER: 127.0.0.1</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; WHEN: Thu Nov  5 07:53:19 2020</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; MSG SIZE  rcvd: 95</span></span></code></pre> <p>ثم بعد ذلك، لا بدّ لنا أن نُوجّه السؤال مباشرةً إلى أحد أولئك الخوادم الموثوقة أنفسهم. والموضع الذي ينبغي أن تُحدّق فيه النظر، هو حقل الرايات (flags) في قسم HEADER من الجواب. فإن كان الردُّ صادرًا عن خادمٍ ذي ثقة، وجب أن ترى الراية <code>aa</code>.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drill</span><span style="color:#79740E;--shiki-dark:#B8BB26"> @ns1.wikimedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">;;</span><span style="color:#B57614;--shiki-dark:#FABD2F"> -</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">>></span><span style="color:#79740E;--shiki-dark:#B8BB26">HEADER</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;&lt;-</span><span style="color:#7C6F64;--shiki-dark:#A89984"> opcode:</span><span style="color:#B57614;--shiki-dark:#FABD2F"> QUERY,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcode:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> id:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 57611</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; flags: qr aa rd ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; QUESTION SECTION:</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; wikipedia.org.       IN      A</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; ANSWER SECTION:</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">wikipedia.org.  600     IN      A       91.198.174.192</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; AUTHORITY SECTION:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; ADDITIONAL SECTION:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; Query time: 127 msec</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; SERVER: 208.80.153.231</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; WHEN: Thu Nov  5 07:56:10 2020</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; MSG SIZE  rcvd: 47</span></span></code></pre> <p>وهكذا يتبيّن لنا،أنّ الجواب الذي ورد إلينا لم تُمدّ إليه يدُ الاختطاف، إذ جاءنا مشفوعًا براية aa. فلنحرب الحيلة ذاتها مع خادم Cloudflare العمومي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> drill</span><span style="color:#79740E;--shiki-dark:#B8BB26"> @1.1.1.1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">;;</span><span style="color:#B57614;--shiki-dark:#FABD2F"> -</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">>></span><span style="color:#79740E;--shiki-dark:#B8BB26">HEADER</span><span style="color:#427B58;--shiki-dark:#8EC07C">&lt;&lt;-</span><span style="color:#7C6F64;--shiki-dark:#A89984"> opcode:</span><span style="color:#B57614;--shiki-dark:#FABD2F"> QUERY,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcode:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> id:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 40562</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; QUESTION SECTION:</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; wikipedia.org.       IN      A</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; ANSWER SECTION:</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">wikipedia.org.  555     IN      A       91.198.174.192</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; AUTHORITY SECTION:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; ADDITIONAL SECTION:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; Query time: 3 msec</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; SERVER: 1.1.1.1</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; WHEN: Thu Nov  5 08:02:58 2020</span></span>
<span class="line"><span style="color:#79740E;--shiki-dark:#B8BB26">;; MSG SIZE  rcvd: 47</span></span></code></pre> <p>وانظر كيف غابت راية <code>aa</code> عن حقل HEADER، فدلّ غيابُها على أنّ الجواب لم يكن جوابا موثوقا، بل ردًّا من ناقلٍ أو وسيط، لا من مصدرٍ مُفوَّض.</p> <p>وهناك أداةٌ أيسرُ مَأخذًا، وهي <a href="https://man.openbsd.org/nslookup" rel="nofollow">nslookup</a>. فنبدأ أوّلًا بالسؤال عن الخوادم الموثوقة:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> nslookup</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -querytype=NS</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Server:</span><span style="color:#8F3F71;--shiki-dark:#D3869B">         127.0.0.1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#79740E;--shiki-dark:#B8BB26">        127.0.0.1#53</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Non-authoritative</span><span style="color:#79740E;--shiki-dark:#B8BB26"> answer:</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26">   nameserver</span><span style="color:#79740E;--shiki-dark:#B8BB26"> =</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ns1.wikimedia.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26">   nameserver</span><span style="color:#79740E;--shiki-dark:#B8BB26"> =</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ns2.wikimedia.org.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26">   nameserver</span><span style="color:#79740E;--shiki-dark:#B8BB26"> =</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ns0.wikimedia.org.</span></span></code></pre> <p>ثم هلم بنا نجعل السؤال عن النطاق المقصود موجهاً الى خادمنا:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> nslookup</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Server:</span><span style="color:#8F3F71;--shiki-dark:#D3869B">         127.0.0.1</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#79740E;--shiki-dark:#B8BB26">        127.0.0.1#53</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Non-authoritative</span><span style="color:#79740E;--shiki-dark:#B8BB26"> answer:</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Name:</span><span style="color:#79740E;--shiki-dark:#B8BB26">   wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 91.198.174.192</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Server:</span><span style="color:#79740E;--shiki-dark:#B8BB26">         ns2.wikimedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#79740E;--shiki-dark:#B8BB26">        91.198.174.239#53</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Name:</span><span style="color:#79740E;--shiki-dark:#B8BB26">   wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 91.198.174.192</span></span></code></pre> <p>وظهور عبارة <code>Non-authoritative</code> يبيّن بوضوح أن الردّ لم يصدر من خادمٍ موثوق. لا إشكال في ذلك، فدور هذا الخادم هو أن يستعلم بالنيابة عنّا ويعيد الجواب كما وصله. نوجّه الاستعلام مباشرةً إلى أحد الخوادم المُخوَّلة، ونراقب ترويسة الردّ:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> nslookup</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ns0.wikimedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Server:</span><span style="color:#79740E;--shiki-dark:#B8BB26">         ns0.wikimedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#79740E;--shiki-dark:#B8BB26">        208.80.154.238#53</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Name:</span><span style="color:#79740E;--shiki-dark:#B8BB26">   wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 91.198.174.192</span></span></code></pre> <p>اختفت رسالة <code>Non-authoritative</code> ، والرد الذي حصلنا عليه كان من مصدر موثوق، مما يعني أن استعلام «نظام اسماء النطاقات» الخاص بنا لم يُخططف.</p> <p>الآن قمت بتفعيل خدمة VPN التي أعرف أنها تعترض استعلامات «نظام اسماء النطاقات» لحماية العملاء من <a href="https://en.wikipedia.org/wiki/DNS_leak" rel="nofollow">تسريب «نظام اسماء النطاقات»</a>، وسأقوم الآن بالاستعلام من أحد الخوادم الموثوقة مرة أخرى:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> nslookup</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ns0.wikimedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Server:</span><span style="color:#79740E;--shiki-dark:#B8BB26">         ns0.wikimedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#79740E;--shiki-dark:#B8BB26">        208.80.154.238#53</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Non-authoritative</span><span style="color:#79740E;--shiki-dark:#B8BB26"> answer:</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Name:</span><span style="color:#79740E;--shiki-dark:#B8BB26">   wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 91.198.174.192</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Name:</span><span style="color:#79740E;--shiki-dark:#B8BB26">   wikipedia.org</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Address:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2620:0:862:ed1a::1</span></span></code></pre> <p>كما كان متوقعًا، لم يكن الرد صادراً من الخادم الموثوق، رغم أنني استعلمت مباشرة من الخادم الموثوق. اختطفت حركة «نظام اسماء النطاقات» واعيد توجيه الرد إلى خادم «نظام اسماء النطاقات» غير معروف.</p> <p>إختطاف «نظام اسماء النطاقات»، سواء من قبل مزود الإنترنت أو من جهة أخرى، مشكلة كبيرة. أولًا، لا يمكننا الثقة التامة في الإجابة التي نحصل عليها من خادم «نظام اسماء النطاقات». ثانيًا، حتى إذا كان رد «نظام اسماء النطاقات» يحوي بيانات غير معدلة، فإن حركة مرور «نظام اسماء النطاقات» اخترقت لسبب غير معروف، وقد يكون ذلك لجمع البيانات وتسجيلها أو لأمر آخر.</p> <div class="callout svelte-1ezppec" style="--callout-color: var(--yellow)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋽</span> <!--[--><!---->بعض مزودي الإنترنت مثل Optimum Online، Comcast، Time Warner، Cox Communications، RCN، Rogers، Charter Communications، Verizon، Virgin Media، Frontier Communications، Bell Sympatico، Airtel، OpenDNS وآخرين بدأوا في اختطاف «نظام اسماء النطاقات» للنطاقات المعدومة (NXDOMAIN) للإسترزاق بالإعلانات. حيث كان خادم «نظام اسماء النطاقات» يعيد توجيه الطلبات إلى عنوان شبكي مزيف يحتوي على موقع إعلانات. ولا أعرف كم من مزودي الإنترنت يفعلون هذا الفعل.<!--]--></div></div><!----> <h4>الوقاية من اختطاف نظام اسماء النطاقات</h4> <p>إذا تبيّن لك أن حركة «نظام اسماء النطاقات» على المنفذ 53 قد امتدت إليها يد العبث، وتسلّل إليها الاختطاف، فاعلم أن أمامك ثلاثة مسالك، لكلٍّ منها وجهة ومآل:</p> <ol><li>فإن قُدّر لك الاختيار، فغيّر مزوّد الانترنت؛ إذ ليس من شيم مزوّد الإنترنت، ولا من أمانته، أن يعترض استعلامات «نظام اسماء النطاقات» أو يتلاعب بها. وهذا قول لا يحتمل تأويلاً.</li> <li>أو أن تُنشئ لك خادم «نظام اسماء النطاقات» بعيدًا في مركز استضافة لا يعرف للحجب سبيلًا ولا للاختطاف أثرًا، وتجعل له منفذًا غير مألوف، ثم تسوق إليه استعلاماتك سوقًا، فيكون هو الوكيل والأمين.</li> <li>أو أن تلجأ إلى شبكة VPN موثوقة، لا تتعرض لحركة «نظام اسماء النطاقات»، وإن فعلت، فبسياسة عدم تسجيل تُطمئن القلب وتسكّن الريبة.</li></ol> <h3>انتحال نظام اسماء النطاقات (DNS spoofing)</h3> <p>أما انتحال «نظام اسماء النطاقات»، ويُعرف كذلك بتسميم الذاكرة المُخبأة، فشأنه غير شأن الاختطاف. ففي الاختطاف تُحوَّل الطريق، وفي الانتحال يُزوَّر الزاد. وغالبًا ما يجتمع الأمران، فيكون الخطر أعظم، والضرر أعم.</p> <p>في هذا النوع من الهجوم تُغرس بيانات مزيفة في ذاكرة محلّل «نظام اسماء النطاقات»، فيُضلَّل الخادم، ويُرجع جوابًا غير صادق، كعنوان شبكي لا يدل على مقصوده، ولا يقود إلى مراده.</p> <h4>الوقاية من انتحال نظام اسماء النطاقات</h4> <p>ويمكن دفع هذا البلاء، أو التخفيف من حدّته، على طبقة النقل أو طبقة التطبيق، وذلك بالتحقق التام بين الطرفين بعد قيام الاتصال. ومن أشهر الأمثلة على ذلك استخدام معيار أمان طبقة النقل (TLS) والتواقيع الرقمية.</p> <p>ويأتي <a href="https://en.wikipedia.org/wiki/DNSSEC" rel="nofollow">«نظام اسماء النطاقات الآمن» (DNSSEC)</a> درعًا في هذا الميدان، إذ يعتمد على تواقيع رقمية مُمّاه، موثَّقة بمفاتيح عامة موثوقة، للتحقق من صحة البيانات وصيانتها من التزوير. غير أن كثيرًا من مديري أنظمة «اسماء النطاقات» لم يُحسنوا الأخذ به بعد.</p> <p>وحتى عام 2020، كانت جميع نطاقات المستوى الأعلى الأصلية (TLDs) تدعم DNSSEC، وكذلك نطاقات الدول الكبرى، بينما لا تزال بعض نطاقات الدول الأخرى متأخرة عن هذا الركب.</p> <h2>المُلحق</h2> <h3>فحص نظام اسماء النطاقات عبر HTTPS (DoH)</h3> <p>أرغب هنا أن أبيّن أن DoH لا يمنح خصوصية حقيقية كما يُشاع، إذ إن العنوان الشبكي للمصدر والعنوان الشبكي للوجهة يبدوان جليَّين في حركة HTTPS، لا يستتران ولا يختفيان.</p> <p>بادئ ذي بدء، عطّلتُ DoH في متصفح فايرفوكس على أحد أجهزة شبكة البالغين، ثم أخذت أراقب حركة المرور على بطاقة الشبكة <code>em1</code> بأداة <a href="https://man.openbsd.org/tcpdump" rel="nofollow">tcpdump</a>. وفي الوقت نفسه فعّلتُ ملف السجل في Unbound، اتقاءً لضجيج «نظام اسماء النطاقات» أن يملأ syslog، وجعلتُ <a href="https://man.openbsd.org/tail" rel="nofollow">tail</a> فيقي في متابعة ما يُكتب في السجل لحظة بلحظة.</p> <p>بعد ذلك قصدتُ موقع wikipedia.org عبر المتصفح، ثم التفتُّ لأنظر: ماذا تكشف عيون المراقبة على الموجّه؟</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcpdump</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -n</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -i</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> src</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> and</span><span style="color:#79740E;--shiki-dark:#B8BB26"> not</span><span style="color:#79740E;--shiki-dark:#B8BB26"> arp</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">tcpdump:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> listening</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em1,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> link-type</span><span style="color:#79740E;--shiki-dark:#B8BB26"> EN10MB</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:30:33.494352</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5.55724</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.1.1.53:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 58136+</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A?</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org.</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">31</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (DF)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:30:33.774439</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5.58372</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.1.1.53:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 58448+</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A?</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">35</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (DF)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">23:30:34.184287</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5.46639</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.1.1.53:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 15167+</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A?</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">35</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (DF)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">…</span></span></code></pre> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tail</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -f</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/log/unbound.log</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> query:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reply:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.097209</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 47</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> query:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reply:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.154989</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 80</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:34</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> query:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:34</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reply:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.000000</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 80</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">…</span></span></code></pre> <p>وبداهةً نرى الاستعلام ظاهرًا بوضوح، سواء في حركة المرور على الكرت أو في سجل Unbound.</p> <p>ثم إني عزمتُ، على تمكين DoH وتعطيل ما سواه من «نظام اسماء النطاقات» العتيق في فايرفوكس، فغيّرت قيمة <code>network.trr.mode</code> إلى <code>4</code>، وعدّلت <code>Network settings</code> وجعلت Cloudflare موفر DoH.</p> <p><strong>حيلة:</strong> إن اكتفيتَ بتفعيل DoH من نافذة التفضيلات، أبقى فايرفوكس على «نظام اسماء النطاقات» التقليدي ردءًا وملاذًا عند الحاجة. أمّا إن شئتَ الحسم والعزم، وأردتَ DoH وحده بلا شريك، فاضبط <code>network.trr.mode</code> بيدك.</p> <p>اكتب <code>about:config</code> في شريط العنوان واضرب <code>Enter</code> ، تنفتح لك خزائن الإعدادات المستورة.</p> <p>الخطوة الثانية: فتّش عن <code>network.trr.mode</code>، فهو زمام الأمر ومقاليد DoH، وله من القيم ما يلي:</p> <p><strong>1</strong> - DoH معطّل.<br/> <strong>2</strong> - DoH مفعّل، ويتداول فايرفوكس بينه وبين «نظام اسماء النطاقات» التقليدي أيّهما أسرع جوابًا.<br/> <strong>3</strong> - DoH مفعّل، و«نظام اسماء النطاقات» التقليدي ظهيرٌ عند العثرة.<br/> <strong>4</strong> - DoH مفعّل، و«نظام اسماء النطاقات» التقليدي معطل.<br/> <strong>5</strong> - DoH معطّل.</p> <p>الخطوة الثالثة: ثم اطلب <code>network.trr.bootstrapAddress</code>فهو المتحكم بالعنوان الشبكي الرقمي لخادم DoH، وأدخل فيه <code>1.1.1.1</code> ثم اضرب <code>Enter</code>.</p> <p>هذه المرة سأزور “freebsd.org”.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tcpdump</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -n</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -i</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em1</span><span style="color:#79740E;--shiki-dark:#B8BB26"> src</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> and</span><span style="color:#79740E;--shiki-dark:#B8BB26"> not</span><span style="color:#79740E;--shiki-dark:#B8BB26"> arp</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">tcpdump:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> listening</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> em1,</span><span style="color:#79740E;--shiki-dark:#B8BB26"> link-type</span><span style="color:#79740E;--shiki-dark:#B8BB26"> EN10MB</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">00:21:10.944243</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5.32856</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1.1.1.1.443:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> P</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 2223446146:2223446202</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">56</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ack</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 157857007</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 501</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (DF)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">00:21:10.948719</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5.46584</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 96.47.72.84.80:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 922508523:922508523</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 64240</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">mss</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1460,sackOK,timestamp</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1673624773</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0,nop,wscale</span><span style="color:#427B58;--shiki-dark:#8EC07C"> 7></span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (DF)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">00:21:11.133801</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5.33298</span><span style="color:#427B58;--shiki-dark:#8EC07C"> ></span><span style="color:#79740E;--shiki-dark:#B8BB26"> 96.47.72.84.443:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> S</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 3275123911:3275123911</span><span style="color:#7C6F64;--shiki-dark:#A89984">(</span><span style="color:#B57614;--shiki-dark:#FABD2F">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span><span style="color:#79740E;--shiki-dark:#B8BB26"> win</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 64240</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">mss</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 1460,sackOK,timestamp</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1673624958</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 0,nop,wscale</span><span style="color:#427B58;--shiki-dark:#8EC07C"> 7></span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> (DF)</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">…</span></span></code></pre> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> tail</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -f</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /var/unbound/log/unbound.log</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> query:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reply:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.097209</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 47</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> query:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:33</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reply:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.154989</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 80</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:34</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> query:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">Nov</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 05</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 23:30:34</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound[12636:0]</span><span style="color:#79740E;--shiki-dark:#B8BB26"> reply:</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.5</span><span style="color:#79740E;--shiki-dark:#B8BB26"> www.wikipedia.org.</span><span style="color:#79740E;--shiki-dark:#B8BB26"> A</span><span style="color:#79740E;--shiki-dark:#B8BB26"> IN</span><span style="color:#79740E;--shiki-dark:#B8BB26"> NOERROR</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0.000000</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 1</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 80</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">…</span></span></code></pre> <p>ويكشف هذا الرصد، أنّ اتصالًا قد انعقد بخادم «نظام اسماء النطاقات» التابع لـ Cloudflare على العنوان 1.1.1.1 عبر المنفذ 443 (HTTPS)، وأنّنا ما لبثنا بعده أن قصدنا عنوان الوجهة 96.47.72.84. وفي الوقت عينه لم يتحرّك سجلّ Unbound. والأمر <code>tail</code> باقٍ كما كان.</p> <p>وإن نحن أجرينا استعلام «نظام اسماء النطاقات» تقليديًا على الموجّه، تبيّن لنا أنّ العنوان 96.47.72.84 هو حقًّا عنوان موقع freebsd.org.</p> <p>والأعجب من ذلك أنّنا، في هذا المثال بعينه، نستطيع بلوغ موقع freebsd.org مباشرةً بإدخال عنوانه الرقمي في شريط المتصفّح، من غير حاجة إلى اسم ولا وساطة.</p> <p>وفي ذلك دلالة بيّنة على أنّ DoH، وإن التفّ على استعلامات «نظام اسماء النطاقات» المعتادة وتجاوزها، لا يملك ستر عنوان الوجهة الشبكي، إذ يظل ظاهرًا مكشوفًا في نسيج حركة الاتصال.</p> <h3>حجب “نظام اسماء النطاقات عبر HTTPS” (DoH)</h3> <p>وكانت أداة <a href="https://codeberg.org/unixdigest/dnsblockbuster" rel="nofollow">DNSBlockBuster</a>، فيما مضى، قد ضمّت بعض نطاقات DoH إلى قوائم الحجب، أدرجتها فيها على عجل ومن غير ترتيب، غير أنّي عدلت عن ذلك، ونزعت حجب DoH من خادم «نظام اسماء النطاقات» نفسه، إذ تبيّن لي أنّ موضع هذا المنع إنما هو جدار الحماية لا غيره.</p> <p>فحجب DoH اعتمادًا على أسماء النطاقات لا يستقيم في رأيي المتواضع، لأنّ اسم النطاق لا بدّ له -قبل كل شيء- من أن يُحلّ ويُستعلم عنه. وأكثر العملاء الذين يستخدمون DoH يحملون عناوين خوادمه الشبكية مُعمّاة في صميم الكود المصدري.</p> <p>فإن كنتَ لا تستخدم IPv6، فالحيلة أيسر وأوضح: امنع كلّ حركة IPv6 الصادرة، واقتصر على قائمة IPv4 وحدها. عدّل معامل <code>pass out</code> في قسم Default protect and block من الملف <code>/etc/pf.conf</code>، إلى <code>pass out inet</code>. وبذلك لا يُسمح إلا بخروج حركة IPv4، ولا تعود مضطرًا إلى ملاحقة عناوين DoH الخاصة بـ IPv6 واحدًا واحدًا.</p> <p>نزّل قائمة العناوين من مستودع <a href="https://github.com/mthcht/awesome-lists/blob/main/Lists/dns_over_https_servers_list.csv" rel="nofollow">awesome-lists</a>، وهذّبها بما يلائم حاجتك، وضعها حيث تشاء على القرص.</p> <p>وقد أنشأتُ لذلك دليلاً فرعيًا باسم <code>/etc/pf-block-lists/</code> أجمع فيه كل قوائم الحجب التي أحتاجها لمُصفي الرُزم.</p> <p>ثم، بعد ذلك، أنشئ ملفًا دائمًا لمُصفي الرزم في قسم Tables من الملف <code>/etc/pf.conf</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># Public DoH servers.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">table</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">block_do</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">h</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> persist</span><span style="color:#79740E;--shiki-dark:#B8BB26"> file</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/etc/pf-block-lists/doh-ipv4.txt</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span></code></pre> <p>وإن احتجت العناوين الشبكية من الاصدار السادس، فأضف مايلي:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">table</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">block_do</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">h</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span><span style="color:#79740E;--shiki-dark:#B8BB26"> persist</span><span style="color:#79740E;--shiki-dark:#B8BB26"> file</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/etc/pf-block-lists/doh-ipv4.txt</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26"> file</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/etc/pf-block-lists/doh-ipv6.txt</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span></code></pre> <p>ثم أضف <code>block</code> لقسم “Protect and block by default” من جدار الحماية:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"># Let's block DoH.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">block</span><span style="color:#79740E;--shiki-dark:#B8BB26"> in</span><span style="color:#79740E;--shiki-dark:#B8BB26"> quick</span><span style="color:#79740E;--shiki-dark:#B8BB26"> on</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span><span style="color:#076678;--shiki-dark:#83A598"> $g_lan</span><span style="color:#076678;--shiki-dark:#83A598"> $c_lan</span><span style="color:#076678;--shiki-dark:#83A598"> $dmz</span><span style="color:#79740E;--shiki-dark:#B8BB26"> }</span><span style="color:#79740E;--shiki-dark:#B8BB26"> to</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">block_do</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">h</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <p>أعد التحميل بالأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -f</span><span style="color:#79740E;--shiki-dark:#B8BB26"> /etc/pf.conf</span></span></code></pre> <p>تأكد من القائمة بالأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -vvt</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block_doh</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -T</span><span style="color:#79740E;--shiki-dark:#B8BB26"> show</span></span></code></pre> <p>وإن أردتَ — بعد حينٍ من الدهر — أن تطّلع على العناوين الشبكية التي استُعملت في الحجب وجرى العمل بها، فلك أن تُصفّي المخرجات وتُنقّيها بالترشيح، فتظهر لك العناوين التي وقع عليها المنع، دون سواها:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pfctl</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -vvt</span><span style="color:#79740E;--shiki-dark:#B8BB26"> block_doh</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -T</span><span style="color:#79740E;--shiki-dark:#B8BB26"> show</span><span style="color:#427B58;--shiki-dark:#8EC07C"> |</span><span style="color:#B57614;--shiki-dark:#FABD2F"> awk</span><span style="color:#7C6F64;--shiki-dark:#A89984"> '</span><span style="color:#79740E;--shiki-dark:#B8BB26">/\[/ {p+=$4; b+=$6} END {print p, b}</span><span style="color:#7C6F64;--shiki-dark:#A89984">'</span></span></code></pre> <h3>إضافة خيار domain-name إلى «معيار تهيئةُ المُضيف الآلية» واستعمال الاسم المؤهَّل الكامل FQDN</h3> <p>إذا أقمنا شبكتنا على أن تكون لجميع الحواسيب والأجهزة عناوين شبكية ثابتة وأسماء مضيفين معروفة، فإن كثيرًا من الأدوات لن تُحسن التعامل مع هذه الأسماء كما هي، ما لم نُلحِق بها اسم نطاق في خادم «نظام اسماء النطاقات». وذلك لأن أدوات الشبكة — كالأداة <code>host</code> مثلًا — تتوقّع أن يكون الاسم المطلوب <a href="https://en.wikipedia.org/wiki/Fully_qualified_domain_name" rel="nofollow">اسمًا مؤهَّلًا كاملًا (FQDN)</a>.</p> <p>فلنفرض أن في شبكتنا المحلية حاسبًا اسمه foo، وعنوانه الثابت 192.168.1.7. قد ينسى المرء، مع مرور الأيام، أن هذا الاسم يعود إلى ذلك العنوان، أو يختلط عليه أيُّ جهازٍ يقيم عند هذا الرقم.</p> <p>أما إذا استعملنا اسمًا مؤهَّلًا كاملًا، استقام الأمر هكذا:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host</span><span style="color:#79740E;--shiki-dark:#B8BB26"> foo.example.com</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">foo.example.com</span><span style="color:#79740E;--shiki-dark:#B8BB26"> has</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.7</span></span></code></pre> <p>وبإمكاننا كتابة العنوان:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.7</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">7.1.168.192.in-addr.arpa</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain</span><span style="color:#79740E;--shiki-dark:#B8BB26"> name</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pointer</span><span style="color:#79740E;--shiki-dark:#B8BB26"> foo.example.com</span></span></code></pre> <p>غير أنّ تكرار كتابة اسم النطاق كاملًا في كل مرة أمرٌ مُملّ لا يُحتمل. فإذا أضفنا خيار <a href="https://man.openbsd.org/dhcp-options#option~24" rel="nofollow">domain-name</a> إلى الملف <code>/etc/resolv.conf</code>، أُلحق اسم النطاق تلقائيًا بكل اسم نكتبه. وعندئذٍ يكفينا أن نفعل هذا فحسب:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host</span><span style="color:#79740E;--shiki-dark:#B8BB26"> foo</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">foo.example.com</span><span style="color:#79740E;--shiki-dark:#B8BB26"> has</span><span style="color:#79740E;--shiki-dark:#B8BB26"> address</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.7</span></span></code></pre> <p>ويرى بعض الناس أنّ الأَولى تسجيل اسم نطاقٍ حقيقيّ، ثم استعماله داخل الشبكة المحليّة، ولا ريب أنّ ذلك جائز ويؤدّي الغرض، غير أنّه ليس لازمًا ولا محتومًا. إذ تشير المواصفة <a href="https://www.rfc-editor.org/rfc/rfc8375.html" rel="nofollow">RFC 8375</a> إلى أنّ النطاق <code>.home.arpa</code> قد جُعل أصلًا ليستعمل داخل الشبكات الصغيرة، كشَبكات المنازل وما في حكمها.</p> <p>فلنبدأ بإجراء بعض التعديلات على ملف الإعداد <code>/etc/dhcpd.conf</code>. وللتسهيل، سأكتفي هنا بخادم الشابِكة من مثال الشبكة العامة (Public LAN)، غير أنّ لك أن تُوسّع هذا الإعداد على أي مقطع شبكي تشاء، بل ويمكنك استعماله عبر عدّة مقاطع متى دعت الحاجة.</p> <p>في إعدادنا الحالي، كان اسم النطاق <code>example.com</code>ملحقًا بخادم الشابكة سلفًا، فجاز لنا أن نُبقيه كما هو. أمّا إن لم يكن لديك خادمٌ عامّ يحتاج إلى اسم نطاقٍ حقيقي، فغيّر الاسم إلى <code>home.arpa</code> بلا حرج. وقد بدّلتُ اسم خادم الشابكة عندي إلى lilo — نعم، من Lilo &amp; Stitch — فهو، في نظري، أظرف وأحبّ إلى النفس من Luke أو Yoda، ولكلٍّ ذوقه وميلُه.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">subnet</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> netmask</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 255.255.255.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name-servers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">example.com</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> routers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    range</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.10</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.254</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">}</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">subnet</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> netmask</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 255.255.255.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name-servers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">example.com</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> routers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    range</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.10</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.2.254</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">}</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">subnet</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> netmask</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 255.255.255.0</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name-servers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-name</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">example.com</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> routers</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.1</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    range</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.10</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.3.254</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">    host</span><span style="color:#79740E;--shiki-dark:#B8BB26"> lilo.example.com</span><span style="color:#79740E;--shiki-dark:#B8BB26"> {</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        fixed-address</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 191.168.3.2</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        hardware</span><span style="color:#79740E;--shiki-dark:#B8BB26"> ethernet</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 61:20:42:39:61:AF</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">        option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> host-name</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">lilo</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">    }</span></span>
<span class="line"><span style="color:#3C3836;--shiki-dark:#EBDBB2">}</span></span></code></pre> <p>وإن آثرتَ أن تستعمل أكثر من نطاقٍ واحد، كأن تجعل <code>example.com</code> لأعمالك في تطوير مواقع الشابكة، وتخصّ <code>home.arpa</code> بشبكتك الخاصة، وذلك باستعمال <a href="https://en.wikipedia.org/wiki/Search_domain" rel="nofollow">البحث عن النطاق</a> بخيار <code>domain-search</code> في ملف <code>/etc/dhcpd.conf</code> بدل خيار <code>domain-name</code>. والفرق بينهما بيّنٌ لمن تدبّر: فخيار <code>domain-name</code> لا يُلحق إلا نطاقًا واحدًا بالاسم المجرّد، أمّا <code>domain-search</code> فيفتح لك باب التعدّد، إذ يسمح بإضافة عدّة نطاقات، فتُفحَص واحدًا بعد واحد،، حتى يُعثَر على المضيف المنشود.</p> <p>ويأتي خيار <code>domain-search</code> على هذه الهيئة:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">option</span><span style="color:#79740E;--shiki-dark:#B8BB26"> domain-search</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">example.com</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#79740E;--shiki-dark:#B8BB26">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">home.arpa</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span></code></pre> <p>ثم لا بدّ بعد ذلك من تهيئة Unbound ليتعامل مع العناوين الشبكية الثابتة في شبكتنا. وفي هذا المثال ليس عندنا سوى خادم الشابكة، غير أنّ الباب مفتوح لإضافة ما شئت من المضيفين. يمكنك التعديل مباشرة في ملف إعدادات Unbound الرئيسي، غير أنّ الأحوط والأرتب — في رأيي — أن تفرد لهذا الغرض ملفًا مستقلًا، ثم تُدرجه ضمن الملف الأصلي. فأنشئ ملفًا جديدًا مثلًا باسم: <code>/var/unbound/etc/unbound-local.conf</code> واضبط فيه تعريفات المضيفين على هذا النحو:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">local-data:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">lilo.example.com IN A 192.168.3.2</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">local-data-ptr:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">192.168.3.2 lilo.example.com</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span></code></pre> <p>أو إن آثرت استعمال نطاق <code>home.arpa</code>، فاجعلها هكذا:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">local-data:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">lilo.home.arpa IN A 192.168.3.2</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">local-data-ptr:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">192.168.3.2 lilo.home.arpa</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span></code></pre> <p>ثم أضف إلى ملف Unbound الرئيسي <code>/var/unbound/etc/unbound.conf</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">private-address:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> 192.168.0.0/16</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">private-domain:</span><span style="color:#79740E;--shiki-dark:#B8BB26"> example.com</span><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic"> # Use home.arpa instead if you need that.</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">include:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#79740E;--shiki-dark:#B8BB26">/var/unbound/etc/unbound-local.conf</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span></span></code></pre> <p>أعد تشغيل «معيار تهيئةُ المُضيف الآلية» وUnbound::</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> restart</span><span style="color:#79740E;--shiki-dark:#B8BB26"> dhcpd</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">$</span><span style="color:#79740E;--shiki-dark:#B8BB26"> doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> rcctl</span><span style="color:#79740E;--shiki-dark:#B8BB26"> restart</span><span style="color:#79740E;--shiki-dark:#B8BB26"> unbound</span></span></code></pre> <p>وإن أنت نزعت سلك الشبكة من أحد الحواسيب المتصلة بإحدى الشبكات الـمحلية ثم أعدت وصله، رأيت أن ملف <code>/etc/resolv.conf</code> قد زِيد فيه خيار <code>domain</code>:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">domain</span><span style="color:#79740E;--shiki-dark:#B8BB26"> example.com</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">nameserver</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 192.168.1.1</span></span></code></pre> <p>وهكذا يتّسع لك المثال، فتُكثِر النطاقات إن شئت، وتعدّد المضيفين عبر جميع الأقسام.</p> <h3>إضافة pf-badhost</h3> <p>إذا فرغتَ من إعداد موجّهك على «أوبن بي إس دي»، فإني أنصحك أن تُلحق به <a href="https://www.geoghegan.ca/pfbadhost.html" rel="nofollow">pf-badhost</a>.</p> <p>فـ pf-badhost نص أمني خفيف، صاغه <a href="https://www.geoghegan.ca/about.html" rel="nofollow">جوردان جيوغان</a>، غايته كفّ أذى كثير من منغّصات الشبكة ومشاغبيها. وبفضله تُقصم ظهور هجمات التخمين على SSH وSMTP، ويخفّ ضجيجها حتى يكاد يتلاشى.</p> <p>يقوم هذا النص، على فتراتٍ معلومة، بجمع العناوين الشبكية من قواعد بيانات مشهورة برصد المزعجين ومصادر الشرّ، مثل Spamhaus وFirehol وEmerging Threats وBinary Defense، حيث تُسجَّل العناوين السيئة أولًا بأول. ثم يُدرِج تلك العناوين في جدار الحماية مصفي الرزم ضمن جدولٍ يُحجَب افتراضيًا، فيُغلق الباب قبل أن يُطرق.</p> <h3>unbound-adblock</h3> <p>وأمّا <a href="https://www.geoghegan.ca/unbound-adblock.html" rel="nofollow">unbound-adblock</a>، فهو سكربت آخر من صنع <a href="https://www.geoghegan.ca/about.html" rel="nofollow">جوردان جيوغان</a>، يُمكّنك من حجب شبكات الإعلانات على مستوى نظام اسماء النطاقات. فإن شئت، جعلته بديلًا عن <a href="https://codeberg.org/unixdigest/dnsblockbuster" rel="nofollow">DNSBlockBuster</a>، ولك في ذلك سعة واختيار.</p> <h3>قراءات مُستحسنة</h3> <ul><li><a href="https://www.openbsd.org/faq/pf/index.html" rel="nofollow">دليل المستعمل لـمصفي الرزم</a> من أسئلة «أوبن بي إس دي» الشائعة.</li> <li><a href="https://mwl.io/nonfiction/os#ao2e" rel="nofollow">Absolute OpenBSD، الطبعة الثانية</a>، لمايكل وارن لوكاس (مع أنّ بعض صياغات مصفي الرزم تغيّرت منذ تأليفه، إلا أنّ نفعه باقٍ)</li> <li><a href="https://mwl.io/nonfiction/networking#n4sa" rel="nofollow">Networking for System Administrators</a>لمايكل وارن لوكاس.</li> <li><a href="https://home.nuug.no/~peter/openbsd_and_you/#1" rel="nofollow">OpenBSD and You</a></li> <li><a href="https://blog.apnic.net/2019/11/12/stop-using-ridiculously-low-dns-ttls/" rel="nofollow">Stop using ridiculously low DNS TTLs</a></li></ul> <h3>وصلات ذات صلة</h3> <ul><li><a href="https://github.com/DNSCrypt/dnscrypt-resolvers/blob/master/v3/public-resolvers.md" rel="nofollow">قائمة موسّعة بمحلّلات «نظام اسماء النطاقات» العامة الداعمة لـ DNSCrypt وDNS-over-HTTP2</a></li> <li><a href="https://github.com/curl/curl/wiki/DNS-over-HTTPS" rel="nofollow">قائمة cURL بخوادم DoH المتاحة للعامة</a></li> <li><a href="https://github.com/oneoffdallas/dohservers" rel="nofollow">قائمة أخرى بخوادم DoH</a></li></ul> <blockquote><p>هذه المقالة ترجمةٌ للدليل الأصلي <a href="https://unixdigest.com/openbsd-router-guide/" rel="nofollow">«OpenBSD Router Guide»</a>، وهو منشورٌ برخصة المشاع الإبداعي CC BY-NC-SA 4.0.</p></blockquote> <blockquote><p>إن أفادتك هذه الترجمة، فادعُ لصاحبها بخير، أو ساند جهده عبر: <a href="https://coinos.io/%20Motaz" rel="nofollow">Motaz@coinos.io</a> :)</p></blockquote><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[الشرحُ المُختصر في عمل نوستر]]></title>
            <link>https://motaz.cc/rss.xml/blog/2026-05-23-الشرحُ المُختصر في عمل نوستر</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2026-05-23-الشرحُ المُختصر في عمل نوستر</guid>
            <pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[أساس نوستر الحَدَث ( event ) إن كُل شاردةِ بيانات تجري في شبكة نوستر — سواء كانت ملاحظة (منشور)، أو ملف المؤلف، أو قائمة متابعة — إنما هي “حَدَث” (eve...]]></description>
            <content:encoded><![CDATA[<!--[--><h2>أساس نوستر</h2> <h3>الحَدَث ( <code>event</code> )</h3> <p>إن كُل شاردةِ بيانات تجري في شبكة نوستر — سواء كانت ملاحظة (منشور)، أو ملف المؤلف، أو قائمة متابعة — إنما هي “حَدَث” (event)، حوى ستة حقول دلالية. وهي:</p> <ul><li><p><strong><code>pubkey</code>:</strong> هو المفتاح العام لصاحب الحَدَث، ويأتي في اثنين وثلاثين بايتاً بنظام الستة عشر (Hex). وبه تُعرف هوية المؤلف الرقمية.</p></li> <li><p><strong><code>created_at</code>:</strong> وهو مِيقات الزمان بنظامِ “يونكس” (محسوب بالثواني). ولَـمَّا كان المِعْيار لا يَقْهرُ النَّاسَ على تَدْقيقِه، عُوِّلَ فيه على صِدْقِ المؤلف وتحقيقِه.</p></li> <li><p><strong><code>kind</code>:</strong> وهو رَقَمٌ صَحيحٌ من الصِّفْرِ إلى الحدِّ الـمَعلوم (0–65535) -أي ما يمكن تمثيله ببايتين من الارقام-، يُميَّزُ به مَغْزى الحدث وكيف يُعمل به. فالنوع (0) يدل على البيانات الوصفية للمؤلف (metadata). أما النوع (1) فللمنشور العابر، والنوع (3) يمثل قائمة المتابعين. وما زادَ عن ذلك فَمَتْروكٌ لِأهلِ التَّوْسِعةِ والإبتكار.</p></li> <li><p><strong><code>tags</code>:</strong> وهي مصفوفةٌ تَنْطوي على مصفوفاتٍ من النصوص، تُستعمل للإشارات (Mentions)، والردود، والموضوعات، والبيانات الهيكلية الأخرى. فما كُتب فيه الحرف e  فإحالةٌ على حَدَثٍ مَضى، مثل:</p></li></ul> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">e</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">&lt;event-id></span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>وما كُتِبَ فيه الحرف p  فيشير إلى مستعمل معين. مثل:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">p</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">&lt;pubkey></span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <ul><li><p><strong><code>content</code>:</strong> مضمون الحدث. فإن كان الحدث من النوع (1) فالمضمون هو نص الملاحظة؛ وإن كان نوعه (0) فهو كائن JSON يحتوي على الاسم، وترجمة المؤلف، ورابط صورته، وما شابه.</p></li> <li><p><strong><code>sig</code>:</strong> توقيعٌ رقمي بطريقة “شنور” (Schnorr) يَقَعُ في أربعةٍ وسِتِّينَ بايت، ويُجرى على مجمل القيمة المُبلّدَة (Hash) للحدث.</p></li></ul> <h4>حساب مُعرف الحدث (event ID)</h4> <p>هذا رَقَمٌ لا تَمُنُّ بِهِ الخَوادِمُ والـمَراكز، <strong>بل هو نَبْتُ النَّصِّ وفَيْضُ الحدث</strong> ، يُشْتَقُّ مِنْ صَميمِ الحَدَثِ وجَوهره، ويمنعُ أيدي العبثِ أَن تتطرَّقَ إِلى مظهره مما يجعله معنوناً بالمحتوى (Content-addressable).</p> <ul><li><strong>المرحلة الأولى — الصياغة المعتمدة (Canonical serialization):</strong> تُنشأ مصفوفةُ JSON مَحْبوكَةٌ على هذا المثال:</li></ul> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#8F3F71;--shiki-dark:#D3869B">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> pubkey</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> created_at</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> kind</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> tags</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> content</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>وقُدِّمَ الصفر (<code>0</code>) في أول المصفوفة ليُميزَ هذا النَسَق عن أي نسق آخر. والأحكام في هذا الباب شديدةٌ صارمة: استعمال ترميز UTF-8 المضغوط، وإزالة الفراغات الزائدة، والالتزام برموز التهريب الستة المعروفة لضبط الحروف (<code>\f</code> ،<code>\b</code> ،<code>\t</code> ،<code>\r</code> ،<code>\n</code> ،<code>\"</code> ،<code>\\</code>).</p> <ul><li><p><strong>المرحلة الثانية — التبليد (Hash):</strong> تُؤخذ أقسام تلك المصفوفة المُنقحة، فتُبلّد بSHA-256، فيكون ذلك الرقم الست عشري هو المُعرّف (<code>id</code>).</p></li> <li><p><strong>المرحلة الثالثة — التوقيع (Sign it):</strong> يُحسب توقيع “شنور” على ذلك المعرف بالمفتاح الخاص للمؤلف (secp256k1 private key)، لينتج عن ذلك حقل التوقيع (<code>sig</code>). ولما كانت قيمة المعرف هي عين ما وقع عليه التوقيع (<code>id == sig_input</code>)، فإن التحقق من صحة التوقيع يُثبت سلامة المعرف من التلاعب.</p></li></ul> <h4>مزايا هذا التصميم</h4> <ul><li><p><strong>الاستغناء عن الخوادم الموثوقة:</strong> إذ بمقدور كل ذي لُب أن ينظر في المفتاح والتوقيع فيتأكد من صحة الحدث.</p></li> <li><p><strong>العنونة بالمحتوى:</strong> يتغير المعرف إذا تغير أي حقل في الحدث، فيظهر أي تزوير.</p></li> <li><p><strong>إحكام قواعد الصياغة:</strong> لو أن عميلين (Clients) صاغا الحدث ذاته بسلسلتين مختلفتين من البايتات، لأنتجا معرفين مختلفان؛ فجاءت قواعد التهريب لتسد الثغرة وتضمن تطابق المعرفات.</p></li></ul> <h3>تفصيل القول في الوسوم (Tags in depth)</h3> <p>الوسوم هي الحِبال التي تصل الأحداث بالأشياء الأخرى — سواء كانت أحداثاً أخرى، أو مستعملين، أو محتويات معنونة. وما الوسم إلا مصفوفة من النصوص، تعلو مزيتها من ترتيب مواقعها:</p> <ul><li><p><strong>الموقع 0:</strong> هو اسم الوسم، أي مفتاحه (Key). وللأسماء المؤلفة من حرف واحد مثل (<code>e</code>, <code>p</code>, <code>a</code>) مكانة خاصة؛ إذ تُجبَر الـمُرَحِّلات (Relays) على فهرستها لتصير يسيرة الإستعلام. أما ما زاد عن حرف مثل (<code>alt</code>) فلا تُفَهرس.</p></li> <li><p><strong>الموقع 1:</strong> هو قيمة الوسم وجوهره، وعليه وحده تقع الفهرسة في المرحلات.</p></li> <li><p><strong>الموقع 2 وما زاد عليه:</strong> سياق زائد لم يُوضع له اسم، يُستعان به. عادةً لذكر وَصلة مرحل أو تلميحات للمفتاح العام للمؤلف.</p></li></ul> <h4>الوسوم الثلاثة المعتمدة</h4> <p><strong>الوسم<code>e</code> — للإحالة على حدث معلوم:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">e</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> &lt;event-id</span><span style="color:#CC241D;--shiki-dark:#CC241D"> hex></span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> &lt;relay</span><span style="color:#CC241D;--shiki-dark:#CC241D"> URL</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> optional></span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> &lt;author</span><span style="color:#CC241D;--shiki-dark:#CC241D"> pubkey</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> optional></span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>يُستعمل هذا في الردود، وإعادة النشر، والتفاعلات، ولكل ما يشير إلى حدث معين عبر مُعرّفه (<code>id</code>). ورابط المُرَحِّل إختياري يُرشد إلى مكان ذلك الحدث، كما أن المفتاح العام تلميحٌ يغني عن البحث عن مفتاح المؤلف.</p> <p><strong>الوسم<code>p</code> — الإحالة إلى مستعمل:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">p</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> &lt;pubkey</span><span style="color:#CC241D;--shiki-dark:#CC241D"> hex></span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> &lt;relay</span><span style="color:#CC241D;--shiki-dark:#CC241D"> URL</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> optional></span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>يُستخدم للإشارة إلى مستعمل أو تنبيهه. وتُشير وَصلةُ المُرَحِّل إلى حيث ينشر هذا المستعمل بياناته، وتستعين برامج العملاء بهذا الحقل لإظهار الإشارات (@mentions) وإرسال الإشعارات.</p> <p><strong>الوسم<code>a</code> — الإحالة إلى حدث معنون أو مُستبدل:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">a</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">&lt;kind>:&lt;pubkey>:&lt;d-tag value></span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> &lt;relay</span><span style="color:#CC241D;--shiki-dark:#CC241D"> URL</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> optional></span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">   // حدث معنون</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">a</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">&lt;kind>:&lt;pubkey>:</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D">             &lt;relay</span><span style="color:#CC241D;--shiki-dark:#CC241D"> URL</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> optional></span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">   // حدث مُستبدل (النقطتان الإلزاميتان في النهاية)</span></span></code></pre> <p>بخلاف الوسم <code>e</code> الذي يشير إلى حدث واحد لا تتغير قيمته المرمزة، يشير الوسم <code>a</code> إلى حدث منطقي، وهو يُحددُ بـ (النوع + المفتاح العام + قيمة الوسم d). فتقوم الـمُرَحِّلات بتقديم آخر حدث يطابق هذه التجميعة. والنقطتان في المُستَبدَل أمرٌ لازم، إذ بهما يُمَيَّز الحدث المُستَبدَل -بغياب الوسم d- وبين الحدث المُعَنون.</p> <h4>عُرْف الفهرسة</h4> <p>كل وَسمٍ كان اسمه -أي مفتاحه- حرفاً فرديا لاتينياً (a–z, A–Z) وجب على الـمُرَحِّلات فهرستُه. وبهذا تصح التصفية والإستعلام. مثل</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">{</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#689D6A;--shiki-dark:#689D6A">#e</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> [</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">5c83da...</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]}</span></span></code></pre> <p>، إذ تطلب من المُرحل كل حدثٍ فيه الوسم <code>e</code> وقيمته مُعرّف ذاك الحدث. واعلم أن الفهرسة لا تقع إلا على <strong>الموقع 1</strong> -أي القيمة- دون باقي الحقول.</p> <p>أما ما كان متعدد الحروف من الوسوم مثل <code>alt</code> و<code>title</code> و<code>summary</code>، فله معنى عند العملاء مفهوم، لكنه عند المرحلات غير مفهرس، ولا يستعمل في التصفية والإستعلام.</p> <h5>مفهوم الفهرسة لدى الـمُرَحِّلات</h5> <p>ما <strong>الـمُرَحِّل</strong> إلا خادم يجمع الأحداث ويصونها، ويقدمها للعملاء الذين يطلبونها. وأعظم عمل المرحل أن يُجيب عن الإستعلامات بسرعة وعجل.</p> <p>فإذا فهرس المرحل وسما، جعل له <strong>جدول مراجعة فورية</strong> (Lookup table) لقيمة ذلك الوسم — يشبه فهارس قواعد البيانات — ليُجيب على عجل عن سؤال: “هات كل الأحداث التي ارتبط وسمها بهذه القيمة”، من غير أن يمر على كل حدث مخزون عنده.</p> <h5>الطريق البطيئة عند غياب الفهرس</h5> <p>لو سأل العميل الـمُرَحِّل: “أوجد لي كل حدث ذُكر فيه المفتاح العام <code>س</code>”، ولم يكن هناك فهرس معلوم، لوجب على المرحل أن:</p> <ol><li><p>يقرأ كل حدث مخزن عنده.</p></li> <li><p>يَفُكَّ مصفوفة الوسوم (<code>tags</code>) لكل حدث.</p></li> <li><p>ينظر هل فيها وسم من نوع <code>p</code> يشير إلى المفتاح <code>س</code>.</p></li> <li><p>يجمع المُطابق بعد طول العمل.</p></li></ol> <p>وهذا لعمري في زمن الملايين من الأحداث بطيءٌ لا يُعمل به.</p> <h5>الطريق السريعة مع وجود الفهارس</h5> <p>يحفظ المرحل جدولاً منفصلاً يجري فيه الأمر على هذا المثال:</p> <table><thead><tr><th>مفتاح الوسم</th><th>قيمة الوسم</th><th>معرف الحدث</th></tr></thead><tbody><tr><td><code>e</code></td><td><code>5c83da77…</code></td><td><code>aabbcc…</code></td></tr><tr><td><code>p</code></td><td><code>f7234bd4…</code></td><td><code>aabbcc…</code></td></tr><tr><td><code>p</code></td><td><code>f7234bd4…</code></td><td><code>ddeeff…</code></td></tr></tbody></table> <p>فإذا أرسل العميل مصفاة استعلام نصها</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">{</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#689D6A;--shiki-dark:#689D6A">#p</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> [</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">f7234bd4…</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]}</span></span></code></pre> <p>نظر المرحل في الجدول نظرة واحدة، فيعيد المعرّفات المطابقة في لمح البصر.</p> <h5>لِـمَ اقتصرت الفهرسة على الحروف الفردية؟</h5> <p>ذلك شرط مقصود لضمان <strong>التوسعية</strong> (Scalability contract) صِيغَ في المعيار NIP-01. إذ يجب على الـمُرَحِّلات أن لا تفهرس إلا ما كان من حرف لاتيني واحد (<code>a</code>–<code>z</code> ،<code>A</code>–<code>Z</code>). وهذا يجعل حجم الفهرس محدودا معلوما، فلو فُهرس كل وسم كثير الحروف مثل</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">title</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">…</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>أو</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">summary</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">…</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>لكبر الفهرس وضاقت المساحة. فكانت القاعدة الحاكمة:</p> <ul><li><p><strong>وسم من حرف واحد</strong> (<code>e</code>, <code>p</code>, <code>a</code>, <code>r</code>, <code>t</code>…) ← <strong>وجب</strong> على المُرَحِّل فهرسة قيمته← <strong>ويمكن</strong> للعميل التصفية بناءً عليه.</p></li> <li><p><strong>وسمٌ متعدد الحروف</strong> (<code>alt</code>, <code>title</code>, <code>summary</code>…) ← يُخزنه المُرَحِّل داخل الحدث (JSON) <strong>لكن لا يفهرسه</strong> ← والعميل لا <strong>يقدر على التصفية به</strong> ، بل يقرؤه بعد جلب الحدث.</p></li></ul> <h5>الفهرسة للموقع الثاني فقط</h5> <p>حتى في الوسوم الـمُفهرسة، فلا تُفهرس إلا <strong>قيمة الوسم</strong> (الموقع 1)، وَصلة المُرَحِّل أو تلميح المؤلف الموجود في المواقع اللاحقة. فالوسم <code>["e", "5c83da…", "wss://relay.example.com"]</code> يُفهرس تحت المفتاح <code>e</code> والقيمة <code>5c83da…</code> حصراً، ويُهمل رابط المُرَحِّل من الفهرسة.</p> <p><em>وخلاصة القول: أن الفهرسة هي التي تحوّل المُرَحِّل من مخزن أعمى للأحداث إلى قاعدة بيانات مرنة ومُستَعلمَه، وأن عُرف الحرف الواحد هو الذي يضمن هذا العمل عند الإتساع.</em></p> <h3>أنواع الأحداث (Event Kinds)</h3> <p>أما حقل <strong>النوع</strong> (Kind) فهو إعلان الحدث عن نوعه وصفته، يخبر العملاء <em>بمعنى هذا الحدث وكيف تكون هيئته</em> ، كما يخبر نوع الـ MIME المتصفح كيف يعامل الملف المطروح. ولولا الأنواع لكان كل حدث مبهماً لا يُعرَفُ له عمل.</p> <p>والحقيقة هنا أن <strong>الوسوم تتبع النوع</strong> ، فالوسم <code>"r"</code> في حدثٍ من النوع (1) قد يعني “هذا المنشور هو رد على سلسلة المنشورات (thread) <code>س</code>”، لكنه في النوع (10002) يعني “هذا هو المُرَحِّل الذي اُستعمل”. فالنوع هو من يمنح الوسوم معناها ووظيفتها.</p> <h4>النوع 0 — بياناتُ وصفٍ للمؤلف</h4> <p>هو النوع الوحيد الذي يتولى المعيار NIP-01 بيانه. وحقل المحتوى (<code>content</code>) فيه كائن جيسون JSON:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">{</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#689D6A;--shiki-dark:#689D6A">name</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">alice</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#689D6A;--shiki-dark:#689D6A">about</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">builds on nostr</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#689D6A;--shiki-dark:#689D6A">picture</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">https://…</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">}</span></span></code></pre> <p>وهو <strong>مُستَبدَل</strong> -كما سيأتي-، فلا يحفظ المرحل إلا آخر ما كُتب لكل مفتاح عام. فنشر حدث جديد من النوع (0) هو تحديث لوصف حسابك.</p> <h4>سلوكيات التخزين الأربعة</h4> <p>لم يقم المعيار بتعريف كل رقم نوع، بل جعلها في أربعة نطاقات تدل المرحل كيف يكون الخزن والإمتثال. وهذا هو العهد بين ناشر الحدث وصاحب المرحل:</p> <ul><li><p><strong>المنتظم (Regular):</strong> يُخزن فيه كل شيء إلى الأبد (ما دام ذلك في سياسة المُرَحِّل). فما كتب فيه فهو سجلٌ دائم. ومثاله: النوع 1 (المنشورات)، والنوع 4 (الرسائل الخاصة).</p></li> <li><p><strong>المُستَبدَلة (Replaceable):</strong> لا يُحفظ إلا آخر حدثٍ اجتمع فيه (المفتاح العام + النوع). وما قدُمَ من النُسَخ فمصيره الحذف والزوال. فليس للمستعمل سوى بيانات وصف واحدة (النوع 0)، وقائمة متابعة واحدة (النوع 3)، فنشر الجديد يقضي على القديم.</p></li> <li><p><strong>العابر (Ephemeral):</strong> لا يُطالب المرحل بخزن هذه الأحداث بتاتاً، فهي رسائل تُرسل للحظتها وتُستعمل للإشارات اللحظية مثل مؤشرات الكتابة أو بيان الحضور الحي، وإن فاتك النظر فيها فقد مضت وانقضت.</p></li> <li><p><strong>المُعنوَن (Addressable):</strong> هو كالمُستَبدَل، غير أن مفتاح التمييز فيه يتألف من تجميعة: <code>النوع + المفتاح العام + قيمة الوسم d</code> بدلاً من النوع والمفتاح العام فقط. فيكون الوسم <code>d</code> بمنزلة المعرّف الخاض، مما يتيح للمفتاح العام الواحد أن يمتلك <strong>أحداث متعددة</strong> مُعنوَنَه من نفس النوع — ومثاله: المقالات الطويلة (النوع 30023)، حيث لكل مقالة قيمة <code>d</code> مختلفة. ولا يُحفظ إلا آخر نسخة لهذا الثلاثي المذكور (النوع + المفتاح العام + d).</p></li></ul> <h4>فض النزاع وتساوي الزمان</h4> <p>إذا استوى حدثان من النوع المُعنوَن أو المُستَبدَل في زمن الإنشاء (<code>created_at</code>)، قدّم المرحل ذلك الذي يسبق رقمه في <strong>الترتيب المعجمي</strong> -أي الرقم الست عشري الأقل-. وهذا حُكمٌ حتمٌ لتجتمع المرحلات كلها على فائز واحد من غير حاجة لمشاورة أو تنسيق.</p> <h4>سلوك الطلب (REQ) في الأحداث المُستَبدَلة</h4> <p>متى طلب العميل مِثلَ:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">{</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#689D6A;--shiki-dark:#689D6A">kinds</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> [</span><span style="color:#8F3F71;--shiki-dark:#D3869B">0</span><span style="color:#7C6F64;--shiki-dark:#A89984">],</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#689D6A;--shiki-dark:#689D6A">authors</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">:</span><span style="color:#7C6F64;--shiki-dark:#A89984"> [</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">&lt;pubkey></span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]}</span></span></code></pre> <p>فلا يعطيه المرحل إلا آخر نسخة باقية عنده - حتى لو كان يحفظ القديم منه-، وبهذا يسلم العميل من عناء إسقاط المكرر بنفسه.</p> <div class="panzoom-wrapper svelte-ay6ag8" style="height: 280px"><div><!--[--><img src="/assets/posts-images/nostr/nostr_nip01.svg" alt="diagram"/><!--]--></div></div><!----> <h2>بيان التواصل بين العميل والمُرَحِّل (Client ↔ Relay communication)</h2> <p>هذا هو باب <strong>الطريقة والتعامل</strong> لمعيار نوستر - كيف يقع الحديث بين العملاء والمرحلات عبر قنوات “ويب سوكت” (websocket). ما مضى كان في صفة البيانات ونعتها، أما هذا ففي كيفية سوقها ومدها.</p> <h3>وسيلة النقل: قناة ويب سوكت واحدة لكل مُرَحِّل</h3> <p>يفتح العميل قناة واحدة مستمرة مع كل مرحل، ويسوق عبره كل مطالبه من الإشتراكات والنشر. وهذا مقصود للتخفيف، إذ هو أقل كلفة من فتح قناة جديدة مع كل سؤال، وبه يقدر المرحل على ضبط الحدود لكل متصل، مِثل حد السرعة وأعلى رقمٍ للإشتراكات.</p> <h3>من العميل إلى المُرَحِّل: ثلاثة أنواع من الرسائل</h3> <p><strong><code>EVENT</code> — نشر حدث:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">EVENT</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> {</span><span style="color:#CC241D;--shiki-dark:#CC241D"> ...event</span><span style="color:#CC241D;--shiki-dark:#CC241D"> object...</span><span style="color:#7C6F64;--shiki-dark:#A89984"> }]</span></span></code></pre> <p>يدفع العميل بالحدث المُوَقَعِ إلى حِمى المرحل، فينظر فيه المرحل ويرد بالقبول والإمتثال <code>OK</code>.</p> <p><strong><code>REQ</code> — الطلب والاشتراك:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">REQ</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">sub1</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> {</span><span style="color:#CC241D;--shiki-dark:#CC241D"> ...filter...</span><span style="color:#7C6F64;--shiki-dark:#A89984"> },</span><span style="color:#7C6F64;--shiki-dark:#A89984"> {</span><span style="color:#CC241D;--shiki-dark:#CC241D"> ...filter...</span><span style="color:#7C6F64;--shiki-dark:#A89984"> }]</span></span></code></pre> <p>في هذه الرسالة يقع أمران معاً: يجري المرحل <strong>إسعلاما في الماضي المخزون</strong> ليرد بما طابق المِصفاة من الأحداث، وينشئ اشتراكا <strong>حياً موصولاً</strong> ليدفع بكل ما يأتي في المستقبل حتى يقع الإلغاء. ومعرّف الاشتراك (<code>subscription_id</code>) نصٌ يختاره العميل -لا يزيد عن 64 حرفاً- ليجعل هذا الاشتراك خاصا بهذه القناة وحدها.</p> <p>وإذا أُرسل طلبٌ جديد <code>REQ</code> يحمل <strong>نفس</strong> معرّف الاشتراك القائم، فإنه يحل محله ولا يكون اشتراكا ثانيا.</p> <p><strong><code>CLOSE</code> — إغلاق الاشتراك:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">CLOSE</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">sub1</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>يقول فيه العميل للمرحل: كفى، واقطع مدد هذا الإشتراك. ويستعمل هذا عند انتقال المرء عن صفحته أو تبديل جلسته.</p> <h4>المصافي: لغة الاستعلام (Filters)</h4> <p>المصفاة هي النعت الذي يصف به العميل <em>ما يطلب من الأحداث</em>. وكل حقل يُذكر فيها يجري مع غيرة بمنطق الجمع والتقييد (<strong>AND</strong>). أما المصافي المتعددة في طلب واحد <code>REQ</code> فتجري بمنطق التخيير (<strong>OR</strong>). فطلب</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">REQ</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">s1</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> filterA</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#CC241D;--shiki-dark:#CC241D"> filterB</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>يعني: “هات ما يطابق المصفاة الأولى <strong>أو</strong> المصفاة الثانية”.</p> <table><thead><tr><th>الحقل</th><th>معناه</th><th>منطق المطابقة</th></tr></thead><tbody><tr><td><code>ids</code></td><td>معرفات الأحداث</td><td>أن يكون معرّف الحدث في القائمة</td></tr><tr><td><code>authors</code></td><td>المفاتيح العامة</td><td>أن يكون المفتاح العام للحدث في القائمة</td></tr><tr><td><code>kinds</code></td><td>أرقام الأنواع</td><td>أن يكون نوع الحدث في القائمة</td></tr><tr><td><code>#e</code>, <code>#p</code>, <code>#x</code>…</td><td>مصفاة الوسم (أي حرف فردي)</td><td>أن يحوي الحدث قيمة وسم تطابق واحدة على الأقل</td></tr><tr><td><code>since</code></td><td>طابع زمني بنظام يونكس</td><td>أن يكون زمن الحدث بعده أو يساويه (<code>created_at >= since</code>)</td></tr><tr><td><code>until</code></td><td>طابع زمني بنظام يونكس</td><td>أن يكون زمن الحدث قبله أو يساويه (<code>created_at &lt;= until</code>)</td></tr><tr><td><code>limit</code></td><td>العدد المحدود</td><td>للبحث في الماضي فقط — هات عدداً من الأحداث الأحدث فالأحدث</td></tr></tbody></table> <p>واعلم أن العدد المحدود (<code>limit</code>) <strong>إنما يكون للفيض المخزون الأول فقط</strong> ، ولا أثر له في الأحداث الحية التالية. وإذا تساوى حدثان في الزمان، قدم الأقل رقما في الترتيب المعجمي كما مضى.</p> <p>ويشترط في قيم <code>ids</code> و<code>authors</code> و<code>#e</code> و<code>#p</code> حروفا ست عشرية صغيرة بالغة 64 حرفا بالتمام، لا مجال فيها للنقصان.</p> <h3>من المُرَحِّل إلى العميل: خمسة أنواع من الرسائل</h3> <p><strong><code>EVENT</code> — سوق الحدث:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">EVENT</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">sub1</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> {</span><span style="color:#CC241D;--shiki-dark:#CC241D"> ...event</span><span style="color:#CC241D;--shiki-dark:#CC241D"> object...</span><span style="color:#7C6F64;--shiki-dark:#A89984"> }]</span></span></code></pre> <p>يرسلها المرحل لكل حدث طابق الإشتراك القائم، سواء كان من الماضي أو من الحاضر. وتكون موسومة بمعرّف الاشتراك (<code>subscription_id</code>) ليعرف العميل صاحبها.</p> <p><strong><code>EOSE</code> — نهاية الأحداث المخزنة (End of Stored Events):</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">EOSE</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">sub1</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>إشارة برمجية له شأن جليل، فإذا أفاض المرحل كل ما لديه من الماضي، بعث هذه الإشارة <code>EOSE</code>. فما كان قبلها فهي بيانات الماضي، وما كان بعدها فهي بيانات الحاضر. وبها يعلم العميل متى يوقف دوارة الإنتظار (Loading spinner) ليفتح المعاينة الحية.</p> <p><strong><code>OK</code> — صك القبول أو الرفض:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">OK</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">&lt;event_id></span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> true</span><span style="color:#CC241D;--shiki-dark:#CC241D">|</span><span style="color:#8F3F71;--shiki-dark:#D3869B">false</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">&lt;message></span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>تأتي جوابا على كل حدث رفعه العميل. فإما القيمة المنطقية (Boolean) فتقول: قُبِلَ أو رُفضَ. فإذا كان رفضاً، بدأت الرسالة بلفظٍ مفهوم للآلة مثل (<code>blocked:</code> أو <code>rate-limited:</code> أو <code>pow:</code> أو <code>invalid:</code> أو <code>restricted:</code> أو <code>duplicate:</code> أو <code>mute:</code> أو <code>error:</code>) يليه بيان يفهمه الإنسان. وإن كان قبولاً، فقد تأتي الرسالة فارغة أو فيها نُصحٌ مخصوص (مثل: القيمة <code>true</code> مع نص <code>"duplicate: already have this event"</code>، فيعني أنه مقبول لكنه معلوم من قبل).</p> <p><strong><code>CLOSED</code> — قطع الإشتراك من قِبل المُرَحِّل:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">CLOSED</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">sub1</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">&lt;message></span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>وفيها يقوم المرحل بإماتة الإشتراك - إما لرفضه الطلب <code>REQ</code> أول الأمر، أو لأن الإشتراك أمسى خاملا بلا حراك، أو لأن المرحل نفسه يهم بالإغلاق. ويجري فيها لفظ البدء كما جرى في رسالة الـ <code>OK</code>. وحينها لا ينتظر العميل أي حدث آخر لذا الإشتراك.</p> <p><strong><code>NOTICE</code> — إشعار نصي عام:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#076678;--shiki-dark:#83A598">NOTICE</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">,</span><span style="color:#7C6F64;--shiki-dark:#A89984"> "</span><span style="color:#076678;--shiki-dark:#83A598">welcome to relay.example.com</span><span style="color:#7C6F64;--shiki-dark:#A89984">"</span><span style="color:#7C6F64;--shiki-dark:#A89984">]</span></span></code></pre> <p>نصٌ مُطلقٌ حُرّ؛ لا تنسيقا قياسيا له أو معالجة برمجية محددة. تأخذ به المرحلات لنشر التحايا، أو التحذير من الخطايا، أو بيان العلل (Debug info). وللعميل أن يعرضه للناس أو يطويه فلا يذكره.</p> <div class="panzoom-wrapper svelte-ay6ag8" style="height: 380px"><div><!--[--><img src="/assets/posts-images/nostr/nostr_nip01_communication.svg" alt="diagram"/><!--]--></div></div><!----><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[الشاشة السوداء]]></title>
            <link>https://motaz.cc/rss.xml/blog/2026-03-07-الشاشة-السوداء</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2026-03-07-الشاشة-السوداء</guid>
            <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[حدّثني قلبي بحديثٍ طريف، وذكّرني بأمرٍ قديمٍ لطيف؛ وذلك أنّي كنتُ يومًا في معمل الحواسيب زمنَ الإبتدائية، في حصّةٍ تُدعى «الكمبيوتر»، ونحن صِبيةٌ بين ...]]></description>
            <content:encoded><![CDATA[<!--[--><p>حدّثني قلبي بحديثٍ طريف، وذكّرني بأمرٍ قديمٍ لطيف؛ وذلك أنّي كنتُ يومًا في معمل الحواسيب زمنَ الإبتدائية، في حصّةٍ تُدعى «الكمبيوتر»، ونحن صِبيةٌ بين لعبٍ ولهوٍ وسُرور. فهذا قد أطرق رأسه إلى كانسة الألغام (Minesweeper) ينقّب عن الألغام ، وذاك قد ألقى أوراقه في <a href="https://en.wikipedia.org/wiki/Microsoft_Solitaire" rel="nofollow">بسوليتير</a> — وكنا نسميها «البطّة» — وثالثٌ يضرب الكُرات في لعبة ”<a href="https://en.wikipedia.org/wiki/Full_Tilt!_Pinball#3D_Pinball_for_Windows_%E2%80%93_Space_Cadet" rel="nofollow">بين بوول</a>”. وأمّا أنا فكنتُ جالسًا أتفرّج كعادتي، لأن في المعمل اثني عشر جهازًا لا يعمل منها إلا أربعة! وربما كانت تعمل كلّها، غير أنّها — كعادة مدارسنا وجامعاتنا — تُركن في الزوايا حتى يفسدها الزمان، فلا تُمسّ ولا تُستعمل حتى إذا خربت قالوا: قد خربت! وكان الصبية يتسابقون إلى الأجهزة تسابق الخيل إلى الميدان، وأما أنا فعادتي كراهية السباق، فأقعد حيث أقعد، وأرقب ما يجري وإذا سنحت فرصة العب.</p> <p>وبينما المعلمة تشرح لنا كيف نفتح البرامج من قائمة «إبدأ» في ويندوز إكس بي، التفتت إلينا وقالت: أتدرون كيف كنّا نشغّل التطبيقات قديمًا؟ أتدرون كيف كانت الحواسيب؟ قلنا: وكيف كانت؟ قالت: كانت مجرّد شاشةٍ ومفاتيح! قلنا: وما الغريب في هذا؟ فنحن لا نرى غير شاشةٍ ومفاتيح! قالت: بل كانت الشاشة سوداءَ، لا ألوان فيها ولا نوافذ، ولا قائمة «إبدأ» تُعين وتُرشد. فقلنا — وقد اتسعت أعيننا دُهشًا —: وكيف تُشغّلون التطبيقات والألعاب بلا قائمة «إبدأ»؟ قالت: كنّا نكتب اسم التطبيق أو اللعبة بالإنجليزية، فتعمل. وكان لازم حفظ أسماء البرامج كلّها عن ظهر قلب! فعندها بُهتُّ دُهشًا، ووقفتُ حائرًا بين العجب والاستغراب، وقلت في نفسي: كيف يُشغَّل تطبيقٌ بلا «إبدأ»؟ وكيف يحفظ البشر أسماء كلّ تلك التطبيقات والألعاب؟ وبالإنجليزية أيضًا! فلبثتُ أعوامًا وأنا أذكر قولها ذكرَ المتعجّب، حتى دخلتُ الجامعة، فعرفتُ جنو/لينكس، وصاحبتُ الترمينال، وألِفتُ باش وسطر الأوامر.</p> <p>وها أنا ذا اليوم أقضي أكثر أوقاتي في تلك الشاشة السوداء التي كنتُ أستغربها! وعندها فقط فهمتُ سرّ كلام المعلمة، وعلمتُ أنّها كانت تقصد نظاما قديما يُدعى مايركوسوفت دوز MS-DOS وسطر الأوامر فيه. 😄</p><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[نوستر. مشكلاتٌ معقدة وحلٌ يسير]]></title>
            <link>https://motaz.cc/rss.xml/blog/2026-02-16-نوستر.-مشكلاتٌ-معقدة-وحلٌ-يسير</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2026-02-16-نوستر.-مشكلاتٌ-معقدة-وحلٌ-يسير</guid>
            <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[أستفتح القول بخلاصةٍ موجزةٍ تُبيّن كيف أنّ دافع الربح لدى شركات الإنترنت يُنشئ منظومةً من الحوافز، تُفضي — من حيث تشعر أو لا تشعر — إلى الرقابة ورأسما...]]></description>
            <content:encoded><![CDATA[<!--[--><p>أستفتح القول بخلاصةٍ موجزةٍ تُبيّن كيف أنّ دافع الربح لدى شركات الإنترنت يُنشئ منظومةً من الحوافز، تُفضي — من حيث تشعر أو لا تشعر — إلى الرقابة ورأسمالية المراقبة، فتضرّ بالمستعملين، وتُنقِص من قيمة ما تزعم تلك الشركات أنّه جوهرُ منفعتها.ثم أعطفُ على ذلك ببيان ماهيّة الحلّ الذي يقدّمه معيار «نوستر»، وما طبيعته وحدوده.</p> <h2>التجارة في المُراقبة والتجسس</h2> <p>صُمِّم <strong>نوستر</strong> في بداياته ليقاوم الرقابة. غير أنّ هذه الغاية ليست إلا شُعبةً من شُعبه. فـنوستر إنما وُضع ليزيد الحريات الرقمية للمستعملين: كالخصوصية، وحقّ الوصول إلى المعلومات، و«<a href="https://newsletter.squishy.computer/p/credible-exit" rel="nofollow">الخروج الموثوق</a>» — أي القدرة على المغادرة دون أن تُحتجز رهينة منصةٍ بعينها. ولمّا اعتُنِق علم التعمية في أول أيامه اعتناقًا مؤسسيًا في الغالب، اختلّ ميزان الشبكة، فلم تعد مع مصالح مستعمليها، بل استحوذت عليها «المنصّات»، فأضحت هي الحَكَمَ والقيّمَ والمالكَ للمفاتيح. ومن ثَمَّ نشأ حالٌ من اقتناص الريع، حيث يُستغلّ المستعملون — وهم صانعو القيمة كلّها — ويُنتقَص منهم، ويُوجَّه سلوكهم، ويُضلَّل وعيهم، وتُباع بياناتهم، على أيدي أوصياء تلك القيمة وحُرّاسها. وذلك بونٌ بعيدٌ عن الحلم الإنساني الذي راود روّاد الإنترنت الأوائل كما عبّر عنه «<a href="https://www.scientificamerican.com/article/long-live-the-web/" rel="nofollow">تِم برنارد لي</a>»:</p> <blockquote><p>«إننا من ننشئ الشابِكة، معاييرها وبرمجياتها، ويقع هذا الأمر علينا. فنحن نختار الخصائص التي نرغب أن تتحلّى بها، وتلك التي لا نريد. وإن غاية الشابِكة أن تخدم الإنسان. ونحن نشيّدها اليوم ليأتي من بعدنا غدًا فيبتكروا فوقها ما قد لا يخطر لنا على بال».</p></blockquote> <p>في الأعوام الخمس عشرة التي تلت ذلك القول، لم يزدد الإنترنت إلا افتراسًا واحتكارًا. فأينما توجّهتَ لُوحِقَ أثرُك، تُرصَد حركاتك وسكناتك — تارةً بذريعة فهم سلوكك لعرض الإعلانات، وتارةً لأغراضٍ اُخَر — غير أنّ المصلحة تعود إلى من يُمسك بأدوات التتبّع. وليس في هذا إنكارٌ لفضل الإنترنت، فهو أنجح تقنيةٍ في تاريخ البشر في زيادة الوصول إلى المعلومات، وبناء المجتمعات الإفتراضية، وتيسير التبادل والتجارة. لكنه مع ذلك ليس على الصورة التي ينبغي أن يكون عليها. وإن إصلاح نهج الإنترنت يقتضي استثمارًا واعيًا من أولئك الذين لهم أعظم نصيبٍ من الغنم أو الغرم في تطوّره: المستعملين أنفسهم. فلا أحد سينهض بهذه المهمّة نيابةً عنّا، بل نحن من ينبغي أن يتحمّل مسؤوليتها، وأن يُعيد تشكيل الشبكة بما يخدم الإنسان، لا بما يستنزفه. وليست الرقابة ثمرةَ نزوةٍ عابرةٍ في استعمال السلطة، بل هي — في جوهرها — وليدةُ الحوافز. ففي الأنظمة الاستبدادية تُمارَس الرقابة صونًا لبقاء النظام، وفي التجارة تُمارَس صونًا للإيراد واستقرار العائد.</p> <p>في النماذج التقليدية، يُباع المنتج مباشرةً للعميل، فيحصل على السلعة أو الخدمة التي دُفع ثمنها. ويمكن لهذا النموذج أن ينتقل — إلى حدٍّ ما — إلى ميدان المنتجات القائمة على المعلومات، ولا سيما في سياق التعامل بين الشركات، حيث تُبرَّر المعلومة بزيادة الإنتاج وتحسين الكفاءة. أمّا استهلاك البرمجيات، فقصتها مختلفة. فإذا كان المستعمل لا يبتغي إلا الترفيه أو التواصل، وكانت الكلفة الحدّية لإنتاج السلع الرقمية تميل إلى الصفر، فإن السعر بدوره يميل إلى الصفر، لأن المنافس يستطيع دائمًا تقديم المنتج ذاته بسعرٍ أدنى. وإذا أضفتَ إلى ذلك ضرورةَ أن تستحوذ المنصّات على المستعملين استحواذًا واسعًا وسريعًا خُفّضَ السعر الابتدائي للمنتج إلى أدنى حدٍّ ممكن. وهنا يظهر ما يُسمّى «تأثير الشبكة»: إذ لا تنمو قيمة الشبكة نموًّا خطيًّا بعدد المستعملين، بل تتضاعف تبعًا لعدد الروابط بينهم.</p> <p>غير أنّ بناء شبكةٍ كبيرة يتطلّب موارد جسيمة لتمويل النمو أو لمجاراة المنافسين. وهذه الموارد يوفّرها أصحاب رؤوس الأموال. ومن ثمّ فإن الشركات التي تعتمد على توسيع تأثير الشبكة تُموَّل غالبًا من المستثمرين، وتُوجَّه بوصلتها نحو تحقيق عائدٍ على الاستثمار. ويندرج في ذلك منصّات التواصل الاجتماعي، ومحركات البحث، والأسواق الرقمية، ومنصّات الترفيه.</p> <p>وأصحاب رؤوس الأموال إنما يبتغون الربح. وقد ذهب «بيتر ثيل» في كتابه «Zero to One» إلى أن أصوب سبيلٍ للربح في السوق هو إقامة احتكار. وبما أنّ احتفاظ المستعملين مرتبط بتأثير الشبكة، فإن بلوغ حالة الإشباع السوقي غايةٌ دائمة، وترتفع «تكلفة الانتقال» إلى منافسٍ آخر، إذ ينبغي للشركات أن «تستحوذ» على مستعمليها، فلا يسهل عليهم الفكاك.</p> <p>وقد بلغتا جوجل وفيسبوك مبلغ الإتقان في هذا الأمر، فهما حاضرتان منذ زمنٍ طويل، بخلاف شركات الجيل الأول من الإنترنت مثل «MySpace» و«Yahoo» و«AOL». لقد تعلّم عمالقة الجيل الثاني كيف يجمعون بين أمرين معًا: الاحتفاظ بالمستعملين وتعظيم العائد منهم في آنٍ واحد. والحقّ أنّ يسيرًا من إيرادات هذه الشركات يأتي من بيعٍ مباشرٍ لخدمةٍ أو اشتراك. إنما تُحوِّل هذه المنصّات المستخدمَ نفسَه إلى سلعة. فلدى المستعمل شيآن يبيعهما: انتباهه وبياناته. ولا تستطيع هذه المنصّات الاتّجار بهذين الموردين إلا لأنها تتوسّط العلاقة، فتملك منفذ الوصول إليهما بحكم موقعها الوسيط. فهي تعيش بإقحام نفسها في العلاقات الخاصة أو العامة، لتستخلص من خلالها تلك الخيرات غير الملموسة.</p> <p>وينجح هذا النموذج لأن أكثر مستعملي الإنترنت إمّا لا يعتقدون أن لإنتباههم أو بياناتهم قيمة تُذكر (فيقول احدهم: «ولِمَ أحتاج إلى الخصوصية؟ ليس لديّ ما أخفيه»)، وإمّا يشعرون بالعجز عن الانفكاك من اقتصاد الانتباه. فمرورك بلوحةٍ إعلانية في طرف بصرك، أو تسجيل المُصوِّرات لرقم مركبتك، لا يبدو — في نظر كثيرين — مماثلًا لدفع رسمٍ شهري لاستعمال الطريق. وسواء أكنت تبالي بتسجيل تحرّكاتك أم لا، فإنك — في الغالب — ستسلك الطريق على أي حال.</p> <p>صحيحٌ أنّ البيانات والانتباه — كلٌّ على حدة — لا يبدوان ذوي قيمةٍ تُذكر. غير أنّ قوّتهما في الاجتماع والتراكم. فـ«البيانات الضخمة» ليست معلوماتٍ متناثرة، بل هي قدرةٌ على استنباط أنماط السلوك والتنبّؤ بها، ثم استعمال ذلك للتأثير في الناس: ماذا يشترون، وبماذا يؤمنون، وكيف يتصرّفون، ولمن يُصوتون.</p> <p>وليس الإعلان محضَ إخبارٍ لمشترٍ راغبٍ بسلعةٍ أو خدمة، بل هو — في جوهره — تكييفٌ للسلوك ليصير قابلًا للتوقّع والقياس. والهندسة الاجتماعية — كسائر ضروب الهندسة — نزّاعةٌ إلى التوسّع والإحاطة ما لم تُكبَح بضابط. وثمنُ التخلّي عن انتباهنا وبياناتنا لهؤلاء الوسطاء الرقميين هو انتقاصُ حريّتنا في الاختيار. ويشتدّ هذا الخطر لأن المستعملين يتلقّون — مع مرور الزمن — خدمةً أقلّ جودةً مقابل زمنهم وانتباههم. فشركات الإنترنت الكبرى، بما لها من وفورات الحجم، تملك القدرة على أن تفرض — على نحوٍ غير متكافئ — كُلفًا من التعقيد على من يخرج عن «ملفّ العميل المثالي» (ideal customer profile) الذي صمّمت أعمالها حوله. فهي تُيسّر الطريق لمن يوافق النموذج، وتُعسّرها على سواه.</p> <p>وكما جاء في <a href="https://happyfellow.bearblog.dev/computational-tyranny/" rel="nofollow">هذه التدوينة</a>:</p> <blockquote><p>لقد نال اللاعبون الكبار — من شركاتٍ وحكومات — ميزةً نظاميةً عظيمة على الأفراد، فهم يضعون القواعد، لكنهم لا يتحمّلون كلفة انكسار تلك القواعد. يزيدون تعقيد الحياة اليومية، ولا يُعاقَبون على ذلك، بل يُكافَأون.</p></blockquote> <p>إن هذا الانحدار ليس قدرًا محتومًا، بل انعكاسٌ للطبيعة البشرية. فكلُّ إنسانٍ يميل إلى نيل الشيء بلا مقابل، وقد آثر كثيرٌ من مستعملي الإنترنت التنازلَ طوعًا عن شيءٍ من إرادتهم مقابل الاتصال والترفيه. غير أنّ المقاومة لا تكفي، فالمشكلة بنيوية، وقد أتاح الزمنُ للمستفيدين منها أن يُحكِموا مواقعهم ويُرسِّخوا نفوذهم.</p> <p>وهذا التحدّي لا يفتقر إلى حلٍّ تقنيّ فحسب. بل تتداخل فيه السياسة والثقافة والمجتمع ورأس المال. ودور «نوستر» أن يقدّم أدواتٍ تمكّن الأفراد من العمل وفق قيمهم ومصالحهم هم. فهو يتيح لمستعملي الإنترنت صون سيادتهم الرقمية، ومساءلة المنصّات التقنية بدل الارتهان لها. وأملي في «نوستر» أن يُسهم في ازدهار الإنسان وتنمية فاعليته في عالمٍ يزداد رقمَنة. وهو لا يحلّ كلّ المشكلات وليس دواءً سحريًا، بل عُدّةُ أدوات يمكن توجيهها إلى النفع أو الضر، غير أنّ فيها خصائصَ أصيلةً باتت الشبكة في أمسّ الحاجة إليها اليوم.</p> <p>وعلاج علل الإنترنت لا يكون إلا بالناس أنفسهم. «فنوستر» ليس نظامًا شاملًا لكبح «الشرّ الرقمي» — إذ إن نظامًا كهذا قد ينزلق هو ذاته إلى الشمولية — بل هو سبيلٌ للفاعلية الفردية والجماعية، كي تُعالَج المشكلات وفق خصوصيات الأفراد والمجتمعات وسياقاتهم المتنوّعة.</p> <h2>معيارٌ يسير وسهل</h2> <p>إنّ «نوستر» — في وجوهٍ كثيرة — حلٌّ «ساذج» لمسألةٍ معقّدة. فالحوافز، وبُنى السلطة، والنُّظم التقنية، عوالمُ متشابكة لا تُدرَك تفاصيلُها إدراكًا تامًّا. غير أنّ ثمّة أنماطًا هيكلية أساسية يقوم عليها الإنترنت الحديث، وهي التي تُمكّن اختلالاته وتُغذّيها.</p> <p>يقوم «نوستر» على فكرةٍ بالغة اليُسر: يُنشئ المستعمل «حدثًا» (event)، وهو بنيةُ بياناتٍ تتضمّن المحتوى، ومفتاحه العام، وتوقيعه الرقمي، وبصمة الحدث (hash)، وبعض المعلومات الأخرى. وما إن يُنشأ الحدث حتى يُرسَل إلى الآخرين عبر «المُرحلات» (relays)، وهي — في أصلها — خوادم «مقابس الشابكة» (WebSocket)، وإن كان يمكن أيضًا نقل الأحداث عبر البلوتوث، أو إرفاقها برسالة بريد رقمي، بل حتى تدوينها وإرسالها بوسيطٍ كيفما اتُفق. ومعيار المُرحلات شديد اليسر. إذ يقتصر غالبًا على إرسال الأحداث واستقبالها ورفضها وطلبها.</p> <p>أما أنواع المحتوى أو «الأنواع» (kinds) التي يصفها المعيار فهي ضعيفةُ الارتباط بعضها ببعض، مما يسمح ببناء طيفٍ واسع من التطبيقات «العملاء» (clients) القادرة على التخاطب فيما بينها. وليس لزامًا على كل تطبيق أن يُنفّذ المعيار كاملًا. «فنوستر» بيئةٌ مثلى لتشييد تطبيقاتٍ صغيرة تؤدّي وظيفةً واحدة، من غير أن تفرض على المستعمل كلفةَ انتقالٍ مُرهِقة. تخيّل — مثلًا — أنك تتابع شخصًا في منصّة تدوينٍ مصغّر، ثم تفتح قارئ المدوّنات لديك، فتجد منشوراته قد ظهرت تلقائيًا. تُظلّل فقرةً وتكتب تعليقًا. ثم تعود إلى منصّة التدوين الأولى، فتجد ردودًا على تعليقك كتبها أناسٌ يتابعونك عبر عشرات التطبيقات الأخرى. تلك ثمرةُ الهيكل المفتوح. وفي وجوهٍ كثيرة، يملك «نوستر» قابليةَ أن يكون ترقيةً لبنية الإنترنت برمّتها. إذ يفصل بين تخزين البيانات (المرحلات)، والهوية (المفاتيح)، والوظيفة (العملاء). وبذلك يسهل تركيب الأجزاء بطرائق جديدة وخلاّقة. وهذه دعوى كبيرة، ولا ريب أنّ ثمّة أمورًا لا يُحسن «نوستر» أداءها.</p> <p>وفي اصطلاح الأنظمة الموزعة، فإن «نوستر» لا يضمن الاتساق (consistency)، لكنه يوفّر قدرًا عاليًا من الإتاحة (availability) وتَحَمّل الانقسام (partition tolerance). هو — في جوهره — ما يشبه قاعدة بيانات موزّعة، تعمل عُقدُها باستقلالٍ تامّ من غير حاجةٍ إلى مُنَسقٍ مركزي. وبنسخ البيانات الموقَّعة ذاتها إلى مرحلات متعدّدة، تبقى متاحةً ولو تعطّلت بعض العقد أو حظرت كاتبها.</p> <p>وخلاصة القول: يجمع «نوستر» بين هوياتٍ مُعمّاة، وتخزينٍ بينيّ قابل للتشغيل المتبادل، ونظامٍ مفتوح لأنواع المحتوى، ليُنشئ بيئةً لا يمكن فيها لجهةٍ واحدة أن تستولي على هوية المستعمل أو بياناته. وبهذا يُقوّض دور للخوادم في الإنترنت الحديث، ويجعل المستعمل — لا الشركة — في المركز.</p> <p>عوضًا عن المصادقة المعتمدة على الخوادم، يستند «نوستر» إلى التعمية ليُقلِّص دور الخادم من مركزٍ قويٍّ مُتحكِّم إلى مستودعٍ قابلٍ للاستبدال، مصطفٍّ مع المستعمل لا سيّدًا عليه. والانضمام إلى شبكة «نوستر» لا يتطلّب إلا أن يُنشئ المرء — من تلقاء نفسه — زوجَ مفاتيحٍ تعموية من نوع <strong>secp256k1</strong>. ويجوز استعمال أيّ عددٍ من هذه الهويّات التعمَوية على التوازي، بحسب المقاصد: لتجزئة بيانات المستعمل، أو لاتخاذ أسماءٍ مستعارة، أو لتعمية الرسائل والمحتوى. وأهمّ ما في الأمر أنّ أزواج المفاتيح تُستعمل لإنشاء توقيعاتٍ رقمية على المحتوى، تُضمَّن في بُنى بياناتٍ تُسمّى «أحداثًا»، وتُدرج فيها — إلى جانب التوقيع — المفاتيح العامة للمستعمل، وبصمة الحدث، وغير ذلك من البيانات الوصفية. وبهذا يصبح صدقُ النسبة إلى صاحبه قائمًا على البرهان التعموي، لا على ثقةٍ بمشغّل خادمٍ أو سلطةٍ وسيطة.</p><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[برامج أستعملها]]></title>
            <link>https://motaz.cc/rss.xml/blog/2026-01-30-برامج-أستعملها</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2026-01-30-برامج-أستعملها</guid>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[هذه قائمةٌ متجدّدة بالبرامج التي أستعملها وأرشّحها. أُحدّثها كلّما غيّرت برنامجًا، أو وقفتُ على برنامجٍ جديدٍ أراه جديرًا بالتجربة.]]></description>
            <content:encoded><![CDATA[<!--[--><p>هذه قائمةٌ متجدّدة بالبرامج التي أستعملها وأرشّحها. أُحدّثها كلّما غيّرت برنامجًا، أو وقفتُ على برنامجٍ جديدٍ أراه جديرًا بالتجربة.</p> <h2>برامج الحاسب</h2> <h3>نظام التشغيل</h3> <ul><li><a href="https://archlinux.org/" rel="nofollow">Arch Linux</a></li> <li><a href="https://github.com/DreamMaoMao/mangowc" rel="nofollow">MangoWC</a></li> <li><a href="https://github.com/AvengeMedia/DankMaterialShell" rel="nofollow">Dank Material Shell</a></li> <li><a href="https://codeberg.org/dnkl/foot" rel="nofollow">Foot</a></li></ul> <h3>محررات النصوص</h3> <ul><li><a href="https://neovim.io/" rel="nofollow">Neovim</a></li></ul> <h3>متصفحات الشابكة</h3> <ul><li><a href="https://brave.com/" rel="nofollow">Brave</a></li> <li><a href="https://icecatbrowser.org/" rel="nofollow">GNU IceCat</a></li> <li><a href="https://zen-browser.app/" rel="nofollow">Zen Browser</a></li></ul> <h3>التدوين والأعمال الأكاديمية</h3> <ul><li><a href="https://strlen.com/treesheets/" rel="nofollow">TreeSheets</a></li> <li><a href="https://www.libreoffice.org/" rel="nofollow">LibreOffice</a></li></ul> <h3>قراءة الكتب والوثائق</h3> <ul><li><a href="https://pwmt.org/projects/zathura/" rel="nofollow">Zathura</a></li> <li><a href="https://apps.gnome.org/Papers/" rel="nofollow">Papers</a></li></ul> <h3>التعمية وإدارة كلمات المرور</h3> <ul><li><a href="https://www.gnupg.org/" rel="nofollow">GnuPG</a></li> <li><a href="https://dyne.org/docs/tomb/" rel="nofollow">Tomb</a></li> <li><a href="https://keepassxc.org/" rel="nofollow">KeePassXC</a></li></ul> <h3>إدارة الملفات</h3> <ul><li><a href="https://github.com/lxde/pcmanfm" rel="nofollow">PCManFM</a></li> <li><a href="https://github.com/jarun/nnn" rel="nofollow">nnn</a></li></ul> <h3>العملات الرقمية</h3> <ul><li><a href="https://bitcoin.org/" rel="nofollow">Bitcoin</a></li> <li><a href="https://www.getmonero.org/" rel="nofollow">Monero</a></li> <li><a href="https://electrum.org/" rel="nofollow">Electrum</a></li></ul> <h3>مشغلات الوسائط</h3> <ul><li><a href="https://mpv.io/" rel="nofollow">mpv</a></li> <li><a href="https://github.com/tomasklaen/uosc" rel="nofollow">uosc</a></li> <li><a href="https://sr.ht/~exec64/imv/" rel="nofollow">imv</a></li></ul> <h2>برامج الجوال</h2> <h3>نظام التشغيل</h3> <ul><li><a href="https://evolution-x.org/" rel="nofollow">Evolution X</a></li></ul> <h3>القرآن الكريم</h3> <ul><li><a href="https://github.com/Waqar144/quran_memorization_helper" rel="nofollow">سورة</a></li></ul> <h3>مشغلات الوسائط</h3> <ul><li><a href="https://f-droid.org/en/packages/live.mehiz.mpvkt/" rel="nofollow">mpvKt</a></li> <li><a href="https://github.com/AkaneTan/Gramophone" rel="nofollow">Gramophone</a></li></ul> <h3>الصور</h3> <ul><li><a href="https://f-droid.org/en/packages/org.fossify.gallery/" rel="nofollow">Fossify Gallery</a></li></ul> <h3>إدارة الملفات</h3> <ul><li><a href="https://github.com/zhanghai/MaterialFiles" rel="nofollow">Material Files</a></li></ul> <h3>الكتب والوثائق</h3> <ul><li><a href="https://f-droid.org/en/packages/com.foobnix.pro.pdf.reader/" rel="nofollow">Librera</a></li></ul> <h3>تدوين الملاحظات</h3> <ul><li><a href="https://github.com/Kin69/EasyNotes" rel="nofollow">EasyNotes</a></li> <li><a href="https://github.com/soupslurpr/BeauTyXT" rel="nofollow">BeauTyXT</a></li></ul> <h3>التنزيلات</h3> <ul><li><a href="https://f-droid.org/en/packages/com.gianlu.aria2app/" rel="nofollow">Aria2App</a></li> <li><a href="https://f-droid.org/en/packages/com.junkfood.seal/" rel="nofollow">Seal</a></li></ul> <h3>متصفح الشابكة</h3> <ul><li><a href="https://brave.com/" rel="nofollow">Brave</a></li></ul> <h3>الخصوصية والأمان</h3> <ul><li><a href="https://orbot.app/" rel="nofollow">Orbot</a></li> <li><a href="https://github.com/Tommy-Geenexus/exif-eraser" rel="nofollow">Exif Eraser</a></li> <li><a href="https://github.com/t895/DNSNet" rel="nofollow">DNSNet</a></li></ul><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[المقامة الرستية]]></title>
            <link>https://motaz.cc/rss.xml/blog/2025-12-22-المقامة-الرستية</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2025-12-22-المقامة-الرستية</guid>
            <pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[حدثنا معتزٌ قَالَ: كنتُ في مَقيلٍ مِن أهلِ الدِرَايةِ، وأربابِ الصناعةِ والرِوايَةِ، ممن يبنونَ القُصُورَ منَ الأكْوَادِ، وَيَسبِكُونَ التَّطْبِيقَاتِ...]]></description>
            <content:encoded><![CDATA[<!--[--><p>حدثنا معتزٌ قَالَ: كنتُ في مَقيلٍ مِن أهلِ الدِرَايةِ، وأربابِ الصناعةِ والرِوايَةِ، ممن يبنونَ القُصُورَ منَ الأكْوَادِ، وَيَسبِكُونَ التَّطْبِيقَاتِ سَبكَ الجِيَادِ. فبينما نحنُ فِي بحثٍ عميقٍ، وجِدالٍ ونهيقٍ، إذ برزَ فتًى يُقالُ لهُ بَهيم بنُ فَهِيمُ، يمشي مِشيَةَ التَّائِه الغَريمِ، قد تَمَنْطَقَ “برَستَ” تَمَنطُقاً، وصارَ بذكرِهَا مُتفدِّقاً، يرى أن ما سواها هباء منثُورٌ، وَ كُلَّ كُودٍ بغيرها مَبتُور. فقامَ إليهِ عمرُ ابنُ عِمرَانَ، وهو شابٌّ رزينٌ، من حُمَاةِ “السِّيِّ” وَالمتمكِّنينَ، قائلاً له: “رُويدَكَ يا بهيم، فَمَا كلُ بريقٍ ذهباً، ولا كل حديثٍ طَرَباً! أَتَرُومُ هَدمَ أركانٍ شُيدت من عقودٍ، ومحوَ لغاتٍ هِيَ للعلمِ جنودٌ؟” فثارَ بهيمٌ وزبَدَ، وَصَاحَ وارتعدَ، وقالَ: “يَا بَنِي العرب! أيكمْ أعرفُ بصيانةِ الذاكرةِ، وَأَشْحَذُ فِي قَوْلَبَةِ المُعَاصَرَةِ؟ أَنَا الرستِيُّ الغالبُ، وأنتَ فِي بحرِ أوهامكَ راكبٌ! لغتُكَ ثُقبٌ فِي سفينةٍ، وعِلةٌ في مدينة!” فقال عمر: “بل أنت بل أنتَ قِردُ جدالٍ، وأسيرُ ضلالٍ، تُكثرُ الصياحَ وتُقلُّ الصلاح. غِرٌّ غرَّتكَ القشورُ، وأعمتكَ المالِكِيَّةُ (Ownership) عن المقدورِ! ليشتُم كلٌّ منا صاحبهُ، فمن غَلَبَ سَلَبَ!”</p> <p>قالَ بَهيم:“يا ثِقَلَ الدَّيْنِ يَا سِمَةَ الشَّيْنِ، يَا بَريدَ الشُّومِ يَا طَريدَ اللُّومِ! يا جامعَ القمامةِ بيدهِ، يا من يفيضُ كُودُهُ سُماً في كبدهِ! يا خادمَ المؤشرِ الفارغِ (Null Pointer) اللعينِ، يا مضيِّعَ عمركَ بين المجانينِ! يا ثُقبَ الأمْنِ، يا عدوَّ الفنِّ، يا من يسيرُ في حقلِ ألغامٍ، ويظنُّ نفسهُ مَلِكَ الأيام!”</p> <p>فقالَ عمر:“يا قَرَّادَ القُرُودِ، يا لَبُودَ اليهودِ، يا عدماً في وُجوُدٍ! يا من حَبَسَه فاحِصُ الإستعارةِ (Borrow Checker) كالمسجونِ، ورضيَ بقيودِه كالمجنونِ! أتَعِيرُني بالسِّيِّ وهي أمُّ القواعدِ، وأنتَ تتسكعُ بين الشواهدِ؟ يا ساعةَ الحَيْنِ، يا ثِقَلَ الدَّينِ، يا من لا يكتُبُ سطراً إِلا بموافقةِ الرقيبِ، ولا ينطِقُ حرفاً إلا كالغريبِ! يَا أفضحَ من عَبْرَةٍ، يا أَبغَى من إبرةٍ، واللهِ لو صنعتَ من ‘رَسْتَ’ طيارةً لما بلغتْ مطارةً، ولو نسجتَ من خيوطها نعلاً لما جاوزتَ بقلاً! تريدُ أن تكونَ فهيمةً، وما أنت إلا بهيمة”. ثم هدأ عمرُ وأقبلَ برزَانَتهِ، وأدلى بحجّتهِ وأمانتهِ، فقالَ: “يَا فهيم، إنما اللغاتُ أدواتٌ، لا عقائدُ وخرافاتٌ. أتعِيبُ عَلَيَّ لغةً بُنِيَت عليها النُّظُمُ، وسارت بها الأممُ؟ لولا ‘السِّيُّ’ لما عرفتَ لحاسبِكَ نِظاماً، ولا ‘لِـرَسْتِكَ’ قِوَاماً، فهيَ الأصلُ وصاحبتك الفرعُ، وهيَ الأرضُ وصاحبتك الزرعُ. أنتَ تُنفِقُ الساعَاتِ في إرضاءِ المُصَرّف (Compiler)، وأنَا أَبْنِي المَعَالِمَ واتَصَرفُ. أنتَ مقبوضٌ بالقيودِ، وأنا حرٌّ أتجاوزُ الحدودَ، فإن أسأتُ فمن نفسي، وإن أحسنتُ فبغَرْسي.” فَسَكَتَ بهيم وأُطْرِقَ رأسُهُ، وذهبَ بأسُهُ، وعلِمَ أن التَّسَرُّعَ مطِيَّةُ الفشلِ، وأنّ الحكمةَ في طولِ الأمَل.</p> <p>قال معتز: فلما رأيتُ الغلبةَ لعُمرَ، وكيفَ قَمَعَ هذا الشَّرَرَ، قلتُ لهُ: “للهِ دَركَ من حكِيمٍ! لقد داويتَ سقيمًا بنَسِيمٍ.” ثم انصرفنا ونحنُ نعجَبُ من حالِ الزمانِ، كيفَ صارَ العلمُ فيهِ ميداناً للهذيانِ!</p><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[الدليل الى باكمان]]></title>
            <link>https://motaz.cc/rss.xml/blog/2025-07-20-الدليل-الى باكمان</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2025-07-20-الدليل-الى باكمان</guid>
            <pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[تدار الحزم في ارتش لينكس بالمدير باكمان، ، وهو من أقدم أركان النظام وأوثقها اتصالًا به. وقد وُلد باكمان مع البدايات الأولى لأرتش سنة 2002، غير أنّه كا...]]></description>
            <content:encoded><![CDATA[<!--[--><p>تدار الحزم في ارتش لينكس بالمدير باكمان، ، وهو من أقدم أركان النظام وأوثقها اتصالًا به. وقد وُلد باكمان مع البدايات الأولى لأرتش سنة 2002، غير أنّه كان يومئذٍ ضعيف الشأن، قليل المزايا، لا يكاد يتجاوز الأعمال الأساسية في تثبيت الحزم وترقيتها.</p> <p>ثم جاء الإصدار الثاني، فأضيف إليه أمر المزامنة <code>--sync</code>، فصار قادرًا على الاتصال بالخوادم وجلب الحزم وقواعد بياناتها. وقبل ذلك كان المستعمل مضطرًّا إلى تثبيت الحزم يدويًّا عبر الخيارين <code>--add</code> و <code>--upgrade</code>.</p> <p>ثم لمّا أقبل الإصدار الثالث، انقسم باكمان شطرين: شطرٌ يتولى الأعمال الخفية في الخلفية، وسُمّي <code>libalpm</code>، وشطرٌ ظاهرٌ يواجه المستعمل ويخاطبه بالأوامر المعتادة. ثم توالت عليه التحسينات والإصلاحات في الإصدارات اللاحقة، حتى غدا من أمهر مديري الحزم وأسرعهم.</p> <p>ومن أراد الوقوف على تفاصيل تاريخه وتطوراته فدونه هذا السجل: <a href="https://pacman.archlinux.page/" rel="nofollow">history</a>.</p> <h2>حيلٌ وفِطنٌ في استعمال باكمان</h2> <p><strong>ومن جميل العادات أن تبحث عن الحزمة قبل تثبيتها، فإنّ في ذلك معرفةً بأمرها، وتثبتًا من اسمها، واطلاعًا على تبعياتها ووصفها.</strong></p> <h3>البحث عن كلمة في قواعد بيانات الحزم:</h3> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Ss</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">any-wor</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">d</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <p>فهذا الأمر يفتش في أسماء الحزم ووصفها عن الكلمة المطلوبة.</p> <p><img src="/assets/posts-images/pacman/Ss.png" alt="pacman -Ss libcaca"/></p> <h3>الأستعلام عن حزمة بعينها:</h3> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Si</span><span style="color:#79740E;--shiki-dark:#B8BB26"> libcaca</span></span></code></pre> <p>وفي هذا الاستعلام تظهر تفاصيل الحزمة كلها: من وصفها، وإصدارها، وحجمها، وموقعها، وتاريخ تحديثها.</p> <p><img src="/assets/posts-images/pacman/Si.png" alt="pacman -Si libcaca"/></p> <h3>البحث عن ملف تابع لحزمة:</h3> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -F</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">file-nam</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">e</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <p>وقد يحتاج المرء أحيانًا إلى برنامجٍ صغير أو أداةٍ لا يعرف الحزمة التي تحتويها، فيبحث عنها على أنها ملف. وهذا من أنفع أوامر باكمان؛ إذ كل شيءٍ في أنظمة يونكس ملف.</p> <p><img src="/assets/posts-images/pacman/F.png" alt="pacman -F img2txt"/></p> <h3>تثبيت حزمة:</h3> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -S</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">pkg-nam</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">e</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <h3>تحديث جميع الحزم:</h3> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Syu</span></span></code></pre> <h3>تحديث قواعد بيانات الحزم:</h3> <p>وقد يحتاج المستعمل أحيانًا إلى تحديث قواعد البيانات قبل التثبيت أو البحث، ويتم ذلك بالأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Syy</span></span></code></pre> <p>ولباكمان ثلاث قواعد بيانات مشهورة:</p> <ul><li>core:وتضم الحزم الأساسية للنظام.</li> <li>extra: وهي أوسع القواعد وأكثرها احتواءً للبرامج.</li> <li>multilib: وتضم الحزم الداعمة لمعمارية x86 وما يتصل بها.</li></ul> <p><strong>ويمكن تفعيل هذه القواعد أو تعطيلها عبر ملف التخصيص:<code>/etc/pacman.conf</code></strong></p> <h3>ملف التخصيص pacman.conf</h3> <p>وفي هذا الملف يهيّئ المستخدم باكمان على ما يلائم ذوقه وحاجته. ومن الخيارات الحسنة فيه:</p> <ul><li><code>Color</code>: لتلوين المخرجات</li> <li><code>CheckSpace</code>: للتحقق من مساحة القرص قبل التثبيت</li> <li><code>VerbosePkgLists</code>: لعرض الحزم وإصداراتها وأحجامها في صورةٍ مرتبة.</li> <li><code>ParallelDownloads = n</code>: للتنزيل المتوازي، ويُستبدل الحرف n بعدد الأنوية في المعالج.</li> <li><code>ILoveCandy</code>: اكتشفه بنفسك</li></ul> <h2>AUR</h2> <p>ومن أعجب ما في أرتش قاعدةُ Arch User Repository، وتُعرف اختصارًا بـ AUR.</p> <p>وهذه القاعدة ليست رسمية، بل يرفع المجتمع إليها الحزم، ولا يتولى مطورو أرتش مراجعتها أو ضمان سلامتها، ولذا قد يوجد فيها ما لا يؤمَن جانبه. غير أنّ فضلها عظيم، إذ تكاد تضم كل برنامجٍ يخطر بالبال.</p> <p>ولا يُستعمل الـ AUR بباكمان وحده، بل يحتاج إلى برنامجٍ مساعد، ومن أشهرها yay وparu، وأميلهما عند كثير من الناس yay.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">yay</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -S</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">pkg-nam</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">e</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--blue)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋼</span> <!--[--><!---->كل الأوامر السابقة في باكمان تعمل نفس عملها في yay<!--]--></div></div><!----> <p>وأكثر الحزم في الـ AUR تُبنى من المصدر، ولذلك يعمد بعض الناس إلى تسريع التصريف بتعديل الخيار: <code>MAKEFLAGS="-j4"</code> في ملف <code>/etc/makepkg.conf</code> ومعنى -j4 استعمال أربعة أنوية في أثناء التصريف.</p> <p>ومن جميل ما في yay الأمر:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">yay</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -P</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> --stats</span></span></code></pre> <p>فإنه يعرض إحصاءات نافعة عن الحزم المثبتة في النظام.</p> <p><img src="/assets/posts-images/pacman/paru-state.png" alt="paru -P --stats"/></p> <h2>حذف الحزم</h2> <p><strong>حذف حزمة:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -R</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">pkg-nam</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">e</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <p><strong>حذف حزمة مع مستلزماتها:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Rsn</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">pkg-nam</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">e</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <p><strong>حذف حزمة دون الاكتراث بالتبعيات</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">doas</span><span style="color:#79740E;--shiki-dark:#B8BB26"> pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Rdd</span><span style="color:#427B58;--shiki-dark:#8EC07C"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">pkg-nam</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">e</span><span style="color:#427B58;--shiki-dark:#8EC07C">></span></span></code></pre> <div class="callout svelte-1ezppec" style="--callout-color: var(--blue)"><div class="callout-body svelte-1ezppec"><span class="callout-label svelte-1ezppec">󰋼</span> <!--[--><!---->غير أنّ باكمان يحتفظ بنسخٍ من الحزم في الذاكرة المخبئية (cache)، حتى إذا احتجت إليها مرةً أخرى لم يُعد تنزيلها من الخادم. وفي ذلك منفعةٌ ومضرّة؛ فمنفعته السرعة، ومضرته تراكم الحزم حتى تأكل مساحة القرص. ولتنظيف الكاش يُستعمل: `pacman -Scc`. فإن استعصى بعض الكاش ولم يُحذف، أمكن مسحه يدويًّا: `doas rm -rf /var/cache/pacman/pkg/*`<!--]--></div></div><!----> <h3>كيف تعرف عدد الحزم في نظامك?</h3> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Qe</span><span style="color:#79740E;--shiki-dark:#B8BB26">           عرض</span><span style="color:#79740E;--shiki-dark:#B8BB26"> الحزم</span><span style="color:#79740E;--shiki-dark:#B8BB26"> المثبته</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Qeq</span><span style="color:#79740E;--shiki-dark:#B8BB26">          عرض</span><span style="color:#79740E;--shiki-dark:#B8BB26"> الأسماء</span><span style="color:#79740E;--shiki-dark:#B8BB26"> دون</span><span style="color:#79740E;--shiki-dark:#B8BB26"> رقم</span><span style="color:#79740E;--shiki-dark:#B8BB26"> الاصدار</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Qe</span><span style="color:#427B58;--shiki-dark:#8EC07C"> |</span><span style="color:#B57614;--shiki-dark:#FABD2F"> wc</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -l</span><span style="color:#79740E;--shiki-dark:#B8BB26">   عدد</span><span style="color:#79740E;--shiki-dark:#B8BB26"> الحزم</span><span style="color:#79740E;--shiki-dark:#B8BB26"> المثبته</span><span style="color:#79740E;--shiki-dark:#B8BB26"> في</span><span style="color:#79740E;--shiki-dark:#B8BB26"> نظامك</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Qm</span><span style="color:#79740E;--shiki-dark:#B8BB26">           عرض</span><span style="color:#79740E;--shiki-dark:#B8BB26"> الحزم</span><span style="color:#79740E;--shiki-dark:#B8BB26"> المثبته</span><span style="color:#79740E;--shiki-dark:#B8BB26"> من</span><span style="color:#79740E;--shiki-dark:#B8BB26"> aur</span></span>
<span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Qm</span><span style="color:#427B58;--shiki-dark:#8EC07C"> |</span><span style="color:#B57614;--shiki-dark:#FABD2F"> wc</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -l</span><span style="color:#79740E;--shiki-dark:#B8BB26">   عرض</span><span style="color:#79740E;--shiki-dark:#B8BB26"> عدد</span><span style="color:#79740E;--shiki-dark:#B8BB26"> الحزم</span><span style="color:#79740E;--shiki-dark:#B8BB26"> المثبته</span><span style="color:#79740E;--shiki-dark:#B8BB26"> من</span><span style="color:#79740E;--shiki-dark:#B8BB26"> aur</span></span></code></pre> <h3>حذف الحزم المهجورة</h3> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#B57614;--shiki-dark:#FABD2F">pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Qdtq</span><span style="color:#427B58;--shiki-dark:#8EC07C"> |</span><span style="color:#B57614;--shiki-dark:#FABD2F"> pacman</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> -Rns</span><span style="color:#79740E;--shiki-dark:#B8BB26"> -</span></span></code></pre> <h2>أدوات pacman-contrib</h2> <p>وقد وفر مطورو باكمان حزمةً اسمها pacman-contrib، تضم أدواتٍ نافعة تُحسّن التجربة وتيسّر بعض الأعمال.</p> <p><strong>ومنها:</strong></p> <ul><li><code>checkupdates</code>يعرض التحديثات المتاحة دون مزامنة قواعد البيانات.</li> <li><code>paccache</code> أداةٌ لتنظيف الكاش وترتيبه.</li> <li><code>paclist</code> تطبع قائمة الحزم المثبتة.</li></ul> <p><strong>وفي الحزمة غير ذلك من الأدوات النافعة، وتفاصيلها هنا: <a href="https://gitlab.archlinux.org/pacman/pacman-contrib" rel="nofollow">pacman-contrib</a></strong></p><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[خوارزمية المُفترق Shunting Yard]]></title>
            <link>https://motaz.cc/rss.xml/blog/2025-06-22-خوارزمية-المُفترق-Shunting-Yard</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2025-06-22-خوارزمية-المُفترق-Shunting-Yard</guid>
            <pubDate>Sun, 22 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[البشر يكتبون المعادلات الحسابية على الصورة المألوفة بينهم، فيجعلون العدد ثم يتبعونه بعلامة العملية ثم بالعدد الآخر. فنقول: «أربعة زائد سبعة»، وتُكتب ه...]]></description>
            <content:encoded><![CDATA[<!--[--><p>البشر يكتبون المعادلات الحسابية على الصورة المألوفة بينهم، فيجعلون العدد ثم يتبعونه بعلامة العملية ثم بالعدد الآخر. فنقول: «أربعة زائد سبعة»، وتُكتب هكذا:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>4 + 7</span></span></code></pre> <p>وهذه الصيغة يسيرةٌ على عقل الإنسان، بيّنةُ المقصد، قريبةُ المأخذ. أمّا الحاسوب فليس له من الفهم ما للبشر، إذ لا يدرك الأمور جملةً واحدة، بل يحتاج إلى خطواتٍ مرتبةٍ متتابعة، وقواعدَ صارمةٍ لا يحيد عنها. ومن ثمّ كانت الصيغة التي يألفها الناس عسيرةً على الآلات، وإن سهلت على الأذهان.</p> <p>ولهذا ابتكر <a href="https://www.cs.utexas.edu/~EWD/" rel="nofollow">“ادزخر ديكسترا”</a> خوارزمية «المُفترق» المعروفة باسم Shunting Yard، وهي خوارزميةٌ تُحوِّل العمليات الحسابية من صيغة «توسيط العلامات» (Infix Notation)، التي يكتب بها الناس حسابهم، إلى صيغةٍ أخرى تُسمّى «تلحيق العلامات» (Postfix Notation)، وتُعرف أيضًا باسم <a href="https://en.wikipedia.org/wiki/Reverse_Polish_notation" rel="nofollow">“Reverce Polish Notation”</a>. وهذه الصيغة الأخيرة أيسر على الحاسوب وأقرب إلى طرائق معالجته للعمليات الحسابية.</p> <h2>تلحيق العلامات Postfix Notation</h2> <p>وقبل الخوض في خوارزمية «المُفترق» ينبغي فهمُ كيفية تحويل العمليات من «توسيط العلامات» إلى «تلحيق العلامات». ففي هذه الصيغة تُؤخَّر العلامة الحسابية حتى تأتي بعد الأعداد بدل أن تتوسطها.</p> <p>فإن قلنا: «أربعة زائد خمسة» كانت الصيغة:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>4 5 +</span></span></code></pre> <p>بدلًا من:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>4 + 5</span></span></code></pre> <p>وإن قلنا: «أربعة زائد خمسة ناقص ثلاثة» صارت:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>4 5 + 3 -</span></span></code></pre> <p>أي نجمع الأربعة والخمسة أولًا، ثم نطرح من الناتج ثلاثة.</p> <p>وهنا يظهر شأن «المكدس» القائم على قاعدة «الداخل أخيرًا الخارج أولًا»، إذ هو عماد هذه الصيغة وأصل عملها. ففي المثال:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>3 4 -</span></span></code></pre> <p>يُدفع العدد 3 إلى المكدس أولًا، ثم يوضع العدد 4 فوقه، فإذا جاءت علامة الطرح أُخرج العددان، وأُجريت العملية، ثم أُعيد الناتج -1 إلى المكدس. وقد تتوالى الأعداد والعلامات بعد ذلك، فتُعامل المعاملة نفسها.</p> <p><img src="/assets/posts-images/shuntingYard/Postfix1.png"/></p> <p>وفائدة هذه الصيغة أنّها تُغني عن الأقواس التي يحتاج إليها البشر لتحديد الأولويات، إذ تصبح القراءة من اليسار إلى اليمين قراءةً محضةً لا التباس فيها.</p> <p>فالمعادلة:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>(3 + 4) * (2 + 2)</span></span></code></pre> <p>تصير:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>3 4 + 2 2 + *</span></span></code></pre> <p>فنضع الثلاثة ثم الأربعة في المكدس، فتأتي علامة الجمع فتخرجهما وتعيد الناتج 7. ثم نضيف العددين 2 و2، فتأتي علامة الجمع الثانية فتجعل الناتج 4. ثم تأتي علامة الضرب فتأخذ 7 و4 وتضربهما، فيكون الناتج 28.</p> <p><img src="/assets/posts-images/shuntingYard/Postfix2.png"/></p> <p><em>وقد استُعملت هذه الصيغة في بعض الآلات الحاسبة القديمة، ولا سيما آلات <a href="https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/HP-41CV_Calculator.jpg/330px-HP-41CV_Calculator.jpg" rel="nofollow">HP</a></em></p> <h2>خوارزمية المُفترق Shunting Yard Algorithm</h2> <p>وهذه الخوارزمية هي الأداة التي تُحوِّل العمليات الحسابية من صيغة «توسيط العلامات» إلى صيغة «تلحيق العلامات» داخل الحاسوب. وتقوم على ثلاثة أركان:</p> <ul><li>المدخلات</li> <li>طابور المخرجات</li> <li>مكدس العلامات</li></ul> <h3>ولنشرح ذلك بمثالٍ سهل:</h3> <p><strong>الخطوات:</strong></p> <ol><li>المدخلات:</li></ol> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>3 + 4</span></span></code></pre> <ol start="2"><li>يُرسل العدد 3 إلى طابور المخرجات، إذ الأعداد تُرسل إليه دائمًا.</li> <li>توضع علامة الجمع + في مكدس العلامات.</li> <li>يُرسل العدد 4 إلى طابور المخرجات.</li> <li>بعد انتهاء القراءة تُخرج العلامات الباقية في المكدس وتُلحق بطابور المخرجات.</li> <li>فتكون النتيجة:</li></ol> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>3 4 +</span></span></code></pre> <p><strong>ومن هذا المثال تُستخلص قاعدتان:</strong></p> <ul><li>كل عددٍ يُدفع مباشرةً إلى طابور المخرجات.</li> <li>كل علامةٍ تبقى في المكدس تُخرج عند انتهاء القراءة وتُلحق بالمخرجات.</li></ul> <h3>مثال آخر</h3> <p>وقبل الشروع في المثال ينبغي ترتيب العلامات الحسابية بحسب أولويتها واتجاهها:</p> <table><thead><tr><th>العلامة</th><th>اولوليتها</th><th>الاتجاه</th></tr></thead><tbody><tr><td>*</td><td>2</td><td>يسار</td></tr><tr><td>/</td><td>2</td><td>يسار</td></tr><tr><td>+</td><td>1</td><td>يسار</td></tr><tr><td>-</td><td>1</td><td>يسار</td></tr></tbody></table> <p><strong>المدخلات:</strong></p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>3 + 4 × 2 ÷ ( 1 − 5 ) ^ 2 ^ 3</span></span></code></pre> <p>فنبدأ بإرسال الأعداد إلى طابور المخرجات، والعلامات إلى المكدس بحسب أولوياتها. فإذا وردت علامةٌ أعلى أولويةً من التي قبلها بقيت في المكدس، وإن كانت أقل أولوية أُخرج ما فوقها أولًا. وأما الأقواس فلها حكمٌ خاص، فما داخلها يُعالج بمعزلٍ عمّا خارجها حتى يُغلق القوس.</p> <ol><li>ضع الرقم 3 في طابور المخرجات</li></ol> <p><img src="/assets/posts-images/shuntingYard/1.png"/></p> <ol start="2"><li>ضع علامة الجمع في مكدس العلامات</li></ol> <p><img src="/assets/posts-images/shuntingYard/2.png"/></p> <ol start="3"><li>ضع الرقم 4 في طابور المخرجات</li></ol> <p><img src="/assets/posts-images/shuntingYard/3.png"/></p> <ol start="4"><li>ضع علامة الضرب في مكدس العلامات</li></ol> <p><img src="/assets/posts-images/shuntingYard/4.png"/></p> <ol start="5"><li>ضع الرقم 2 في طابور المخرجات</li></ol> <p><img src="/assets/posts-images/shuntingYard/5.png"/></p> <ol start="6"><li>اخرج علامة الضرب من مكدس العلامات وضعها في طابور المخرجات ثم ضع علامة القسمة في مكدس العلامات</li></ol> <p><img src="/assets/posts-images/shuntingYard/6.png"/></p> <ol start="7"><li>ضع القوس في مكدس العلامات</li></ol> <p><img src="/assets/posts-images/shuntingYard/7.png"/></p> <ol start="8"><li>ضع الرقم 1 في طابور المخرجات</li></ol> <p><img src="/assets/posts-images/shuntingYard/8.png"/></p> <ol start="9"><li>ضع علامة الطرح في مكدس العلامات، وإن كانت أولويتُها أدنى من أولوية القسمة، إذ إنّ وجود القوس المفتوح يجعل ما خارجه في حكم المعزول، فلا يُلتفت إلى عملياته حتى يُغلق القوس ويُفرغ ما بداخله.</li></ol> <p><img src="/assets/posts-images/shuntingYard/9.png"/></p> <ol start="10"><li>ضع الرقم 5 في طابور المخرجات</li></ol> <p><img src="/assets/posts-images/shuntingYard/10.png"/></p> <ol start="11"><li>وهنا وردَ إغلاقُ القوس، فنُخرجُ علامةَ الطرح من المكدس ونُلحقها بطابور المخرجات، ثم نُخرجُ فتحةَ القوس من المكدس ونطرحها، إذ لا موضعَ لها في الصيغة النهائية</li></ol> <p><img src="/assets/posts-images/shuntingYard/11.png"/></p> <ol start="12"><li>ضع علامة القوة ^ في مكدس العلامات</li></ol> <p><img src="/assets/posts-images/shuntingYard/12.png"/></p> <ol start="13"><li>ضع الرقم 2 في طابور المخرجات</li></ol> <p><img src="/assets/posts-images/shuntingYard/13.png"/></p> <ol start="14"><li>ضع علامة القوة ^ في مكدس العلامات</li></ol> <p><img src="/assets/posts-images/shuntingYard/14.png"/></p> <ol start="15"><li>ضع الرقم 3 في طابور المخرجات</li></ol> <p><img src="/assets/posts-images/shuntingYard/15.png"/></p> <ol start="16"><li>وأخيرًا، نُخرج جميع العلامات الباقية في المكدس، ونُلحقها — على ترتيب خروجها — بطابور المخرجات.</li></ol> <p><img src="/assets/posts-images/shuntingYard/16.png"/></p> <p>فإذا انتهت القراءة أُخرجت جميع العلامات من المكدس، فكانت النتيجة النهائية:</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span>3 4 2 * 1 5 - 2 3 ^ ^ / +</span></span></code></pre> <p>وهذه هي الصيغة التي يستطيع الحاسوب معالجتها بيسرٍ ومن غير حاجةٍ إلى تتبع الأقواس أو إعادة النظر في ترتيب العمليات.</p> <p>وفي هذا تتجلّى براعة الخوارزمية، إذ حوّلت ما يراه الإنسان بديهيًّا إلى صورةٍ مرتبةٍ يمكن للآلة أن تسير فيها خطوةً خطوةً من غير اضطراب.</p> <p><strong><a href="https://literateprograms.org/shunting_yard_algorithm__c_.html" rel="nofollow">هنا تطبيق للخوارزمية بلغة C</a></strong></p> <h2>وَصْلاتٌ للإستزادة</h2> <ul><li><a href="http://www.cs.utexas.edu/~EWD/MCReps/MR35.PDF" rel="nofollow">ورقة ديكسترا الأصلية عن الخوارزمية</a></li> <li><a href="https://youtu.be/ceu-7gV1wd0?si=RAYJbFl3VhNhuBTs" rel="nofollow">شرح مرئي للخوارزمية من قناة بيكوما</a></li></ul><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
        <item>
            <title><![CDATA[مدخل الى الماركدون]]></title>
            <link>https://motaz.cc/rss.xml/blog/2025-06-16-مدخل-الى-الماركدون</link>
            <guid isPermaLink="false">https://motaz.cc/rss.xml/blog/2025-06-16-مدخل-الى-الماركدون</guid>
            <pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[بدأت لغة الماركدون سنة 2004 على يد جون جروبر (John Gruber)، إذ ابتكرها لتكون لغةً لتنسيق النصوص يسهل على عامة الناس كتابتُها وقراءتُها. غير أنّ الحديث...]]></description>
            <content:encoded><![CDATA[<!--[--><p>بدأت لغة <a href="https://daringfireball.net/projects/markdown/" rel="nofollow">الماركدون</a> سنة 2004 على يد جون جروبر (John Gruber)، إذ ابتكرها لتكون لغةً لتنسيق النصوص يسهل على عامة الناس كتابتُها وقراءتُها. غير أنّ الحديث عن الماركدون لا يستقيم إلا بتمهيدٍ في ذكر لغات الهيكلة وماهيتها.</p> <h2>ما لغات هيكلة النصوص؟</h2> <p>لغات هيكلة النصوص — أو «لغات الوسم» (Markup languages) — هي جملةٌ من القواعد تُعنى بكيفية عرض النصوص وتنسيقها؛ فتجعل العنوان عظيمَ الخط، والاستطرادَ مائلَ الحروف، وتُبيّن مراتب العناوين: أهي أصولٌ أم فروع؟ وتُنشئ القوائم المرتبة وغير المرتبة، والجداول المنسقة، والوَصلات المشيرة، والصور المدرجة، وما إلى ذلك من ضروب التنسيق.</p> <p>وليس هذا الأمر بحديث العهد؛ فإنّ الكُتّاب والورّاقين قديمًا كانوا يُغلّظون العناوين، ويصبغونها بالألوان الزاهية، ويزخرفون أوائل الأبواب والفصول، ليُعلم القارئ أنّه قد انتقل إلى بابٍ جديد أو معنىً جليل.</p> <p><img src="/assets/posts-images/markdown/quran.webp" alt="مخطوطة"/></p> <p>ومن أمثلة هذه اللغات: HTML، وDocBook، وtroff، وLaTeX، وXML، وصاحبتنا الماركدون.</p> <p>ولكل واحدةٍ من هذه اللغات غرضٌ تؤمّه؛ فالـ troff تُكتب بها كتيبات لينكس المعروفة بصفحات <a href="https://en.wikipedia.org/wiki/Man_page" rel="nofollow">man</a>، والـ <a href="https://www.latex-project.org/" rel="nofollow">LaTeX</a> تُصاغ بها الأوراق والبحوث العلمية، والـ HTML تُشاد بها صفحات الشابكة، وأما الماركدون فشأنها أوسع وألين؛ إذ تصلح للمدونات، وصفحات التوثيق، والمقالات، بل ولإنشاء صفحات الشابكة نفسها، إذ يمكن تحويلها إلى HTML بيسرٍ وسهولة.</p> <h2>كيف تُكتب الماركدون؟</h2> <h3>العناوين</h3> <p>تُكتب العناوين بجعل علامة # قبل النص، وتختلف رتبتها باختلاف عدد العلامات؛ فكلما ازداد العدد نزلت رتبة العنوان.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">#</span><span style="color:#9D0006;--shiki-light-font-weight:bold;--shiki-dark:#FB4934;--shiki-dark-font-weight:bold"> عنوان 1</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">##</span><span style="color:#AF3A03;--shiki-light-font-weight:bold;--shiki-dark:#FE8019;--shiki-dark-font-weight:bold"> عنوان 2</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">###</span><span style="color:#B57614;--shiki-light-font-weight:bold;--shiki-dark:#FABD2F;--shiki-dark-font-weight:bold"> عنوان 3</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">####</span><span style="color:#79740E;--shiki-light-font-weight:bold;--shiki-dark:#B8BB26;--shiki-dark-font-weight:bold"> عنوان 4</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">#####</span><span style="color:#076678;--shiki-light-font-weight:bold;--shiki-dark:#83A598;--shiki-dark-font-weight:bold"> عنوان 5</span></span></code></pre> <h3>التوكيد</h3> <p>إن أردتَ توكيد كلمةٍ أو جملة، جعلتَها بين نجمتين *<em>، وإن أردتَ الميلان فبين نجمةٍ واحدة</em>، وقد تجمع بين التوكيد والميلان في موضعٍ واحد. وأما الشطب على الكلام فيكون بعلامتي ~~.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-light-font-style:italic;--shiki-dark:#A89984;--shiki-dark-font-style:italic">*</span><span style="color:#3C3836;--shiki-light-font-style:italic;--shiki-dark:#EBDBB2;--shiki-dark-font-style:italic">بسم الله الرحمن الرحيم</span><span style="color:#7C6F64;--shiki-light-font-style:italic;--shiki-dark:#A89984;--shiki-dark-font-style:italic">*</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">**</span><span style="color:#AF3A03;--shiki-light-font-weight:bold;--shiki-dark:#FE8019;--shiki-dark-font-weight:bold">بسم الله الرحمن الرحيم</span><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">**</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">**</span><span style="color:#AF3A03;--shiki-light-font-weight:bold;--shiki-dark:#FE8019;--shiki-dark-font-weight:bold">بسم الله الرحمن </span><span style="color:#7C6F64;--shiki-light-font-style:italic;--shiki-dark:#A89984;--shiki-dark-font-style:italic">*</span><span style="color:#AF3A03;--shiki-light-font-style:italic;--shiki-dark:#FE8019;--shiki-dark-font-style:italic">الرحيم</span><span style="color:#7C6F64;--shiki-light-font-style:italic;--shiki-dark:#A89984;--shiki-dark-font-style:italic">*</span><span style="color:#7C6F64;--shiki-light-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold">**</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">~~</span><span style="color:#3C3836;--shiki-dark:#EBDBB2">بسم الله الرحمن الرحيم</span><span style="color:#7C6F64;--shiki-dark:#A89984">~~</span></span></code></pre> <h3>القوائم</h3> <p>تُنشأ القوائم غير المرتبة بجعل شرطة - في أول السطر، ثم فراغٍ فالنص. وأما القوائم المرتبة فتكون بالأرقام.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">-</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الأول</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">-</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الثاني</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">-</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الثالث</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">-</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الرابع</span></span></code></pre> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">1.</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الأول</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">2.</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الثاني</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">3.</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الثالث</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">4.</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> السطر الرابع</span></span></code></pre> <h3>الوَصلات</h3> <p>تُكتب الوصلة بجعل الوصف بين معقوفين []، والرابط بين قوسين ().</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">[</span><span style="color:#928374;--shiki-light-text-decoration:underline;--shiki-dark:#928374;--shiki-dark-text-decoration:underline">وصف الوصلة</span><span style="color:#7C6F64;--shiki-dark:#A89984">](</span><span style="color:#8F3F71;--shiki-light-text-decoration:underline;--shiki-dark:#D3869B;--shiki-dark-text-decoration:underline">https://motaz.cc</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span></span></code></pre> <h3>الصور</h3> <p>والصور كالوصلات، غير أنّك تزيد قبلها علامة التعجب !.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">![</span><span style="color:#79740E;--shiki-dark:#B8BB26">وصف الصورة</span><span style="color:#7C6F64;--shiki-dark:#A89984">](</span><span style="color:#8F3F71;--shiki-light-text-decoration:underline;--shiki-dark:#D3869B;--shiki-dark-text-decoration:underline">وصلة_الصورة</span><span style="color:#7C6F64;--shiki-dark:#A89984">)</span></span></code></pre> <h3>الترميز البرمجي</h3> <p>إن أردتَ إدراج كلمةٍ أو سطرٍ يسير من الترميز جعلته بين علامتي `، وأما إن كان المقتبس طويلًا فاجعله بين ثلاثة أسطر من العلامات.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">#</span><span style="color:#427B58;--shiki-dark:#8EC07C">include</span><span style="color:#7C6F64;--shiki-dark:#A89984"> &lt;</span><span style="color:#79740E;--shiki-dark:#B8BB26">iostream</span><span style="color:#7C6F64;--shiki-dark:#A89984">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#AF3A03;--shiki-dark:#FE8019">int</span><span style="color:#B57614;--shiki-dark:#FABD2F"> main</span><span style="color:#7C6F64;--shiki-dark:#A89984">()</span><span style="color:#7C6F64;--shiki-dark:#A89984"> {</span></span>
<span class="line"><span style="color:#928374;--shiki-light-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic">    // Todo</span></span>
<span class="line"><span style="color:#9D0006;--shiki-dark:#FB4934">    return</span><span style="color:#8F3F71;--shiki-dark:#D3869B"> 0</span><span style="color:#7C6F64;--shiki-dark:#A89984">;</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">}</span></span></code></pre> <h3>الجداول</h3> <p>تُنشأ الجداول بكتابة رؤوس الأعمدة أولًا، ثم الفصل بينها وبين بقية الصفوف بخطوطٍ من الشرطات.</p> <pre class="shiki shiki-themes gruvbox-light-medium gruvbox-dark-medium" style="background-color:#fbf1c7;--shiki-dark-bg:#282828;color:#3c3836;--shiki-dark:#ebdbb2" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> الرأس 1 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> الرأس 2 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> الرأس 3 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#7C6F64;--shiki-dark:#A89984"> --------</span><span style="color:#7C6F64;--shiki-dark:#A89984"> |</span><span style="color:#7C6F64;--shiki-dark:#A89984"> --------</span><span style="color:#7C6F64;--shiki-dark:#A89984"> |</span><span style="color:#7C6F64;--shiki-dark:#A89984"> --------</span><span style="color:#7C6F64;--shiki-dark:#A89984"> |</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> العمود 1 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> العمود 2 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> العمود 3 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span></span>
<span class="line"><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> العمود 1 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> العمود 2 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span><span style="color:#3C3836;--shiki-dark:#EBDBB2"> العمود 3 </span><span style="color:#7C6F64;--shiki-dark:#A89984">|</span></span></code></pre> <h2>خاتمة</h2> <p>فإن أردتَ الاستزادة والتعمق في الماركدون، فدونك هذه المصادر النافعة:</p> <ul><li><a href="https://www.markdownguide.org/" rel="nofollow">https://www.markdownguide.org/</a></li> <li><a href="https://daringfireball.net/projects/markdown/syntax" rel="nofollow">https://daringfireball.net/projects/markdown/syntax</a></li></ul><!--]-->]]></content:encoded>
            <author>معتز شكري</author>
        </item>
    </channel>
</rss>