<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: &#x62C;&#x62F;&#x631;&#x627;&#x646; &#x62D;&#x645;&#x627;&#x64A;&#x629;  Firewalls</title><link>https://academy.hsoub.com/devops/security/firewalls/?d=4</link><description>DevOps: &#x62C;&#x62F;&#x631;&#x627;&#x646; &#x62D;&#x645;&#x627;&#x64A;&#x629;  Firewalls</description><language>ar</language><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62E;&#x62A;&#x627;&#x631; &#x633;&#x64A;&#x627;&#x633;&#x629; &#x641;&#x639;&#x627;&#x644;&#x629; &#x644;&#x644;&#x62C;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A; &#x644;&#x62A;&#x623;&#x645;&#x64A;&#x646; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645;&#x643; - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%B3%D9%8A%D8%A7%D8%B3%D8%A9-%D9%81%D8%B9%D8%A7%D9%84%D8%A9-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D9%84%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85%D9%83-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r244/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/how-to-choose-firewall-policy.png.df77827563b10d26617ddf6a541dce8f.png" /></p>

<div id="wmd-preview-section-14">
	<p id="مقدمة">
		نعود إليكم في الجزء الثاني من درس "<a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%B3%D9%8A%D8%A7%D8%B3%D8%A9-%D9%81%D8%B9%D8%A7%D9%84%D8%A9-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D9%84%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85%D9%83-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r232/">كيف تختار سياسة فعّالة للجدار الناري لتأمين خواديمك</a>" لنتحدث عن المزيد من الأمور والنصائح التي يجب أخذها بعين الاعتبار عند إعداد الجدار الناري الخاصّ بخادومك لأوّل مرّة.
	</p>

	<p style="text-align: center;">
		<img alt="how-to-choose-firewall-policy.png.e3fb79" class="ipsImage ipsImage_thumbnailed" data-fileid="13916" data-unique="oistmgmdu" src="https://academy.hsoub.com/uploads/monthly_2016_03/how-to-choose-firewall-policy.png.e3fb793267322999a0be9f68f3a9fa8d.png"></p>
</div>

<div id="wmd-preview-section-15">
	<h2 id="سياسات-icmp">
		سياسات ICMP
	</h2>

	<p>
		هناك آراءٌ مختلفة حول ما إذا كان يجب قبول حِزَم بيانات ICMP القادمة إلى خادومك أم لا.
	</p>

	<p>
		ICMP هو بروتوكول يستعمل لعدة أشياء، وغالبًا ما يتم إرساله مجددًا، كما رأينا سابقًا، لإعطاء معلومات عن حالة الطلبات التي تستخدم بروتوكولات أخرى. ربّما أبرز مهامه هو إرسال واستقبال نبضات الشبكة (network pings) لفحص قابلية الاتصال بالأجهزة المضيفة البعيدة. هناك عدة استخدامات غير شائغة أخرى لبروتوكول ICMP ولكنها ما تزال مفيدة.
	</p>

	<p>
		يتم تمييز حزم ICMP عبر "النوع (type)" وبعدها عبر "الشفرة (code)"، حيث يقوم النوع بتحديد معنى الرسالة العام، كمثال، Type 3 يعني أنّ الوجهة غير قابلة للوصول، بينما يتم استخدام "الشفرة" لإعطاء المزيد من المعلومات عن “النوع”. كمثال، "ICMP Type 3 Code 3" يعني أنّ المنفذ الذي تحاول الاتصال من خلاله بوجهتك غير متوفّر، بينما "ICMP Type 3 Code 0" تعني أنّ شبكة الوجهة التي تحاول الاتصال بها غير متوفّرة بالمرّة.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h3 id="الأنواع-التي-يمكن-دوما-حجبها">
		الأنواع التي يمكن دوما حجبها
	</h3>

	<p>
		هناك بعض الأنواع (Types) لبروتوكول ICMP تكون مهملة طوال الوقت، لذا يجب غالبًا حجبها. من بين هذه الأنواع:
	</p>

	<ul><li>
			ICMP source quench (النوع 4 و code 0)
		</li>
		<li>
			Alternate host (النوع 6)
		</li>
	</ul><p>
		الأنواع 1, 2, 7 و 15 محفوظة للاستخدام المستقبلي أو المتقدّم وليست مهمّة.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h3 id="الأنواع-التي-يمكن-حجبها-اعتمادا-على-إعدادات-الشبكة">
		الأنواع التي يمكن حجبها اعتمادا على إعدادات الشبكة
	</h3>

	<p>
		تكون بعض أنواع ICMP مفيدة في إعدادات شبكةٍ معيّنة، ولكن يجب حجبها في بيئةٍ أخرى.
	</p>

	<p>
		كمثال، رسائل إعادة توجيه ICMP (النوع 5 أو type 5) يمكن أن تكون مفيدة في التقاط تصميم الشبكات السيء. يتم إرسال إعادة توجيه ICMP عندما يكون هناك طريقٌ أفضل متوفّر أمام العميل. لذا إذا استقبل الموجّه (router) حزمة بيانات يجب توجيهها إلى مضيفٍ آخر على نفس الشبكة، فإنّه يقوم بإرسال رسالة إعادة توجيه عبر بروتوكول ICMP لإخبار العميل بأن يقوم بإرسال الحِزَم إلى المضيف الآخر في المستقبل.
	</p>

	<p>
		سيفيدك هذا إذا كنت تثق بشبكتك المحلية وكنت تريد التقاط أماكن عدم الكفاءة (inefficiencies) في جداول التوجيه (routing tables) أثناء الإعداد الأوّلي (إصلاح التوجيه الخاصّ بك هو حلٌّ أفضل على المستوى البعيد). لكن على شبكة غير موثوقة، يمكن لمستخدم سيء أن يقوم بإرسال رسائل إعادة التوجيه عبر برتوكول ICMP للتلاعب بجداول التوجيه الموجودة على أجهزة المضيفين (hosts).
	</p>

	<p>
		من أنواع ICMP الأخرى المفيدة في بعض الشبكات والمؤذية في أخرى هي حِزَم ما يعرف بـICMP router advertisement (النوع 9 أو type 9) وrouter solicitation (النوع 10 أو type 10). يتم استخدام حزم الإعلان (advertisement) والحثّ (solicitation) كجزء من IRDP (ICMP Internet Router Discovery Protocol)، وهو نظام يسمح للمضيفين - بعد الإقلاع أو الانضمام لشبكة ما - بأن بكتشفوا تلقائيًا الموجّهات (routers) المتوفّرة.
	</p>

	<p>
		من الأفضل في معظم الحالات للمضيف أن يمتلك طرق (routes) ثابتة مُعدّة خصيصًا للبوابات التي سيستعملها. يجب أن يتم قبول هذه الحزم في نفس حالات حزم التوجيه من ICMP. في الواقع، بما أنّ المضيف لن يعرف الطرق الأكثر تفضيلًا لنقل التدفّق من بين جميع الطرق المكتشفة، فإنّ رسائل إعادة التوجيه غالبًا ما تكون مطلوبة مباشرةً بعد الاكتشاف. إذا كنت لا تشغل خدمة تقوم بإرسال حزم حثّ التوجيه (router solicitation) أو خدمة تقوم بتعديل الطرق بناءًا على حزم الإعلان (advertisement packets) مثل rdisc، فيمكنك حظر هذه الحزم بأمان.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h3 id="الأنواع-التي-من-الآمن-السماح-لها">
		الأنواع التي من الآمن السماح لها
	</h3>

	<p>
		ستجد أنواع ICMP الآمنة عادةً أدناه، لكن ربّما تريد تعطيلها إذا كنت تريد أن تكون في أمانٍ أكثر.
	</p>

	<ul><li>
			<strong>Type 8 — Echo request</strong>: هذه هي طلبات النبضات (ping requests) الموجّهة إلى خادومك. من الآمن السماح لها بالعمل على خادومك عادةً (منع هذه الحزم لن يخفي خادومك، هناك عدة طرق أخرى أمام المستخدمين ليعرفوا ما إذا كان خادومك يعمل حاليًا أم لا)، ولكن يمكنك منعها أو تحديد عناوين مصدر هذه الحزم وتقليلها إذا كنت تريد ذلك.
		</li>
		<li>
			<strong>Type 13 — Timestamp request</strong>: يمكن استخدام هذه الحزم بواسطة العملاء لجمع معلومات مواجهة الأعطال. يمكن استخدامها أيضًا في بعض تقنيات التقاط بصمات نظام التشغيل، لذا يمكنك منعها إن أردت.
		</li>
	</ul><p>
		يمكن السماح للأنواع التالية عمومًا دون الحاجة إلى قواعد (rules) خاصّة عبر إعداد جدارك الناري ليسمح بالردود على الطلبات التي قام بإرسالها (عبر استخدام وحدة conntrack للسماح بتدفّق ESATABLISHED وRELATED).
	</p>

	<ul><li>
			<strong>Type 0 — Echo replies</strong>: وهي عبارة عن الردود على طلبات النبضات (pings requests).
		</li>
		<li>
			<strong>Type 3 — Destination Unreachable</strong>: حِزَم بيانات الوجهة الغير متوفّرة العادية هي عبارة عن ردود طلبات تمّ إنشاؤها بواسطة خادومك، وهي تعني أنّه لم يتم توصيل حِزَم البيانات بشكلٍ صحيح.
		</li>
		<li>
			<strong>Type 11 — Time exceeded</strong>: هذا عبارة عن خطأ يتم إرجاعه في حال موت الحِزَم المُنشأة بواسطة خادومك قبل وصولها وجهتها بسبب تعدّيها لقيمة TTL الخاصّة بها.
		</li>
		<li>
			<strong>Type 12 — Parameter problem</strong>: يعني هذا أنّ حزمةً صادرة من خادومك قد تعرضت للتلف في طريقها.
		</li>
		<li>
			<strong>Type 14 — Timestamp responses</strong>: هي عبارة عن الردود على عمليات الاستعلام عن المنطقة الزمنية التي يتم تنفيذها بواسطة خادومك.
		</li>
	</ul><p>
		حجب تدفّق ICMP بأكمله ما يزال أمرًا مستحسنًا من قبل العديد من خبراء الحماية، ولكن العديد من الناس الآن ينصحون باستخدام سياسات ICMP ذكية بدلًا من منعه بالكامل.
	</p>
</div>

<div id="wmd-preview-section-19">
	<h2 id="تحديد-الاتصال-وتحديد-التردد">
		تحديد الاتصال وتحديد التردد
	</h2>

	<p>
		في بعض الخدمات وأنماط التدفّقات (traffic patterns)، ربّما تود السماح بالوصول من قبل جهاز العميل طالما أنّه لا يسيء استخدام هذا الوصول. هناك طريقتان لتقييد استخدام الموارد: تقييد الاتصال (connection limiting) وتقييد التردد أو المعدل (rate limiting).
	</p>
</div>

<div id="wmd-preview-section-20">
	<h3 id="تقييد-الاتصال">
		تقييد الاتصال
	</h3>

	<p>
		يمكن أن يتم تفعيل تقييد الاتصال عبر استخدام امتدادات مثل connlimit للتحقق من عدد الاتصالات النشطة التي قام جهاز العميل بفتحها. يمكن أن يتم استخدام هذا لتقييد عدد الاتصالات المسموحة في وقتٍ واحد. إذا كنت تخطط لاستخدام تقييد الاتصال، فيجب عليك اتخاذ بعض القرارات بخصوص هذا بغض النظر عن طريقة تطبيقك له. هذه القرارات هي: 
	</p>

	<ul><li>
			هل سيكون التقييد بناءًا على العنوان، الشبكة أم على أمورٍ عامّة أخرى؟ 
		</li>
		<li>
			هل سيكون التقييد لخدمة معينة فقط أم على الخادوم بأكمله؟
		</li>
	</ul><p>
		يمكن تقييد الاتصالات بناءًا على أجهزة الاستضافة أو شبكة معيّنة عبر استخدام بادئة شبكة ما (network prefix). يمكنك أيضًا تعيين حدٍّ أقصى لعدد الاتصالات المسموح بها لخدمة معيّنة أو للخادوم بأكمله. لا تنسى أيضًا أنّه بمقدورك استخدام جميع هذه الطرق أو بعضٍ منها لتحصل على خليط معقّد من السياسات المستعملة للتحكم في الاتصالات التي تريدها.
	</p>
</div>

<div id="wmd-preview-section-21">
	<h3 id="تقييد-التردد">
		تقييد التردد
	</h3>

	<p>
		يسمح لك تحديد التردد أو تحديد المعدل (rate limiting) بإنشاء قواعد (rules) تقوم بإدارة تردد أو معدل التدفّق الذي سيقبله خادومك. هناك عدد من الامتدادات المختلفة التي يمكن استخدامها لتقييد التردد مثل limit، hashlimit وrecent. اختيار الأنسبة من هذه الامتدادات يعتمد على الطريقة التي تريد تقييد التردد خلالها.
	</p>

	<p>
		سيتسبب الامتداد limit للقاعدة في السؤال بأن يتم مطابقتها إلى حين الوصول إلى الحد الأقصى، بعدها سيتم ترك أيّ حزم بيانات إضافية أخرى. إذا قمت باستخدام حد مثل “5/ثانية/، فإنّ القاعدة ستقوم بالسماح بمطابقة 5 حزم في الثانية الواحدة، بعدها، لن تسمح لأيّ حزم بأن تقوم بعملية المطابقة. هذا جيّد لتحديد الحدّ الأعلى العام لخدمة معيّنة من الحزم.
	</p>

	<p>
		لكنّ امتداد hashlimit يعتبر أكثر مرونةً، حيث يسمح لك بتحديد بعض القيم التي سيستخدمها iptables لتحقيق عملية المطابقة كذلك. مثلًا، يمكن لـhashlimit أن يتحقق من عنوان المصدر ومنفذه، عنوان الوجهة ومنفذها أو حتّى تشكيلة من هذه القيم الأربعة لمطابقة كل مُدخَلة (entry). يمكنه أيضًا أن يقوم بالتحديد بناءًا على عدد الحزم أو البايتات المتلقاة، وهو ما يوفّر تحديدًا أكثر مرونة على مستتوى العميل أو مستوى الخدمات.
	</p>

	<p>
		يقوم امتداد recent ديناميكيًا بإضافة عنوان IP العميل إلى قائمة بيضاء أو يتحقق من وجوده في قائمة سوداء عند مطابقة القاعدة. يسمح لك هذا باستخدام منطق أكثر تعقيدًا لإنشاء قواعد متعددة للحصول على نتيجة مبهرة. يمتلك أيضًا القدرة على تحديد العدد والوقت كالامتدادات الأخرى، ولكنه قادر أيضًا على إعادة تعيين مدى الوقت (timerange) في حال رؤية المزيد من تدفّق البيانات، حيث يجبر العميل على وقف التدفّق في حال وصوله إلى الحد الأقصى.
	</p>

	<p>
		اختيار واحدٍ من هؤلاء لتستعمله على خادومك يعتمد بشكلٍ كامل على السياسة التي تريد تطبيقها في خادومك.
	</p>
</div>

<div id="wmd-preview-section-22">
	<h2 id="الإدارة-كوحدة-متكاملة-مقابل-الإدارة-كسلسلة">
		الإدارة كوحدة متكاملة مقابل الإدارة كسلسلة
	</h2>

	<p>
		جميع سياسة iptables مرسّخة في توسيع السلاسل المبنية فيه أساسًا (built-in chains). في الجدران النارية البسيطة، يكون هذا على شكل تغيير السياسة الافتراضية للسلاسل وإضافة القواعد. في الجدران النارية الأكثر تعقيدًا، غالبًا ما يكون من الجيد توسيع إطار عمل الإدارة عبر إضافة المزيد من السلاسل.
	</p>

	<p>
		السلاسل المكوّنة من طرف المستخدمين (User-created chains) مقيّدة بطبيعتها إلى السلسلة التي تستدعيها. السلاسل المكوّنة من طرف المستخدمين لا تملك أيّ سياسة افتراضية، لذا إذا لم تنجح حزمة بيانات ما في المرور عبر سلسلة مكوّنة من طرف المستخدم، فإنّها ستعود إلى السلسلة وتتابع المطابقة. مع أخذ هذا في عين الاعتبار، تصبح السلاسل المكوّنة بواسطة المستخدم مفيدة جدًا في الأغراض التنظيمية، جعل شروط مطابقة القواعد أكثر وضوحًا ولتحسين قابلية القراءة عبر تقسيم شروط المطابقة.
	</p>

	<p>
		إذا كنت تكرر عمليّة معينة لعددٍ كبير من القواعد، فحينها قد يكون من المفيد إنشاء "jump rule" مع العملية أو المطابقة والشروط المطلوبة المشتركة في سلسلة جديدة، يمكنك إضافة مجموعة من القواعد دون المطابقة المشتركة ضمن تلك السلسلة.
	</p>

	<p>
		بغضّ النظر عن التنظيم البسيط، يمكن لهذا أن يفيدك بشكلٍ أكبر. مثلًا، الاستخدام الذكي للسلاسل لمجموعات متشابهة من القواعد يعني أنّ إضافة القواعد في الموقع الصحيح سيكون أسهل وأقل تعرّضًا للأخطاء. ويمكن أن يكون أسهل كذلك في عرض وفهم أجزاء السياسة التي تهتم بها عبر تحديد السلسلة.
	</p>

	<p>
		الاختيار ما بين تضمين جميع قواعدك في واحدةٍ من السلاسل الموجودة بالفعل في الجدار الناري أو عبر إنشاء وتعديل سلاسل جديدة يعتمد بشكلٍ رئيسي لمدى التعقيد والبساطة والأهداف التي تسعى إلى تحقيقها على خادومك.
	</p>
</div>

<div id="wmd-preview-section-23">
	<h2 id="خاتمة">
		خاتمة
	</h2>

	<p>
		الآن، يفترض أنك تمتلك معرفة جيدة حول بعض القرارات التي يجب عليك اتخاذها عند تصميم سياسات الجدار الناري لخواديمك. بشكلٍ عام، الوقت الذي ستستغرقه في إعداد الجدار الناري لأوّل مرّة سيسهل مهام الإدارة عليك لاحقًا. صحيحٌ أنّ العملية ستحتاج الكثير من الوقت والخبرة والتجارب للحصول على أفضل سياسة تلائم خواديمك، ولكن القيام بهذا سيوفّر لك تحكمًا أكبر في حمايتها.
	</p>

	<p>
		إذا كنت تريد معرفة المزيد عن <a href="https://academy.hsoub.com/tags/%D8%AC%D8%AF%D8%A7%D8%B1%20%D9%86%D8%A7%D8%B1%D9%8A/">الجدران النارية</a> و <a href="https://academy.hsoub.com/tags/iptables/">iptables</a> بالتحديد، فيمكنك التحقق من المقالات التالية: 
	</p>

	<ul><li>
			<a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D9%88%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84%D8%9F-r114/">كيف يعمل جدار iptables الناري</a>. 
		</li>
		<li>
			<a href="http://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1%D9%8D-%D9%86%D8%A7%D8%B1%D9%8A%D9%91-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D8%B9%D9%84%D9%89-ubuntu-1404-r38/">إعداد جدار ناري باستخدام iptables على Ubuntu 14.04</a>. 
		</li>
		<li>
			<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1%D8%A7-%D9%86%D8%A7%D8%B1%D9%8A%D8%A7-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ufw-r120/">إعداد جدار ناري باستخدام UFW على Ubuntu 14.04</a>. 
		</li>
	</ul><p>
		ترجمة -وبتصرّف- لـلمقال: <a href="https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to-secure-your-servers" rel="external nofollow" target="_blank">How To Choose an Effective Firewall Policy to Secure your Servers</a> لصاحبه Justin Ellingwood.
	</p>
</div>
]]></description><guid isPermaLink="false">244</guid><pubDate>Sun, 13 Mar 2016 21:31:22 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62E;&#x62A;&#x627;&#x631; &#x633;&#x64A;&#x627;&#x633;&#x629; &#x641;&#x639;&#x627;&#x644;&#x629; &#x644;&#x644;&#x62C;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A; &#x644;&#x62A;&#x623;&#x645;&#x64A;&#x646; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645;&#x643; - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%B3%D9%8A%D8%A7%D8%B3%D8%A9-%D9%81%D8%B9%D8%A7%D9%84%D8%A9-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D9%84%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85%D9%83-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r232/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/how-to-choose-firewall-policy.png.dbfb8c2d30642d5e78f38210f1216e69.png" /></p>

<div id="wmd-preview-section-16">
	<p>
		استخدام الجدار الناري (firewall) يعتمد كثيرًا على السياسة (policy) التي ستتبعها في تصفية تدفّقات البيانات (data traffics) بنفس درجة اعتماده على تعلّمك للأوامر الأساسية وطريقة الاستخدام. بعض الجدران النارية مثل <a href="https://academy.hsoub.com/tags/iptables/" rel="">ـiptables</a> تمتلك القدرة على فرض سياسات معيّنة يتم تحديدها من قبل مدير النظام، ولكن كواحدٍ من هؤلاء، يجب أن تعرف أفضل السياسات المناسبة لتطبيقها على البيئة الخاصّة بك.
	</p>

	<p style="text-align: center;">
		<img alt="how-to-choose-firewall-policy.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13411" data-unique="jluo5alea" src="https://academy.hsoub.com/uploads/monthly_2016_02/how-to-choose-firewall-policy.png.6787bb149f6c89221f4e2613b31875c9.png"></p>

	<p>
		بينما تركّز <a href="http://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1%D9%8D-%D9%86%D8%A7%D8%B1%D9%8A%D9%91-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D8%B9%D9%84%D9%89-ubuntu-1404-r38/" rel="">دروسٌ أخرى</a> على الأوامر اللازمة للحصول على جدار ناري فعّال، في هذا الدرس، سنناقش بعض الأمور التي يجب عليك فعلها عندما تقوم بتشغيل جدار ناري. ستؤثّر هذه الخيارات على الطريقة التي يتصرّف بها جدارك الناري، وعلى المدى الذي يجب إحكام إقفال خادومك إليه، بالإضافة إلى طريقة استجابته لمختلف الشروط التي قد تطرأ من حينٍ إلى آخر. سنستخدم iptables في درس اليوم، إلّا أنّ معظم ما سنتكلّم عنه سينطبق على أيّ أداة بغضّ النظر عن نوعها.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h2 id="اختيار-السياسة-الافتراضية">
		اختيار السياسة الافتراضية
	</h2>

	<p>
		عند بناء جدارٍ ناريّ فإن السياسة الافتراضية هي واحدة من الأشياء الأساسية التي يجب عليك التفكير فيها. تحدد السياسة الافتراضية ما يجب أن يحصل لتدفّقات البيانات في حال عدم مطابقتها لأيّ قاعدة (rule). يمكن افتراضيًا للجدار الناري أن يقبل أيّ تدفّق لا يطابق القواعد المعيّنة أو أن يرفضه.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h3 id="القبول-افتراضيا-مقابل-الرفض-افتراضيا">
		القبول افتراضيا مقابل الرفض افتراضيا
	</h3>

	<p>
		سياسة "Accept" (قبول) الإفتراضية تعني أنّه سيتم السماح لأيّ تدفّق غير مطابق للقواعد المعيّنة مسبقًا بالمرور إلى الخادوم. لا ينصح باستخدام هذه السياسة افتراضيًا لأنّ هذا يعني أنّك ستقوم بعمل قائمة سوداء لمنع ما تريد منعه من الوصول إلى خادومك. القوائم السوداء صعبة الإدارة لأنّه يجب عليك متابعة وحظر جميع أنواع التدفّقات التي لا تريدها في خادومك. يمكن أن يؤدي هذا إلى الكثير من وجع الرأس بالإضافة إلى مشاكل تقنية في حال حصول غلطة بسيطة في القائمة السوداء مثلًا، لذلك هو أمرٌ غير مستحسن.
	</p>

	<p>
		الحلّ البديل هو "drop" (ترك) التدفّق افتراضيًا. هذا يعني أنّه لن يتم السماح لأيّ تدفّق لا يطابق القواعد المعيّنة مسبقًا بالوصول إلى الخادوم (أو الخروج منه)، وهو أمرٌ مشابه للقوائم البيضاء وقوائم تحكّم الوصول (Access Control List) حيث يجب السماح بشكلٍ استثنائي وخاصّ بأن يتم تشغيل وتنفيذ كلّ خدمة متوفّرة على حدى، والذي قد يحتاج الكثير من الوقت والجهد في البداية، ولكنّ هذا يعني أنّ السياسة الافتراضية الخاصّة بك ستكون أكثر أمانًا وستعرف بالضبط نوع تدفّق البيانات الداخل إلى خادومك.
	</p>

	<p>
		عليك الاختيار بين التوجّه نحو الخيار الأكثر أمانًا أو السماح للخدمات بالتحرّك بشكلٍ أكثر حرّية خارج الصندوق. صحيحٌ أنّ خيار استخدام سياسة "Accept" (قبول) افتراضيًا مع الجدار الناري قد يكون أفضل ما تفكّر به للوهلة الأولى، ولكن - في غالب الأحيان - من الأفضل في الواقع أن تستخدم سياسة "منع" افتراضيًا للجدار الناري.
	</p>
</div>

<div id="wmd-preview-section-19">
	<h3 id="سياسة-drop-افتراضيا-مقابل-قاعدة-drop-نهائية">
		سياسة "drop" افتراضيا مقابل قاعدة "drop" نهائية
	</h3>

	<p>
		الخيار السابق باستخدام سياسة "drop" (ترك) افتراضيًا يقود إلى قرارٍ مهم آخر. في iptables والجدران النارية المشابهة الأخرى، يمكن أن يتم تعيين السياسة الافتراضية باستخدام خصائص داخلية للجدار الناري، أو تضمينها عبر إضافة قاعدة "drop" (ترك) شاملة في نهاية قائمة قواعد الجدار الناري.
	</p>

	<p>
		الفرق بين هذين الطريقتين هو فيما سيحصل في حال تمّ مسح (flush) قواعد الجدار الناري.
	</p>

	<p>
		إذا كانت السياسة الافتراضية الداخلية في الجدار الناري الخاصّ بك معيّنة على "drop" (ترك) التدفّق وحصل يومًا ما وأن تمّ مسح قواعد الجدار الناري أو حذف بعضٍ منها عن طريق الخطأ مثلًا، فإنّ جميع الخدمات التي تشغّلها على الخادوم ستصبح غير قابلة للوصول. هذه غالبًا فكرة جيّدة عند ضبط الخدمات غير الحساسة على خادومك لكي لا يتم السماح للبرامج والأدوات الخبيثة بالمرور إذا اختفت القواعد فجأة.
	</p>

	<p>
		لكنّ الجانب المظلم في هذا التوجّه هو أنّ خدماتك ستصبح فورًا غير متوفّرة لمستخدميك إلى حين أن تقوم بإعادة تعيين قواعد الوصول مجددًا. يمكن أحيانًا أن تقوم بقفل الباب على نفسك وأنت في خارج الخادوم، الأمر سيّئ خاصّة إذا لم تكن تقدر على الوصول "فيزيائيا" إلى الخادوم أو وسيلةً أخرى للاتصال به (خواديم DigitalOcean قابلة للوصول دومًا بغضّ النظر عن إعدادات الشبكة عبر استخدام زرّ "Console Access" الموجود في قسم "Access" من لوحة التحكّم الخاصّة بالخادوم). إذا كنت أنت من يريد إعادة تعيين القواعد ومسحها بشكلٍ مقصود، فيمكنك ببساطة تجنّب هذه المشكلة عبر تغيير السياسة الافتراضية إلى "Accept" (قبول) مباشرةً قبل إعادة تعيين ومسح القواعد.
	</p>

	<p>
		الخيار البديل لما سبق هو تعيين السياسة الافتراضية الخاصّة بك إلى "Accept" (قبول) مع تضمين قاعدة "drop" (ترك) في النهاية مع القواعد الأخرى. يمكنك إضافة قاعدة عادية في نهاية قائمة القواعد الخاصّة بك تقوم بمطابقة ومنع كلّ التدفّق الباقي الغير مُطابق.
	</p>

	<p>
		في هذه الحالة، إذا تمّ إعادة تعيين قواعد الجدار الناري الخاصّة بك، فإنّ خدماتك ستكون قابلة الوصول ولكن غير محمية. اعتمادًا على خياراتك للوصول المحلّي أو البديل، يمكن أن يكون هذا شرًّا ضروريًا لكي تضمن أنّك قادر على الوصول إلى خادومك مجددًا في حال مُسحت قواعد الجدار الناري. إذا قررت استخدام هذا الخيار، فيجب أن تضمن أنّ قاعدة "drop" (ترك) التدفّق الغير مطابق هي دومًا آخر قاعدة في قائمة قواعد الجدار الناري.
	</p>
</div>

<div id="wmd-preview-section-20">
	<h2 id="ترك-التدفق-مقابل-رفضه">
		ترك التدفق مقابل رفضه
	</h2>

	<p>
		هناك بضع طرق مختلفة لمنع حزمة بيانات (packet) من المرور إلى الوجهة التي تريدها. الاختيار المختلف لواحدٍ من هذه الطرق سيؤثر على الطريقة التي يقوم المستخدمون من خلالها بمحاولة الاتصال بالخادوم وسرعة إدراكهم أنّه لن يتم خدمة طلبهم الذي أرسلوه مسبقًا.
	</p>

	<p>
		الطريقة الأولى التي يمكن من خلالها منع حِزَم البيانات هي عبر "drop" (ترك) التدفّق. يمكن أن يتم استخدام الـ "ترك (drop)" كسياسة افتراضية أو ضمن قواعد الجدار الناري. عندما يتم ترك حزمة بيانات، يقوم iptables ببساطة برميها بعيدًا، حيث لا يقوم بإرسال أيّ رد إلى العميل الذي يحاول الاتصال ولا يقوم حتّى بإرجاع ردّ أنّه قد استلم الطلب بنجاح أم لا. هذا يعني أنّ العملاء لن يعرفوا ما إذا كان الخادوم قد وصله طلبهم أساسًا أم لا.
	</p>

	<p>
		لمحاولات الاتصال عبر بروتوكول TCP، سيتم الحفاظ على الاتصال إلى حين انقضاء مهلته (timeout). بما أنّ بروتوكول UDP هو بروتوكول غير اعتمادي على الاتصال (connectionless)، فإنّ عدم توفّر الردّ للعملاء يصبح أكثر إيهامًا. في الواقع، غالبًا ما يكون عدم تلقّي ردّ في هذه الحالة دليلًا على أنّ حزمة البيانات قد قُبلت. إذا كان عميل UDP يهتم بالجهة التي يرسل الحِزَم إليها، فسيقوم بإرسالها مجددًا لكي يتحقق مما إذا تمّ قبولها أو فقدانها أو رفضها. قد يزيد هذا من الوقت الذي يجب على البرمجيات والشفرات الخبيثة استغراقه للحصول على معلوماتٍ صحيحة عن حالة المنافذ في خادومك، لكنّه قد يسبب أيضًا مشكلة للتدفّق العادي.
	</p>

	<p>
		الخيار البديل هنا هو ببساطة رفض حزم البيانات التي لا تريدها بشكلٍ استثنائي. ICMP أو بروتوكول رسائل التحكّم بالإنترنت (Internet Control Message Protocol) هو عبارة عن بروتوكول وصفي (meta-protocol) يستعمل عبر الإنترنت لإرسال الحالة ومعلومات مواجهة الأعطال ورسائل الخطأ بين المضيفين (hosts) ضمن قناة لا تعتمد على اتصالات البروتوكولات التقليدية مثل TCP وUDP. عندما تقوم بـ "رفض" شيءٍ ما، فإنّ التدفّق سيتم منعه وسيتم إعادة حزمة ICMP إلى المُرسِل لإعلامه أنّ البيانات التي أرسلها قد تمّ استلامها إلّا أنّه قد تمّ رفضها. يمكن لرسالة الحالة أن تشير إلى السبب أيضًا.
	</p>

	<p>
		توجد العديد من العواقب لهذا، بافتراض أنّ تدفّق ICMP قادر على الرجوع إلى العميل، فإنّه سيتم إخطاره مباشرةً أنّ التدفّق الخاص به محظور. للعملاء العاديين، سيعني هذا أنّه يجب عليهم الاتصال بمدير الخادوم للاستفسار عن السبب أو التحقق من خيارات اتصالاتهم للتأكّد من أنّهم يتصلون عبر المنفذ الصحيح. أمّا بالنسبة للمستخدمين السيئين والذين يحاولون اختراق الخادوم، فإنّ هذا يعني أنّه يمكنهم إكمال عمليات بحثهم عن المنافذ المفتوحة والمغلقة والمُرشّحة في وقتٍ أقصر.
	</p>

	<p>
		هناك الكثير من الأمور التي يجب أخذها بعين الاعتبار عندما تقرر قبول أو رفض تدفّق البيانات. من بينها معرفة أنّ غالب تدفّق البيانات الخبيث الذي يتم إرساله بواسطة المخترقين يتم إرساله في الواقع عبر سكربتات وبرامج مؤتمتة، وبما أنّها ليست حساسة للوقت، فإنّ ترك التدفّق العادي لن يكون مفضلًا حيث أنّه سيؤثر على المستخدمين العاديين للخادوم. يمكنك قراءة المزيد عن هذا من <a href="http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject" rel="external nofollow">هنا</a>.
	</p>
</div>

<div id="wmd-preview-section-21">
	<h3 id="جدول-المقارنة-بين-ترك-الطلب-ورفضه">
		جدول المقارنة بين ترك الطلب ورفضه
	</h3>

	<p>
		يظهر الجدول أدناه كيفية حماية خادوم بواسطة جدارٍ ناريّ، حيث سيقوم بالاستجابة إلى طلباتٍ مختلفة بناءًا على السياسة التي يتم تطبيقها على منافذ معيّنة.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_02/firewall-policy.png.bf200197d454e571f7a350b24de6a36b.png" data-fileid="13410" rel="external"><img alt="firewall-policy.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13410" data-unique="vjwa86ja4" src="https://academy.hsoub.com/uploads/monthly_2016_02/firewall-policy.thumb.png.377b257042f1e5d51c33a5bd12a56fb8.png"></a>
	</p>

	<p>
		يحدد العمود الأول نوع حزمة البيانات التي يتم إرسالها بواسطة العميل، بينما في الثاني، نقوم بذكر أمر <span style="font-family:courier new,courier,monospace;">nmap</span> الذي سنستخدمه لاختبار كلّ سيناريو. يحدد العمود الثالث سياسة المنفذ المتبّعة على المنفذ، بينما الرابع يحدد الرد الذي سيتم إرجاعه إلى من طرف الخادوم. والخامس، هو ما يمكن للعميل أن يفهمه بناءًا على الرد الذي تلقاه.
	</p>

	<p>
		ترجمة -وبتصرّف- لـلمقال: <a href="https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to-secure-your-servers" rel="external nofollow">How To Choose an Effective Firewall Policy to Secure your Servers</a> لصاحبه Justin Ellingwood.
	</p>
</div>
]]></description><guid isPermaLink="false">232</guid><pubDate>Mon, 29 Feb 2016 00:15:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x623;&#x645;&#x646; &#x648;&#x627;&#x644;&#x62D;&#x645;&#x627;&#x64A;&#x629; &#x639;&#x644;&#x649; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;: &#x627;&#x644;&#x62C;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%85%D9%86-%D9%88%D8%A7%D9%84%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-r185/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-firewall.png.284fc0dc734b63043dd6cc94c141a481.png" /></p>

<p dir="rtl">تتضمن نواة لينُكس النظام الفرعي Netfilter الذي يُستخدَم لتعديل أو تحديد مصير البيانات الشبكية الداخلة أو الخارجة من الخادوم، تَستخدم جميع الجدر النارية في لينُكس هذا النظام لترشيح الرزم الشبكية.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-firewall.png.4a16ba4e7816e3455c2c31627f81b18a.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="11589" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-firewall.thumb.png.e3db985d273302f6b47f91e53c99a631.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-firewall.thumb.png.e3db985"></a></p><p dir="rtl">نظام ترشيح الرزم الخاص بالنواة لن يكون مفيدًا لمدراء الأنظمة دون واجهة لإدارته، وهذا هو الغرض من <span style="font-family:courier new,courier,monospace;">iptables</span>؛ فعندما تصل رزمة شبكية إلى خادومك، فستتوجه إلى النظام الفرعي Netfilter للموافقة أو التعديل أو الرفض بناءً على القواعد الموفَّرة لها من المستخدم عبر iptables؛ ولهذا سيكون iptables هو كل ما تحتاج لإدارة الجدار الناري إن كان مألوفًا لديك، لكن العديد من الواجهات المتوفرة له ستُبسِّط العملية.</p><h2 dir="rtl">الجدار الناري ufw‏</h2><p dir="rtl">أداة ضبط الجدار الناري الافتراضية في أوبنتو هي <strong>ufw</strong>، التي طُوِّرَت لتسهيل ضبط جدار iptables الناري، توفر ufw واجهة «صديقة» للمستخدم لإنشاء جدار ناري لعناوين IPv4 أو IPv6.</p><p dir="rtl">إن ufw معطَّل افتراضيًّا. من صفحة دليل <span style="font-family:courier new,courier,monospace;">man ufw</span>:</p><blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote=""><p dir="rtl">«لم يطوَّر ufw لتوفير وظيفة جدار ناري كاملة عبر واجهته السطرية، لكنه يوفر طريقةً سهلةً لإضافة أو حذف القواعد؛ ويستخدم حاليًا استخدامًا رئيسيًا للجدر النارية المعتمدة على المضيف (host-based firewalls).»</p></blockquote><p dir="rtl">هذه بعض أمثلة استخدام ufw:</p><ul><li><p dir="rtl">أولًا، يجب أن نفعِّل ufw، أدخِل الأمر الآتي في الطرفية:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw enable</pre><ul><li><p dir="rtl">لفتح منفذ ما (<abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> في هذا المثال):</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 22</pre><ul><li><p dir="rtl">وبشكلٍ مشابه، لإغلاق منفذ مفتوح:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw deny 22</pre><ul><li><p dir="rtl">لحذف قاعدة، استخدم الكلمة delete متبوعةً بالقاعدة:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw delete deny 22</pre><ul><li><p dir="rtl">من الممكن أيضًا السماح بالوصول من مضيفين أو شبكات محددة لمنفذٍ ما؛ يسمح المثال الآتي بالوصول لمنفذ <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> من المضيف 192.168.0.2 لأي عنوان IP في هذا المضيف:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow proto tcp from 192.168.0.2 to any port 22</pre><p dir="rtl">يمكن استخدام 192.168.0.0/24 بدلًا من 192.168.0.2 للسماح بالوصول عبر <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> لكامل الشبكة الفرعية.</p><ul><li><p dir="rtl">إضافة الخيار ‎<span style="font-family:courier new,courier,monospace;">--dry-run</span> لأمر ufw سيجعله يخرج القواعد الناتجة، لكنه لن يطبقها؛ على سبيل المثال، ما يلي هو ما سيحدث لو فتحنا منفذ HTTP:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw --dry-run allow http</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">*filter
:ufw-user-input - [0:0]
:ufw-user-output - [0:0]
:ufw-user-forward - [0:0]
:ufw-user-limit - [0:0]
:ufw-user-limit-accept - [0:0]
### RULES ###

### tuple ### allow tcp 80 0.0.0.0/0 any 0.0.0.0/0
-A ufw-user-input -p tcp --dport 80 -j ACCEPT

### END RULES ###
-A ufw-user-input -j RETURN
-A ufw-user-output -j RETURN
-A ufw-user-forward -j RETURN
-A ufw-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT]: "
-A ufw-user-limit -j REJECT
-A ufw-user-limit-accept -j ACCEPT
COMMIT
Rules updated</pre><ul><li><p dir="rtl">يمكن تعطيل ufw بالأمر:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw disable</pre><ul><li><p dir="rtl">أدخل الأمر لمعرفة حالة الجدار الناري:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw status</pre><ul><li><p dir="rtl">لمعلومات تفصيلية عن حالة الجدار الناري، استخدم:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw status verbose</pre><ul><li><p dir="rtl">لعرض أرقام بجوار القواعد (لحذفها مثلًا) فاستخدم الكلمة المحجوزة numbered:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw status numbered</pre><p dir="rtl"><strong>ملاحظة</strong>: إن كان المنفذ الذي تريد فتحه أو إغلاقه معرفًا في ‎<span style="font-family:courier new,courier,monospace;">/etc/services</span>، فيمكنك استخدام اسم المنفذ بدلًا من رقمه؛ حيث استبدل 22 بالكلمة <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> في الأمثلة السابقة.</p><p dir="rtl">هذه مجرد مقدمة سريعة عن استخدام ufw، رجاءً راجع صفحة دليل ufw لمزيد من المعلومات.</p><h3 dir="rtl">دمج التطبيقات مع ufw</h3><p dir="rtl">تستطيع التطبيقات التي تفتح منافذ أن تُضمِّن ملف ufw الذي يبيّن أيّة منافذ يحتاج التطبيق لفتحها لكي يعمل عملًا تامًا؛ هذه الملفات موجودة في <span style="font-family:courier new,courier,monospace;">‎/etc/ufw/applications.d</span> ويمكن أن تُعدَّل إذا تغيَّرت المنافذ الافتراضية.</p><ul><li><p dir="rtl">استخدم الأمر الآتي في الطرفية لعرض التطبيقات التي ثبتت أحد تلك الملفات:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw app list</pre><ul><li><p dir="rtl">وبشكل شبيه للسماح بالاتصالات إلى منفذ معين، فيُفعَّل استخدام ملف ضبط أحد التطبيقات بالأمر:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow Samba</pre><ul><li><p dir="rtl">يمكن استخدام التعبير المُوسَّع كالآتي:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ufw allow from 192.168.0.0/24 to any app Samba</pre><p dir="rtl">استبدل «Samba» و 192.168.0.0/24 باسم التطبيق ومجال IP لشبكتك.</p><p dir="rtl"><strong>ملاحظة</strong>: لا توجد هنالك حاجة لتحديد البروتوكول للبرنامج الذي ستُفعِّله، لأن هذه المعلومات مفصَّلة بالملف الخاص به، لاحظ أن اسم التطبيق يستبدل رقم المنفذ.</p><ul><li><p dir="rtl">لعرض معلومات حول المنافذ والبروتوكولات (...إلخ.) المُعرَّفة لتطبيقٍ ما، فأدخِل الأمر:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw app info Samba</pre><p dir="rtl">ليس لكل التطبيقات التي تتطلب فتح منفذ شبكي ملف ufw خاص؛ إذا كتبت ذاك الملف لتطبيق ما، وأردت أن يُضمَّن هذا الملف مع الحزمة، فرجاءً بلِّغ عن علة في تلك الحزمة على Lanuchpad:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ubuntu-bug nameofpackage</pre><h2 dir="rtl">تنكر IP</h2><p dir="rtl">الغاية من تنكر IP‏ (IP Masquerading) هو السماح للأجهزة التي تملك IP خاص غير قابل للتوجيه في شبكتك بالوصول إلى الإنترنت عبر الجهاز الذي يقوم بالتنكر؛ يجب أن تُعالَج البيانات الشبكية من شبكتك الخاصة إلى الإنترنت لكي توجَّه الردود إلى الجهاز الذي قام بالطلب، ويجب أن تُعدِّل النواة قيمة عنوان IP المصدر لكل رزمة شبكية لكي تصبح قابلة للتوجيه إلى الخادوم، بدلًا من عنوان IP الخاص (private IP) الذي قام بالطلب، الذي يكون مستحيلًا عبر الإنترنت؛ يستخدم لينُكس تعقب الاتصال (conntrack) لكي يتعقب أيّة اتصالات تتعلق بأيّة أجهزة وإعادة توجيه كل رزمة مُعادة وفقًا لذلك؛ أي أن البيانات الشبكية الخارجة من شبكتك المحلية هي «مُتنكِّرة» ﻷنها تنشأ من البوابة (خادومك)؛ يُشار إلى هذه العملية في توثيق مايكروسوفت باسم «مشاركة اتصال الإنترنت» (Internet Connection Sharing).</p><h3 dir="rtl">تنكر ufw</h3><p dir="rtl">يمكن أن يجرى تنكر IP بقواعد ufw مخصصة؛ هذا ممكن لأن السند الخلفي للأداة ufw هو <span style="font-family:courier new,courier,monospace;">iptables-restore </span>مع ملفات القواعد المخزنة في ‎<span style="font-family:courier new,courier,monospace;">/etc/ufw/*.rules</span>؛ هذه الملفات هي مكان ممتاز لإضافة قواعد iptables بدون ufw، وللقواعد التي تتعلق تعلقًا كبيرًا بالبوابات الشبكية أو الجسور.</p><p dir="rtl">تُقسَّم القواعد إلى ملفين مختلفين، القواعد التي يجب أن تُنَفَّذ قبل القواعد السطرية التابعة للأداة ufw، والقواعد التي تُنفَّذ بعدها.</p><ul><li><p dir="rtl">أولًا، يجب أن يُفعَّل تمرير الرزم في ufw، يجب أن يُعدَّل ملفي إعدادات؛ غيِّر قيمة <span style="font-family:courier new,courier,monospace;">DEFAULT_FORWARD_POLICY</span> إلى "ACCEPT" في ملف <span style="font-family:courier new,courier,monospace;">‎/etc/default/ufw</span>:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">DEFAULT_FORWARD_POLICY="ACCEPT"</pre><p dir="rtl">ثم عدِّل الملف<span style="font-family:courier new,courier,monospace;"> ‎/etc/ufw/sysctl.conf </span>وأزل التعليق عن:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">net/ipv4/ip_forward=1</pre><p dir="rtl">وبشكل مشابه، لتمرير IPv6 أزل التعليق عن:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">net/ipv6/conf/default/forwarding=1</pre><ul><li><p dir="rtl">سنضيف الآن القواعد إلى ملف ‎<span style="font-family:courier new,courier,monospace;">/etc/ufw/before.rules</span>؛ القواعد الافتراضية تضبط جدول filter فقط، ويجب ضبط جدول nat لتفعيل التنكر؛ أضف ما يلي إلى أعلى الملف بعد تعليقات الترويسة مباشرةً:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic from eth1 through eth0.
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT</pre><p dir="rtl">ليست التعليقات ضروريةً، لكنها من المستحسن توثيق ملفات الضبط؛ وعند تعديل أي من ملفات «القواعد» في ‎<span style="font-family:courier new,courier,monospace;">/etc/ufw</span>، فتأكد من أن هذين السطرين موجودان في نهاية الملف لكل جدول عدَّلته:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT</pre><p dir="rtl">يجب أن تتوفر عبارة COMMIT في نهاية كل جدول، وقد ظهر في الأمثلة السابقة جدولا nat و filter فقط، لكنك تستطيع إضافة القواعد لجدولَيّ raw و mangle.</p><p dir="rtl"><strong>ملاحظة</strong>: استبدل-في المثال السابق- eth0 و eth1 و 192.168.0.0/24 بالبطاقات ومجال IP الملائمين.</p><ul><li><p dir="rtl">في النهاية، عطِّل وأعد تفعيل ufw لتطبيق التغيرات:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw disable &amp;&amp; sudo ufw enable</pre><p dir="rtl">يجب أن يُفعَّل تنكر IP الآن، تستطيع إضافة أية قواعد FORWARD إضافية إلى ملف<span style="font-family:courier new,courier,monospace;"> ‎/etc/ufw/before.rules</span>؛ من المستحسن إضافة هذه القواعد في سلسلة<span style="font-family:courier new,courier,monospace;"> ufw-before-forward</span>.</p><h3 dir="rtl">تنكر iptables</h3><p dir="rtl">يمكن أن يُستخدَم iptables لتفعيل التنكر.</p><ul><li><p dir="rtl">وبشكل شبيه للأداة ufw، أول خطوة هي تفعيل تمرير IPv4 بتعديل ملف<span style="font-family:courier new,courier,monospace;"> ‎/etc/sysctl.conf</span> وإزالة التعليق عن السطر الآتي:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">net.ipv4.ip_forward=1</pre><p dir="rtl">إذا أردت تفعيل تمرير IPv6، فأزل التعليق عن:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">net.ipv6.conf.default.forwarding=1</pre><ul><li><p dir="rtl">تاليًا، نفِّذ الأمر <span style="font-family:courier new,courier,monospace;">sysctl</span> لتفعيل الإعدادات الجديدة في ملف الضبط:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo sysctl -p</pre><ul><li><p dir="rtl">يمكن أن يُفعَّل تنكر IP بقاعدة iptables واحدة، التي يمكن أن تختلف اختلافًا بسيطًا بناءً على ضبط شبكتك:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE</pre><p dir="rtl">يفترض الأمر السابق أن مجال شبكتك الخاصة هو 192.168.0.0/16 وأن الجهاز الذي يمتلك اتصالًا بالإنترنت هو ppp0، نستطيع تقسيم الأمر السابق كما يلي:</p><ul dir="rtl"><li>‎<strong>-t nat</strong>: القاعدة ستذهب لجدول nat.</li><li><strong>‎-A POSTROUTING</strong>: ستُضاف القاعدة (‎-A) إلى سلسلة POSTROUTING.</li><li><strong>‎-s 192.168.0.0/16</strong>: تطبَّق القاعدة على البيانات الآتية من مجال العناوين المحدد.</li><li><strong>‎-o ppp0</strong>: القاعدة تُطبَّق على البيانات المقرر توجيهها عبر الجهاز الشبكي المحدد.</li><li><strong>‎-j MASQUERADE</strong>: ستقفز (jump) البيانات المُطابِقة لهذه القاعدة إلى هدف MASQUERADE لكي تُعالَج كما هو مشروح في الأعلى.</li></ul><p dir="rtl">أيضًا، كل سلسلة في جدول filter (الجدول الافتراضي، ومكان حدوث أغلبية ترشيح الرزم الشبكية) تكون سياستها الافتراضية هي ACCEPT؛ لكن إن كنت تُنشِئ جدارًا ناريًا بالإضافة إلى بوابة، فربما تحتاج إلى ضبط السياسات إلى DROP أو REJECT؛ وفي هذه الحالة تحتاج البيانات المتنكرة إلى السماح لها في سلسلة FORWARD لكي تعمل القاعدة السابقة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.0.0/16 -m state \
--state ESTABLISHED,RELATED -i ppp0 -j ACCEPT</pre><p dir="rtl">ستسمح الأوامر السابقة لجميع الاتصالات من شبكتك المحلية إلى الإنترنت، ولعودة البيانات المتعلقة بهذه الاتصالات إلى الجهاز الذي طلبها.</p><ul><li><p dir="rtl">إذا أردت تفعيل التنكر عند الإقلاع -الذي تريد تفعيله في غالب الأحيان- فعدِّل ملف <span style="font-family:courier new,courier,monospace;">‎/etc/rc.local </span>وأضف الأوامر السابقة؛ على سبيل المثال، أضف الأمر السابق دون ترشيح:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE</pre><h2 dir="rtl">السجلات Logs</h2><p dir="rtl">سجلات الجدار الناري مهمة جدًا للتعرف على الهجمات، واستكشاف أخطاء قواعد الجدار الناري، وملاحظة النشاط غير الطبيعي في شبكتك؛ يجب أن تضمِّن قواعد للتسجيل في جدارك الناري لكي تولَّد السجلات، ويجب أن تأتي قواعد السجلات قبل قواعد الإنهاء (القواعد التي تحدد مصير الرزمة، مثل ACCEPT، أو DROP، أو REJECT).</p><p dir="rtl">إذا كنت تستخدم ufw، فبإمكانك تفعيل التسجيل بإدخال الأمر الآتي في الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw logging on</pre><p dir="rtl">لكي توقف التسجيل في ufw، فببساطة بدل on بالكلمة off في الأمر السابق.</p><p dir="rtl">إذا كنت تستخدم iptables بدلًا من ufw، فأدخل الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 \
-j LOG --log-prefix "NEW_HTTP_CONN: "</pre><p dir="rtl">طلبيةٌ على المنفذ 80 من الجهاز المحلي ستولدُ سجلًا في dmesg الذي يبدو كما يلي (سطرٌ واحدٌ فقط قُسِّمَ إلى عدِّة أقسام):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[4304885.870000] NEW_HTTP_CONN: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00
SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=58288
DF PROTO=TCP SPT=53981 DPT=80 WINDOW=32767 RES=0x00 SYN URGP=0</pre><p dir="rtl">سيظهر السجل السابق في ملف ‎<span style="font-family:courier new,courier,monospace;">/var/log/massages</span>، و ‎<span style="font-family:courier new,courier,monospace;">/var/log/syslog</span>، و ‎<span style="font-family:courier new,courier,monospace;">/var/log/kern.log</span>؛ يمكن تعديل هذا السلوك بتعديل ‎<span style="font-family:courier new,courier,monospace;">/etc/syslog.conf</span> تعديلًا ملائمًا أو بتثبيت وضبط ulogd وباستخدام الهدف ULOG بدلًا من LOG، العفريت ulogd هو خادوم في مجال المستخدم (userspace server) الذي يستمع إلى تعليمات التسجيل من النواة وخصوصًا للجدر النارية، ويمكنك التسجيل إلى أي ملف تريد، وحتى إلى قواعد بيانات PostgreSQL أو MySQL؛ يمكن تسهيل فهم سجلات الجدار الناري باستخدام أداة تحليل سجلات مثل logwatch، أو fwanalog، أو fwlogwatch، أو lire.</p><h2 dir="rtl">أدوات أخرى</h2><p dir="rtl">هنالك أدوات عديد متوفرة لتساعدك في بناء جدار ناري كامل دون أن تكون لديك المعرفة الجيدة باستخدام <span style="font-family:courier new,courier,monospace;">iptables</span>؛ للميالين للبرامج الرسومية:</p><ul><li><p dir="rtl">برنامج <a rel="external nofollow" href="http://www.fwbuilder.org/">fwbulider</a><a rel="external nofollow" name="sdfootnote1anc" href="#sdfootnote1sym">1</a> هو قوي جدًا وسيكون مألوفًا للمدراء الذين تعاملوا مع أدوات تجارية لإدارة الجدر النارية، مثل Checkpoint FireWall-1.</p></li></ul><p dir="rtl">إذا كنت تُفضّل أداةً من سطر الأوامر مع ملفات ضبط نصيّة:</p><ul><li><p dir="rtl">الأداة <a rel="external nofollow" href="http://www.shorewall.net/">Shorewall</a><a rel="external nofollow" name="sdfootnote2anc" href="#sdfootnote2sym">2</a> هي أداة قوية جدًا لتساعدك في ضبط جدار ناري متقدم لأي شبكة.</p></li></ul><h2 dir="rtl">مصادر</h2><ul dir="rtl"><li>صفحة ويكي أوبنتو «<a rel="external nofollow" href="https://wiki.ubuntu.com/UncomplicatedFirewall">Ubuntu Firewall</a> التي تحتوي على معلومات عن تطوير ufw.</li><li>أيضًا، صفحة دليل ufw تحتوي معلومات مفيدة جدًا: man ufw.</li><li>راجع الصفحة «<a rel="external nofollow" href="http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html">packet-filtering-HOWTO</a>» للمزيد من المعلومات حول استخدام iptables.</li><li>صفحة «<a rel="external nofollow" href="http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.html">nat-HOWTO</a>» تحتوي تفاصيل إضافية عن التنكر.</li><li>صفحة ويكي أوبنتو «<a rel="external nofollow" href="https://help.ubuntu.com/community/IptablesHowTo">IPTables HowTo</a>» هي مصدر رائع للمعلومات.</li></ul><p dir="rtl">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/firewall.html">Ubuntu Server Guide: Firewall</a>.</p>
]]></description><guid isPermaLink="false">185</guid><pubDate>Wed, 20 Jan 2016 21:39:50 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x641;&#x630; &#x646;&#x645;&#x648;&#x630;&#x62C;&#x627; &#x644;&#x644;&#x62C;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A; &#x628;&#x627;&#x633;&#x62A;&#x639;&#x645;&#x627;&#x644; IPTables &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 14.04</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D9%81%D8%B0-%D9%86%D9%85%D9%88%D8%B0%D8%AC%D8%A7-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-iptables-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r168/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_12/iptables-firewall.png.2c2e69c7a1900eb5040bcba6e6b1ce04.png" /></p>

<p dir="rtl">
	<a name="_GoBack" rel="external"></a>تنفيذ جدار الحماية هو خطوة هامة في تأمين الخادوم الخاص بك. جزء كبير من عملية التنفيذ هو اتخاذ قرارات بشأن القواعد والسياسات التي تفرض قيودا على حركة مرور البيانات. يسمح لك الجدار الناري أن يكون لك دور في بنية إطار العمل الذي يتم فيه تطبيق القواعد الخاصة بك.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/iptables-firewall.png.fd6b239cb6955cc30b0837af0e29729c.png" data-fileid="9826" rel="external"><img alt="iptables-firewall.png" class="ipsImage ipsImage_thumbnailed" data-fileid="9826" src="https://academy.hsoub.com/uploads/monthly_2015_12/iptables-firewall.thumb.png.ed07b719b74f6cf1515f46e286bd3e37.png"></a>
</p>

<p dir="rtl">
	في هذا الدليل سوف نبني جدار حماية ليكون أساسا للمزيد من القواعد المعقدة. وسيركز هذا الجدار الناري في المقام الأول على تقديم افتراضات معقولة ووضع إطار سهل التمدد. سيكون تطبيق هذا الدليل على أوبنتو 14.04.
</p>

<h2 dir="rtl">
	المتطلبات الأساسية
</h2>

<p dir="rtl">
	قبل أن تبدأ يجب أن تكون لك فكرة قاعدية حول سياسات جدار الحماية التي ترغب في تنفيذها. يمكنك اتباع هذا الدليل للحصول على فكرة أفضل عن بعض الأشياء التي يجب أن تنظر فيها.<br><br>
	سوف تحتاج إلى أن يكون لك حق الوصول إلى خادوم أوبنتو 14.04 بمستخدم عادٍ يكون له صلاحيات الجذر.
</p>

<h2 dir="rtl">
	تثبيت خدمة جدار الحماية الثابتة
</h2>

<p dir="rtl">
	لكي نبدأ نحتاج إلى تثبيت الحزمة <span style="font-family:courier new,courier,monospace;">iptables-persistent</span> إذا لم تكن قد فعلت ذلك من قبل. سيسمح هذا لنا بحفظ مجموعات القواعد ويجعل تنفيذها تلقائيا عند تشغيل النظام:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo apt-get update
sudo apt-get install iptables-persistent</pre>

<p>
	أثناء التثبيت سوف تُسأل عما إذا كنت تريد حفظ القواعد الحالية الخاصة بك، أجب بنعم. سوف نقوم بتحرير ملفات القواعد المولدة لاحقا.
</p>

<h2 dir="rtl">
	ملاحظة حول IPv6
</h2>

<p dir="rtl">
	قبل أن نبدأ يجب أن نتحدث بإيجاز عن عناوين IPv4 و IPv6. تعالج أوامر <span style="font-family:courier new,courier,monospace;">iptables</span> فقط المرور عبر IPv4. وأما حركة المرور عبر IPv6 فيتم باستخدام أداة منفصلة تسمى <span style="font-family:courier new,courier,monospace;">ip6tables</span>. يتم تخزين القواعد في جداول وسلاسل منفصلة. بالنسبة لـ <span style="font-family:courier new,courier,monospace;">iptables-persistent </span> فتتم كتابة قواعد IPv4 في الملف <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v4/</span> وقواعد IPv6 في الملف <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v6/</span>.<br><br>
	يفترض هذا المقال أنك لا تستخدم البروتوكول IPv6 على الخادوم الخاص بك. إذا كان الأمر كذلك فالأكثر أمانا هو منع الوصول عبره تماما، وذلك ما سنقوم به في هذه الدليل.
</p>

<h2 dir="rtl">
	تنفيذ السياسات الأساسية لجدار الحماية (الطريق الأسرع)
</h2>

<p dir="rtl">
	من أجل تنفيذ تلك السياسات على جدار الحماية في أسرع وقت ممكن سوف ندلك على ملف إعدادات يحتوي تلك السياسات، ثم ما عليك بعدُ إلا بالنسخ واللصق. بعد ذلك سوف نشرح الاستراتيجية العامة ونبين لك كيف يمكن تنفيذ هذه القواعد باستخدام أوامر <span style="font-family:courier new,courier,monospace;">iptables</span> بدلا من تعديل الملف.<br><br>
	لتنفيذ سياسات جدار الحماية وإطار العمل الخاص به سوف نقوم بتحرير الملفين <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v4/</span> و <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v6/</span>. افتح أولا الملف <span style="font-family:courier new,courier,monospace;">rules.v4</span> في محرر النص المفضل لديك بصلاحيات الجذر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo nano /etc/iptables/rules.v4</pre>

<p dir="rtl">
	سترى داخل هذا الملف مثل هذه الأسطر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
# Generated by iptables-save v1.4.21 on Tue Jul 28 13:29:56 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Tue Jul 28 13:29:56 2015</pre>

<p dir="rtl">
	اُمحُ هذا المحتوى واستبدله بالمحتوى التالي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]

# Acceptable UDP traffic

# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

# Acceptable ICMP traffic

# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT

# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP

# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable

# Commit the changes
COMMIT

*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT</pre>

<p dir="rtl">
	احفظ ثم أغلق الملف.
</p>

<p dir="rtl">
	يمكنك اختبار الملف من أجل اكتشاف الأخطاء التي يمكن أن تكون في التركيب بالأمر التالي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables-restore -t /etc/iptables/rules.v4</pre>

<p dir="rtl">
	يجب عليك إصلاح أي خطأ يظهر لك قبل المتابعة.
</p>

<p dir="rtl">
	بعد ذلك افتح الملف <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v6/</span> من أجل تعديل قواعد IPv6:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo nano /etc/iptables/rules.v6</pre>

<p dir="rtl">
	يمكننا أن نمنع كل الحزم التي تستخدم البروتوكول IPv6 باستبدال محتوى الملف بالإعدادات التالية:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

*raw
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

*nat
:PREROUTING DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
COMMIT

*security
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

*mangle
:PREROUTING DROP [0:0]
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
COMMIT</pre>

<p dir="rtl">
	احفظ ثم أغلق الملف.
</p>

<p dir="rtl">
	من أجل اختبار الملف ومعرفة إن كان فيه أخطاء نستعمل الأمر <span style="font-family:courier new,courier,monospace;">ip6tables-restore</span> مع الخاصية <span style="font-family:courier new,courier,monospace;">t-</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo ip6tables-restore -t /etc/iptables/rules.v6</pre>

<p dir="rtl">
	إذا لم نجد أي خطأ في الملفين السابقين فلْنطبق تلك القواعد بتنفيذ الأمر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo service iptables-persistent reload</pre>

<p dir="rtl">
	سيقوم هذا الأمر بتنفيذ السياسات التي يتضمنها الملفان فورا. يمكنك التأكد من ذلك بسرد قواعد <span style="font-family:courier new,courier,monospace;">iptables</span> الحالية بالأمرين:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -S
sudo ip6tables -S</pre>

<p dir="rtl">
	سوف يعاد تطبيق هذه القواعد في كل إقلاعٍ للنظام. تأكد أنه يمكنك الولوج عبر المنفذ 22 وأن كل المنافذ الأخرى محجوبة.
</p>

<h2 dir="rtl">
	شرح لاستراتيجيتنا العامة في الجدار الناري
</h2>

<p dir="rtl">
	لقد أنشانا في جدار الحماية القاعدي الذي قمنا ببنائه مع القواعد السابقة أنشأنا إطارَ عمل قابلا للتمدد يمكّنك من إضافة قواعد جديدة أو حذفها بسهولة.
</p>

<p dir="rtl">
	أما حركة المرور التي تستخدم العنوان IPv4 فقد عالجناها في السلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> داخل الجدول <span style="font-family:courier new,courier,monospace;">filter table</span> ( تعالج هذه السلسلة كل الحزم التي تصل إلى خادومنا) فسمحنا بخروج الحزم من خادومنا ومنعنا إعادة توجيهها -إذ كان ذلك مناسبا فقط في حال كان الخادوم يعمل موجها router لخوادم أخرى- وقبِلنا الحزم على الجداول الأخرى بما أن نظرنا محصور في <span style="font-family:courier new,courier,monospace;">filter table</span> في هذا الدليل.
</p>

<p dir="rtl">
	عموما تقوم القواعد التي طبقناها على الجدار الناري بمنع الحزم من الوصول إلى خادومنا افتراضيا ، سيكون علينا أن نضع استثناءات من أجل الحزم التي نريدها أن لا تدخل في سياسة الحجب.
</p>

<p dir="rtl">
	في السلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> الرئيسة أضفنا بعض القواعد العامة لحركة المرور التي نثق بها. ما نريده الآن هو حجب كل الحزم التي نعتبرها غير صالحة ونسمح للحزم على واجهة الاسترجاع المحلية local loopback interface والبيانات المرتبطة باتصال مؤسس established connection.
</p>

<p dir="rtl">
	بعد ذلك نقوم بمسك البيانات حسب البروتوكول الذي تستخدمه ونمزجها بسلاسل البروتوكول المخصص protocol-specific. تهدف هذه السلاسل إلى التعامل مع القواعد المتعلقة بها والسماح لحركة المرور الصادرة والقادمة إلى الخدمات المعينة. في هذا المثال الخدمة الوحيدة التي قمنا بربطها في سلسلتنا ذات البروتوكول TCP هي <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>. إذا كنا نعرض خدمة أخرى كخادوم (HTTP(S يمكننا إضافة استثناءات لها أيضا.
</p>

<p dir="rtl">
	كل حركةٍ للمرور لا تتناسب مع القواعد العامة أو قواعد الخدمات في البروتوكول المحدد protocol-specific سوف تتم معالجتها بالقواعد الموجودة في آخر سلسلة INPUT. لقد جعلنا السياسة الافتراضية للجدار الناري هي الإسقاط DROP، وذلك سيحجب الحزم التي لا تتصف بمعايير السماح حسب قواعدنا. تمنع هذه القواعد في نهاية السلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> الحزم وترسل رسالة إلى العميل تحاكي ما يرسله الخادوم في حالِ لم تكن الخدمة متوفرة على ذلك المنفذ.
</p>

<p dir="rtl">
	وأما العنوان IPv6 فإن حركة المرور سوف تُحجَب كلها لأن خادومنا لا يستخدمه، ولأنه من الآمن فعل ذلك لكي لا نتورط في حركة المرور بشكل عام.
</p>

<h2 dir="rtl">
	تحديث nameservers (اختياري)
</h2>

<p dir="rtl">
	يمكن لحركة المرور المحجوبة على العنوان IPv6 أن تتداخل وطريقةُ تعامل الخادوم مع الأشياء في الأنترنت. مثلا يمكن لذلك أن يؤثر في استخدام الأمر <span style="font-family:courier new,courier,monospace;">APT</span>.
</p>

<p dir="rtl">
	إذا ظهر لك خطأ مثل هذا في حال نفذت الأمر <span style="font-family:courier new,courier,monospace;">apt-get update</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
Err http://security.ubuntu.com trusty-security InRelease

Err http://security.ubuntu.com trusty-security Release.gpg
  Could not resolve 'security.ubuntu.com'

. . .</pre>

<p dir="rtl">
	فينبغي عليك أن تتبع هذه الطريقة لكي تجعل APT يعمل مرة أخرى.
</p>

<p dir="rtl">
	أولا اضبط nameservers الخاصة بخادومك إلى nameservers الخارجية، سنستخدم في حالتنا nameservers الخاصة بغوغل. افتح الملف <span style="font-family:courier new,courier,monospace;">etc/network/interfaces/</span> من أجل تعديله بالأمر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo nano /etc/network/interfaces</pre>

<p dir="rtl">
	ثم عدل السطر الذي أوله <span style="font-family:courier new,courier,monospace;">dns-nameservers</span> على الطريقة التالية:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
. . .
iface eth0 inet6 static
        address 2604:A880:0800:0010:0000:0000:00B2:0001
        netmask 64
        gateway 2604:A880:0800:0010:0000:0000:0000:0001
        autoconf 0
        dns-nameservers 8.8.8.8 8.8.4.4</pre>

<p>
	حدّث إعدادات الشبكة بالأمر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo ifdown eth0 &amp;&amp; sudo ifup eth0</pre>

<p dir="rtl">
	الناتج المتوقع هو:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
RTNETLINK answers: No such process
Waiting for DAD... Done</pre>

<p dir="rtl">
	بعد ذلك أنشئ قاعدة جديدة من أجل إرغام حركة المرور أن تستخدم العنوان IPv4 متى كان ذلك ممكنا. أنشئ هذا الملف الجديد:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo nano /etc/apt/apt.conf.d/99force-ipv4</pre>

<p dir="rtl">
	ثم أضف هذا السطر إليه:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
Acquire::ForceIPv4 "true";</pre>

<p dir="rtl">
	احفظ ثم أغلق، ينبغي أن تكون الآن قادرا على استخدام ATP.
</p>

<h2 dir="rtl">
	<a name="implementing-our-firewalls-using-the-ipt" rel="external"></a> تنفيذ الجدار الناري باستخدام أوامر IPTables
</h2>

<p dir="rtl">
	لقد تبين لك كيف قمنا بتنفيذ الجدار الناري وسياساته وعرفت كيف تعمل، في المرحلة القادمة سنقوم بتطبيق تلك السياسات باستخدام أوامر <span style="font-family:courier new,courier,monospace;">iptables</span> وسنحصل في الأخير على ما حصلنا عليه فيما سبق. ولكن سيكون إضافة تلك السياسات واحدة تلو الأخرى لأن <span style="font-family:courier new,courier,monospace;">iptables</span> يطبق كل قاعدة في وقت تنفيذ الأمر ، لذلك فإن ترتيب القواعد مهم جدا (سوف ندع القواعد التي تحجب إلى النهاية).
</p>

<h3 dir="rtl">
	إعادة ضبط الجدار الناري
</h3>

<p dir="rtl">
	سنبدأ بإعادة ضبط الجدار الناري لكي نستطيع بناء السياسات من سطر الأوامر . يمكنك إلغاء القواعد السابقة بالأمر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo service iptables-persistent flush</pre>

<p dir="rtl">
	تأكد أن الجدار الناري أعيد ضبطه بالأمر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -S</pre>

<p dir="rtl">
	سترى أن القواعد في الجدول <span style="font-family:courier new,courier,monospace;">filter table</span> قد اختفت وأن السياسات الافتراضية قد أُعدت للوضع <span style="font-family:courier new,courier,monospace;">ACCEPT</span> في كل السلاسل:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT</pre>

<h3 dir="rtl">
	إنشاء سلاسل البروتوكول المخصص
</h3>

<p dir="rtl">
	سنبدأ بإنشاء سلاسل البروتوكول المخصص protocol-specific. ستُستعمل هذه السلاسل للتحكم في القواعد التي تُنشِئ استثناءات في سياسات الحجب فتجعل خدماتنا ظاهرة في الشبكة. سوف ننشئ واحدة من أجل البروتوكول UDP ، واحدة للبروتوكول TCP وواحدة للبروتوكول ICMP:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -N UDP
sudo iptables -N TCP
sudo iptables -N ICMP</pre>

<p dir="rtl">
	يمكننا الذهاب قدما فنضيف استثناء للخدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> التي تستخدم البروتوكول TCP. سيكون ذلك بقبول حركة المرور على المنفذ 22 الخاص بالخدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A TCP -p tcp --dport 22 -j ACCEPT</pre>

<p dir="rtl">
	إذا كنت تريد إضافة استثناءات لخدمات أخرى تستخدم البروتوكول TCP فما عليك سوى تكرار الأمر السابق مع تغيير رقم المنفذ الذي تستخدمه الخدمة.
</p>

<h3 dir="rtl">
	إنشاء قواعد للأغراض العامة للحجب والقبول
</h3>

<p dir="rtl">
	في السلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> -حيث تفلتر كل الحزم القادمة- نحتاج إلى إضافة قواعد للأغراض العامة. تشكل تلك القواعد حجر الأساس للجدار الناري وتتبع المنطق السليم إذ تقبل حركة المرور الأقل خطورة (حركة المرور المحلية أو التي تأكدنا من موثوقية مصدرها) وتحجب تلك الموصوفة بأنها غير صالحة.
</p>

<p dir="rtl">
	أولا سننشئ استثناء لكي نقبل كل الحزم التي هي جزء من اتصال مؤسَّس established connection أو لها علاقة باتصال مؤسس:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT</pre>

<p>
	تستخدم هذه القاعدة الملحق conntrack الذي يقدم سياقا يحتاج إليه iptables لمعالجة حزم الاتصالات الكبيرة بدل استخدامه للبيانات المنفصلة. TCP هو بروتوكول اتصال ، لذلك فإن كونه اتصالا مؤسَّسا لا غبار عليه. وأما UDP والبروتوكولات عديمة الاتصال فالاتصال المؤسس يشير إلى الحزم التي ترى جوابها (مصدر الحزمة هو نفسه الهدف المقصود والعكس بالعكس ). وأما الاتصالات ذات الصلة فتشير إلى اتصال جديد يُربط مع اتصال مؤسس. المثال الكلاسيكي هنا هو اتصال نقل البيانات ftp، حيث يربط هذا الاتصال الجديد بالاتصال المؤسس سابقا وهو FTP control connection.
</p>

<p dir="rtl">
	نريد أيضا أن نسمح لحركة المرور التي نشأت على واجهة الاسترجاع المحلية local loopback interface. هذه الحزم وُلّدت من قبل الخادوم ومتجهة إلى الخادوم نفسه. يتم استخدامها من قبل الخدمات على جهاز النظام للتواصل مع بعضها البعض:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A INPUT -i lo -j ACCEPT</pre>

<p dir="rtl">
	وأخيرا نريد حجب كل الحزم غير الصالحة. تكون الحزم غير صالحة للعديد من الأسباب. منها التي تكون وجهتها اتصالات أو عناوين أو منافذ غير موجودة، أو ببساطة لم يَحسُن تهيئتها. في كل الأحوال سوف نمنع أمثال هذه الحزم لأنه لا سبيل إلى معالجتها أو لأنها مغلفة لشيفرات خبيثة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP</pre>

<h3 dir="rtl">
	<a name="result_box3" rel="external"></a> إنشاء الانتقال السريع إلى سلاسل البروتوكول المخصص
</h3>

<p dir="rtl">
	حتى الآن لقد أنشأنا بعض القواعد العامة في سلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> وبعض القواعد للخدمات المقبولة في سلاسل البروتوكول المخصص. ومع ذلك فالبيانات القادمة إلى السلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> ليس لديها وسيلة للوصول إلى تلك السلاسل.<br><br>
	نحن بحاجة إلى توجيه حركة البيانات في سلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> إلى سلاسل البروتوكول المخصص التي تناسبها. يمكننا البحث عن نوع البروتوكول لكي نعرف أي سلسلة تناسب هذه الحزمة. ويجب التأكد من أن الحزمة تمثل اتصالا جديدا (يفترض أنه تم بالفعل التعامل مع أي اتصال مؤسس أو له علاقة به). بالنسبة لحزم TCP سوف نقوم بإضافة شرط إضافي وهو أن تكون الحزمة SYN، والذي هو النوع الوحيد الصالح لبدء اتصال TCP:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
sudo iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP</pre>

<h3 dir="rtl">
	رفض كل حركة المرور الأخرى
</h3>

<p dir="rtl">
	إذا كانت الحزمة التي تم تمريرها الى سلسلة البروتوكول المخصص لم تعثر على أية قواعد فسيتم إعادة التحكم بها إلى السلسة <span style="font-family:courier new,courier,monospace;">INPUT</span>. ما يصل إلى هذا النقطة ينبغي أن لا يسمح به جدار الحماية.
</p>

<p dir="rtl">
	سوف نحجب حركة المرور باستخدام الهدف <span style="font-family:courier new,courier,monospace;">REJECT</span> الذي يرسل رسالة رد إلى العميل. و يتيح هذا لنا تحديد الرسائل الصادرة حتى نتمكن من محاكاة الرد كما لو كان العميل حاول إرسال الحزم إلى المنافذ المغلقة. يكون الرد حسب البروتوكول الذي يتم استخدامه من قبل العميل.
</p>

<p dir="rtl">
	محاولة الوصول إلى منفذ UDP المغلق يؤدي إلى رسالة ICMP مضمونها "لا يمكن الوصول إلى المنفذ” ، يمكننا محاكاة ذلك بتنفيذ الأمر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable</pre>

<p dir="rtl">
	محاولة إنشاء اتصال TCP على منفذ مغلق سيؤدي إلى جواب TCP RST:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset</pre>

<p dir="rtl">
	وأما جميع الحزم الأخرى فيمكننا إرسال رسالة ICMP "تعذر الوصول إلى البروتوكول" للإشارة إلى أن الخادوم لا يرد على حزم من هذا النوع:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable</pre>

<h3 dir="rtl">
	ضبط السياسات الافتراضية
</h3>

<p dir="rtl">
	آخر ثلاث قواعد أضفناها ينبغي أن تتعامل مع جميع ما تبقى من حركة البيانات في السلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span>. ومع ذلك ينبغي لنا أن ننشئ السياسات الافتراضية للإسقاطـ <span style="font-family:courier new,courier,monospace;">DROP</span> كإجراء احترازي. وينبغي أيضا أن تُحدد هذه السياسة في سلسلة <span style="font-family:courier new,courier,monospace;">FORWARD</span> إذا لم يتم استخدام هذا الخادوم جهازَ توجيه إلى أجهرة أخرى:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP</pre>

<h3 dir="rtl">
	تحذير
</h3>

<p dir="rtl">
	مع إعدادك لسياسات الجدار الناري إلى <span style="font-family:courier new,courier,monospace;">DROP</span> يكون استعمالك للأمر <span style="font-family:courier new,courier,monospace;">sudo iptables -F</span> لغرض مسح iptables مسقطا لاتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> الحالي ، الأحسن من ذلك أن تقوم بمسحه بالأمر <span style="font-family:courier new,courier,monospace;">sudo iptables-persistent flush</span>، لأن ذلك سيعيد ضبط الجدار النار إلى الحال الفتراضي.
</p>

<p dir="rtl">
	ولكى نجعل سياسة IPv6 هي إسقاط كل حركةٍ للمرور يمكننا تنفيذ الأوامر التالية:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo ip6tables -P OUTPUT DROP</pre>

<p dir="rtl">
	ينبغي لهذه الأوامر أن تكرر القواعد التي أعددناها سابقا بشكل موثوق.
</p>

<h3 dir="rtl">
	<a name="saving-iptables-rules" rel="external"></a> حفظ قواعد IPTables
</h3>

<p dir="rtl">
	في هذه المرحلة يجب فحص قواعد جدار الحماية للتأكد من أنها تمنع حركة المرور التي تريد منعها وتسمح لما تريد السماح له. عندما تكون متأكدا من أن الجدار الناري والقواعد يعملان بشكل صحيح يمكنك حفظ تلك القواعد ليتم تطبيقها عند كل إقلاع للنظام.
</p>

<p dir="rtl">
	يمكنك حفظ قواعد كل من IPv4 و IPv6 بتنفيذ الأمر:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo service iptables-persistent save</pre>

<p dir="rtl">
	سيقوم هذا الأمر بالكاتبة فوق الملفين <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v4/</span> و <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v6/ </span>بالسياسات التي نفذتها من خلال سطر الأوامر.
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	باتباعك هذا الدليل -سواء من خلال وضع قواعد جدار الحماية مباشرة في ملفات الإعدادات أو يدويا باستخدام سطر الأوامر - قمتَ بإنشاء منطلق جيد لإعدادات الجدار الناري. يبقى عليك أن تضيف قواعد خاصة بك لتسمح بالوصول إلى خدماتك الأخرى على الخادوم.
</p>

<p dir="rtl">
	يسمح لك إطار العمل الذي أسسناه في هذا الدليل بأن تعدل كيفما تشاء ، وأيضا يجعل السياسات الموجودة أكثر وضوحا.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-implement-a-basic-firewall-template-with-iptables-on-ubuntu-14-04" rel="external nofollow">How To Implement a Basic Firewall Template with Iptables on Ubuntu 14.04</a> لصاحبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">168</guid><pubDate>Mon, 21 Dec 2015 23:17:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x639;&#x627;&#x62F;&#x629; &#x62A;&#x648;&#x62C;&#x64A;&#x647; &#x627;&#x644;&#x645;&#x646;&#x627;&#x641;&#x630; Forward Ports &#x639;&#x628;&#x631; &#x628;&#x648;&#x627;&#x628;&#x629; &#x644;&#x64A;&#x646;&#x643;&#x633; Linux Gateway &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; IPTables</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-forward-ports-%D8%B9%D8%A8%D8%B1-%D8%A8%D9%88%D8%A7%D8%A8%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-gateway-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-r150/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_12/ports-forwarding-iptables.png.340a055e7a3a5db24145052a77111dc0.png" /></p>

<p dir="rtl">
	<strong>NAT</strong>، أو نقل عنوان الشبكة network address translation، عبارة عن مصطلح عام لإدارة الرُّزَم packets من أجل إعادة توجيهها إلى عنوان بديل، وهو يُستخدم عادةً للسماح لحركة مرور البيانات traffic بتجاوز حدود الشبكة، يمتلك المُضيف host الذي يُطبِّق NAT نفاذًا إلى شبكتين أو أكثر بشكل نموذجي وهو مُعَد لنقل حركة مرور البيانات بينها.
</p>

<p dir="rtl">
	إعادة توجيه المنافذ Port forwarding هو عمليّة إعادة توجيه الطلبات لمنفذ مُعيَّن إلى مُضيف آخر، شبكة، أو منفذ. وبينما تقوم هذه العمليّة بتعديل وجهة الرُّزَم أثناء نقلها، فهي تُعتبَر نوع من عمليّات NAT.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_12/ports-forwarding-iptables.png.33ec786ab12f10531099b995738c429e.png" data-fileid="8471" rel="external"><img alt="ports-forwarding-iptables.png" class="ipsImage ipsImage_thumbnailed" data-fileid="8471" src="https://academy.hsoub.com/uploads/monthly_2015_12/ports-forwarding-iptables.thumb.png.27df1a0ad33748d5c8ec98e1866ab4d8.png"></a>
</p>

<p dir="rtl">
	سنشرح في هذا الدرس كيفيّة استخدام <span style="font-family:courier new,courier,monospace;">iptables </span>لإعادة توجيه المنافذ إلى مضيفين خلف جدار ناري باستخدام تقنيات NAT، يكون هذا مفيدًا في حال قمنا بإعداد شبكة خاصّة Private Network ولا زلنا نريد السماح لبعض حركة مرور البيانات بالمرور عبر جهاز مُحدّد كبوّابة gateway، سنستخدم مُضيفين اثنين يعملان على نظام Ubuntu لتوضيح هذا.
</p>

<h2 dir="rtl">
	المتطلبات الأساسية والأهداف
</h2>

<p dir="rtl">
	لمتابعة هذا الدّرس تحتاج إلى مُضيفين اثنين يعملان على نظام Ubuntu في نفس مركز البيانات مع تمكين الشبكات الخاصّة private networking، نحتاج إلى إعداد حساب مُستخدِم غير جذري non-root مع صلاحيّات <span style="font-family:courier new,courier,monospace;">sudo</span> على كل من هذين الجهازين، تستطيع معرفة كيفيّة إعداد مُستخدِم مع صلاحيّات <span style="font-family:courier new,courier,monospace;">sudo</span> باتّباع درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الأولي لخادوم Ubuntu</a>.
</p>

<p dir="rtl">
	سيعمل المُضيف الأول كجدار ناري ومُوجِّه router لأجل الشبكة الخاصّة، ولأغراض توضيحيّة سيكون المُضيف الثاني مُعدًّا مع خادوم ويب قابل للوصول فقط باستخدام واجهته الخاصّة، سنقوم بإعداد جهاز الجدار الناري ليُعيد توجيه الطلبات التي يتلقّاها على واجهته العامّة إلى خادوم الويب حيث ستصل إلى واجهته الخاصّة.
</p>

<h2 dir="rtl">
	تفاصيل المضيف
</h2>

<p dir="rtl">
	نحتاج قبل البدء أن نعرف الواجهات والعناوين التي يتم استخدامها من قِبَل كلا الخادمين لدينا.
</p>

<h3 dir="rtl">
	العثور على تفاصيل شبكتنا
</h3>

<p dir="rtl">
	للحصول على تفاصيل أنظمتنا نبدأ بإيجاد واجهات شبكاتنا Network Interfaces، نستطيع العثور على الواجهات والعناوين المرتبطة بها على أجهزتنا بكتابة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
ip -4 addr show scope global</pre>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0
       valid_lft forever preferred_lft forever
3: eth1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1
       valid_lft forever preferred_lft forever</pre>

<p dir="rtl">
	يُظهِر الخَرْج output السّابق واجهتين (<span style="font-family:courier new,courier,monospace;">eth0</span> و <span style="font-family:courier new,courier,monospace;">eth1</span>) والعناوين المُخصّصة لكل منهما (<span style="font-family:courier new,courier,monospace;">192.51.100.45</span> و <span style="font-family:courier new,courier,monospace;">192.168.1.5</span> على الترتيب)، ولمعرفة أيّ الواجهتين هي الواجهة العامّة نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
ip route show | grep default</pre>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
default via 111.111.111.111 dev eth0</pre>

<p dir="rtl">
	تكون الواجهة الظاهرة أمامنا (<span style="font-family:courier new,courier,monospace;">eth0 </span>في هذا المثال) هي الواجهة المُتصلة إلى بوّابتنا الافتراضيّة، وهي بكل تأكيد واجهتنا العامّة.
</p>

<p dir="rtl">
	قم بإيجاد هذه القيم على كل جهاز لديك واستخدمها للمتابعة مع هذا الدّرس بشكل صحيح.
</p>

<h3 dir="rtl">
	عينة بيانات من أجل هذا الدرس
</h3>

<p dir="rtl">
	لكي نجعل متابعة هذا الدّرس أسهل سنستخدم العناوين الوهميّة وتعيينات الواجهة التالية، قم بوضع القيم الخاص بك بدلًا من هذه القيم:
</p>

<p dir="rtl">
	تفاصيل شبكة خادوم الويب:
</p>

<ul dir="rtl">
<li>
		عنوان IP العام Public IP Address: <span style="font-family:courier new,courier,monospace;">203.0.113.2</span>
	</li>
	<li>
		عنوان IP الخاص Private IP Address: <span style="font-family:courier new,courier,monospace;">192.0.2.2</span>
	</li>
	<li>
		الواجهة العامّة Public Interface: <span style="font-family:courier new,courier,monospace;">eth0</span>
	</li>
	<li>
		الواجهة الخاصّة Private Interface: <span style="font-family:courier new,courier,monospace;">eth1</span>
	</li>
</ul>
<p dir="rtl">
	تفاصيل شبكة الجدار الناري:
</p>

<ul dir="rtl">
<li>
		عنوان IP العام Public IP Address: <span style="font-family:courier new,courier,monospace;">203.0.113.15</span>
	</li>
	<li>
		عنوان IP الخاص Private IP Address: <span style="font-family:courier new,courier,monospace;">192.0.2.15</span>
	</li>
	<li>
		الواجهة العامّة Public Interface: <span style="font-family:courier new,courier,monospace;">eth0</span>
	</li>
	<li>
		الواجهة الخاصّة Private Interface: <span style="font-family:courier new,courier,monospace;">eth1</span>
	</li>
</ul>
<h2 dir="rtl">
	إعداد خادوم الويب
</h2>

<p dir="rtl">
	سنبدأ بإعداد مُضيف خادوم الويب، نقوم بتسجيل الدخول كمستخدم <span style="font-family:courier new,courier,monospace;">sudo</span> للبدء.
</p>

<h3 dir="rtl">
	تثبيت Nginx
</h3>

<p dir="rtl">
	الخطوة الأولى التي سنقوم بها هي تثبيت <span style="font-family:courier new,courier,monospace;">Nginx </span>على مُضيف خادوم الويب لدينا وقفله بحيث يستمع فقط إلى واجهته الخاصّة، يجعلنا هذا متأكدين من أنّ خادوم الويب لن يكون متوفّرًا إلّا إذا ضبطنا إعادة توجيه المنافذ بشكل صحيح.
</p>

<p dir="rtl">
	نبدأ بتحديث الذاكرة المؤقتة للحزم المحليّة local package cache باستخدام الأمر <span style="font-family:courier new,courier,monospace;">apt</span> لتنزيل وتثبيت Nginx:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
webserver $ sudo apt-get update
webserver $ sudo apt-get install nginx</pre>

<h3 dir="rtl">
	تقييد Nginx إلى الشبكة الخاصة
</h3>

<p dir="rtl">
	بعد تثبيت Nginx نقوم بفتح ملف إعدادات كتلة block الخادوم الافتراضيّة للتأكد من أنّه يستمع فقط إلى واجهته الخاصّة، نفتح الملف عن طريق الأمر التالي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
webserver $ sudo nano /etc/nginx/sites-enabled/default</pre>

<p dir="rtl">
	نبحث بداخله عن الأمر التوجيهي <span style="font-family:courier new,courier,monospace;">listen</span>، ينبغي أن نجده في سطرين متتاليين في أعلى ملف الإعدادات:
</p>

<p dir="rtl">
	<strong>etc/nginx/sites-enabled/default/</strong>
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
server {
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;

  . . .
}</pre>

<p dir="rtl">
	نقوم عند الأمر التوجيهي <span style="font-family:courier new,courier,monospace;">listen</span> الأول بإضافة عنوان IP الخاص لخادوم الويب لدينا مع نقطتين قبل <span style="font-family:courier new,courier,monospace;">80</span> لنُخبِر Nginx أن يستمع فقط إلى واجهته الخاصّة، سنوضّح في هذا الدّرس إعادة توجيه IPv4 فقط، لذا نستطيع إزالة الأمر التوجيهي listen الثاني المُعَد من أجل IPv6.
</p>

<p dir="rtl">
	سنقوم في مثالنا بتعديل الأمر التوجيهي listen بحيث يبدو كما يلي:
</p>

<p>
	<strong>etc/nginx/sites-enabled/default/</strong>
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
server {
  listen 192.0.2.2:80 default_server;

  . . .
}</pre>

<p dir="rtl">
	عند الانتهاء نحفظ الملف ونغلقه، نختبر الملف بحثًا عن أخطاء الصياغة syntax بكتابة ما يلي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
webserver $ sudo nginx -t</pre>

<p dir="rtl">
	إن لم تظهر أيّة أخطاء نُعيد تشغيل خادوم Nginx لتمكين الإعدادات الجديدة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
webserver $ sudo service nginx restart</pre>

<h3 dir="rtl">
	التحقق من تقييد الشبكة Network Restriction
</h3>

<p dir="rtl">
	من المُفيد عند هذه النقطة التحقّق من مستوى النفاذ الذي نملكه لخادوم الويب لدينا.
</p>

<p dir="rtl">
	إن قمنا بمحاولة النفاذ لخادوم الويب عبر واجهته الخاصّة من خلال خادوم الجدار الناري firewall ينبغي أن ينجح هذا:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ curl --connect-timeout 5 192.0.2.2</pre>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Welcome to nginx!&lt;/title&gt;
    &lt;style&gt;
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    &lt;/style&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;h1&gt;Welcome to nginx!&lt;/h1&gt;
    . . .</pre>

<p dir="rtl">
	أمّا إن قمنا باستخدام الواجهة العامّة سنجد أنّنا لن نستطيع الاتصال:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ curl --connect-timeout 5 203.0.113.2</pre>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused</pre>

<p dir="rtl">
	وهو بالضبط ما نتوقّع حدوثه.
</p>

<h2 dir="rtl">
	إعداد الجدار الناري لإعادة توجيه المنفذ 80
</h2>

<p dir="rtl">
	نستطيع الآن العمل على تنفيذ إعادة توجيه المنافذ على جهاز الجدار الناري.
</p>

<h3 dir="rtl">
	تمكين إعادة التوجيه في النواة Kernel
</h3>

<p dir="rtl">
	الأمر الأول الذي يجب فعله هو تمكين إعادة التوجيه على مستوى النّواة، تكون إعادة التوجيه غير مُشغَّلة في مُعظم الأنظمة.
</p>

<p dir="rtl">
	ولتشغيل إعادة توجيه المنافذ لأجل هذه الجلسة فقط نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward</pre>

<p dir="rtl">
	ولتشغيل إعادة توجيه المنافذ بشكل دائم ينبغي علينا تحرير الملف <span style="font-family:courier new,courier,monospace;">etc/sysctl.conf/</span>، نفتح الملف بصلاحيّات <span style="font-family:courier new,courier,monospace;">sudo</span> بكتابة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo nano /etc/sysctl.conf</pre>

<p dir="rtl">
	نبحث بداخله عن السطر التالي ونقوم بإزالة التعليق uncomment عنه:
</p>

<p>
	<strong>etc/sysctl.conf/</strong>
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
net.ipv4.ip_forward=1</pre>

<p dir="rtl">
	عند الانتهاء نحفظ الملف ونغلقه، نقوم بتطبيق الإعدادات في هذا الملف بكتابة ما يلي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo sysctl -p
firewall $ sudo sysctl --system
</pre>

<h3 dir="rtl">
	إعداد الجدار الناري الأساسي
</h3>

<p dir="rtl">
	سنستخدم الجدار الناري الموجود في هذا الدّرس كإطار عمل أساسي من أجل القواعد، قم بتنفيذ التعليمات في درس <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1%D9%8D-%D9%86%D8%A7%D8%B1%D9%8A%D9%91-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D8%B9%D9%84%D9%89-ubuntu-1404-r38/" rel="">كيفية إعداد جدارٍ ناريّ باستخدام iptables</a>، وبعد الانتهاء يجب أن تكون قد:
</p>

<ul dir="rtl">
<li>
		قمت بتثبيت<span style="font-family:courier new,courier,monospace;"> iptables-persistent</span>
	</li>
	<li>
		حفظت مجموعة القواعد الافتراضيّة في <span style="font-family:courier new,courier,monospace;">etc/iptables/rules.v4/</span>
	</li>
	<li>
		تعلّمت كيفيّة إضافة أو ضبط القواعد عن طريق تحرير ملف القواعد أو باستخدام الأمر <span style="font-family:courier new,courier,monospace;">iptables</span>
	</li>
</ul>
<p dir="rtl">
	بعد أن تقوم بإعداد الجدار الناري الأساسي أكمل الخطوات التالية لكي تستطيع ضبطه من أجل إعادة توجيه المنافذ.
</p>

<h3 dir="rtl">
	إضافة قواعد إعادة التوجيه
</h3>

<p dir="rtl">
	نريد أن نضبط جدارنا الناري بحيث تتم إعادة توجيه حركة مرور البيانات traffic المُتدفّقة لواجهتنا العامّة (<span style="font-family:courier new,courier,monospace;">eth0</span>) إلى واجهتنا الخاصّة (<span style="font-family:courier new,courier,monospace;">eth1</span>).
</p>

<p dir="rtl">
	يمتلك جدارنا الناري الأساسي السلسلة <span style="font-family:courier new,courier,monospace;">FORWARD</span> مُعدّة افتراضيًّا لكي تستبعد <span style="font-family:courier new,courier,monospace;">DROP</span> حركة مرور البيانات، نحتاج لإضافة قواعد تسمح لنا بإعادة توجيه الاتصالات لخادوم الويب لدينا، ولأغراض أمنية سنقوم بتحديد هذا بشكل مُحكَم بحيث يتم فقط السماح للاتصالات التي نرغب بإعادة توجيهها.
</p>

<p dir="rtl">
	سنقبل في السلسلة <span style="font-family:courier new,courier,monospace;">FORWARD </span>الاتصالات الجديدة المتجهة للمنفذ 80 والقادمة من واجهتنا العامة مُغادرةً إلى واجهتنا الخاصة، يتم تحديد الاتصالات الجديدة بواسطة اللاحقة <span style="font-family:courier new,courier,monospace;">conntrack</span> ويتم تمثيلها بشكل خاص بواسطة رُزمة TCP SYN:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT</pre>

<p dir="rtl">
	سيسمح هذا للرزمة الأولى المعنيّة بإنشاء الاتصال بالعبور من خلال الجدار الناري، نحتاج أيضًا للسماح بأي حركة مرور بيانات لاحقة في كلا الاتجاهين والتي تنتج عن هذا الاتصال، نكتب ما يلي للسماح بحركة مرور البيانات التي تُنشئ هذا الاتصال <span style="font-family:courier new,courier,monospace;">ESTABLISHED</span> والمتعلّقة به <span style="font-family:courier new,courier,monospace;">RLEATED</span> بين واجهاتنا الخاصّة والعامة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
firewall $ iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT</pre>

<p dir="rtl">
	بإمكاننا إعادة التحقّق من أنّ سياساتنا على السلسلة <span style="font-family:courier new,courier,monospace;">FORWARD </span>هي الاستبعاد <span style="font-family:courier new,courier,monospace;">DROP </span>بكتابة ما يلي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo iptables -P FORWARD DROP</pre>

<p dir="rtl">
	عند هذه النقطة سمحنا بحركة مرور بيانات مُحدّدة بين واجهاتنا الخاصّة والعامّة بالمرور من خلال الجدار الناري لدينا، ومع ذلك لم نقم بضبط القواعد التي تُخبِر <span style="font-family:courier new,courier,monospace;">iptables</span> فعليًّا كيف يقوم بنقل وتوجيه حركة مرور البيانات.
</p>

<h3 dir="rtl">
	إضافة قواعد NAT لتوجيه الرزم بشكل صحيح
</h3>

<p dir="rtl">
	سنضيف الآن القواعد التي تُخبِر iptables كيف يقوم بتوجيه حركة مرور بياناتنا، نحتاج لتنفيذ عمليتين منفصلتين من أجل أن يقوم iptables بتغيير الرُّزَم بشكل صحيح بحيث يتمكّن العملاء من التواصل مع خادوم الويب.
</p>

<p dir="rtl">
	تحدث العمليّة الأولى التي تُدعى <span style="font-family:courier new,courier,monospace;">DNAT</span> في السلسلة <span style="font-family:courier new,courier,monospace;">PREROUTING</span> من جدول <span style="font-family:courier new,courier,monospace;">nat</span>، وهي عمليّة تقوم بتبديل عنوان وجهة الرُّزَم لتمكينها من التوجه بشكل صحيح عندما تمر بين الشبكات، سيتصل العملاء على الشبكة العامّة إلى خادوم الجدار الناري لدينا بدون أن يعلموا عن بُنية الشبكة الخاصّة لدينا، نحتاج لتبديل عنوان الوجهة لكل رُزمة بحيث تعلم عند إرسالها خارج شبكتنا الخاصّة كيف تصل بشكل صحيح إلى خادوم الويب.
</p>

<p dir="rtl">
	بما أنّنا نقوم فقط بإعداد إعادة توجيه المنافذ ولا نقوم بعمل NAT على كل رُزمة تصطدم بجدارنا الناري فيجب علينا أن نُطابِق المنفذ 80 في قاعدتنا، سنقوم بمطابقة الرُّزَم التي تستهدف المنفذ 80 إلى عنوان IP الخاص لخادوم الويب لدينا (<span style="font-family:courier new,courier,monospace;">192.0.2.2</span> في مثالنا):
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2</pre>

<p>
	يهتم هذا بنصف الحل، فينبغي الآن أن يتم توجيه الرُّزَم بشكل صحيح إلى خادوم الويب لدينا، ومع ذلك فإنّ الرُّزَم لا تزال تملك العنوان الأصلي للعميل كعنوان مصدر، وسيحاول الخادوم إرسال الرد مباشرة إلى ذلك العنوان، ممّا يجعل من المستحيل تأسيس اتصال TCP قانوني.
</p>

<p dir="rtl">
	نحتاج من أجل ضبط التوجيه المناسب أن نقوم بتعديل عنوان المصدر للرُزَم عندما تغادر الجدار الناري في طريقها إلى خادوم الويب، يجب علينا تعديل عنوان المصدر وتغييره إلى عنوان IP الخاص لخادوم الجدار الناري لدينا (في مثالنا <span style="font-family:courier new,courier,monospace;">192.0.2.15</span>)، سيتم عندها إرسال الرّد إلى الجدار الناري والذي يستطيع إعادة توجيهه إلى العميل كما هو متوقّع.
</p>

<p dir="rtl">
	ولتمكين هذه الوظيفة سنضيف قاعدة إلى سلسلة <span style="font-family:courier new,courier,monospace;">POSTROUTING</span> من جدول <span style="font-family:courier new,courier,monospace;">nat</span>، والتي يتم تقييمها مباشرة قبل إرسال الرُّزَم على الشبكة، سنطابق الرُّزَم الموجّهة إلى خادوم الويب عن طريق عنوان IP والمنفذ:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15</pre>

<p dir="rtl">
	حالما يتم إعداد هذه القاعدة ينبغي أن يصبح خادوم الويب لدينا قابل للنفاذ عن طريق توجيه متصفّح الويب لدينا إلى العنوان العام لجهاز الخادوم الناري:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
curl 203.0.113.15</pre>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Welcome to nginx!&lt;/title&gt;
    &lt;style&gt;
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    &lt;/style&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;h1&gt;Welcome to nginx!&lt;/h1&gt;
    . . .</pre>

<p dir="rtl">
	اكتمل هنا إعداد إعادة توجيه المنافذ.
</p>

<h2 dir="rtl">
	ضبط مجموعة القواعد الدائمة
</h2>

<p dir="rtl">
	نستطيع الآن بعد أن قمنا بإعداد إعادة توجيه المنافذ أن نحفظه في مجموعة قواعد دائمة.
</p>

<p dir="rtl">
	إن لم تكن تهتم بفقدان التعليقات الموجودة في مجموعة القواعد الحالية لديك فاستخدم الخدمة <span style="font-family:courier new,courier,monospace;">iptables-persistent </span>لحفظ قواعدك:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo service iptables-persistent save</pre>

<p dir="rtl">
	إن كنت ترغب بالحفاظ على التعليقات في ملفّك، فقم بفتحه وتحريره يدويًّا:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo nano /etc/iptables/rules.v4</pre>

<p dir="rtl">
	سنحتاج إلى ضبط الإعدادات في الجدول <span style="font-family:courier new,courier,monospace;">filter</span> من أجل قواعد السلسلة <span style="font-family:courier new,courier,monospace;">FORWARD</span> التي تمّت إضافتها، يجب علينا أيضًا ضبط القسم الذي يقوم بإعداد الجدول <span style="font-family:courier new,courier,monospace;">nat</span> كي نستطيع إضافة القواعد <span style="font-family:courier new,courier,monospace;">PREROUTING</span> و <span style="font-family:courier new,courier,monospace;">POSTROUTING</span>، سيبدو هذا في مثالنا مُشابِهًا لما يلي:
</p>

<p>
	<strong>etc/iptables/rules.v4/</strong>
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
<span style="line-height: 24.8889px;">*filter</span>
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]

# Acceptable UDP traffic

# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

# Acceptable ICMP traffic

# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT

# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP

# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable

# Rules to forward port 80 to our web server

# Web server network details:

# * Public IP Address: 203.0.113.2
# * Private IP Address: 192.0.2.2
# * Public Interface: eth0
# * Private Interface: eth1
#
# Firewall network details:
#
# * Public IP Address: 203.0.113.15
# * Private IP Address: 192.0.2.15
# * Public Interface: eth0
# * Private Interface: eth1
-A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# End of Forward filtering rules

# Commit the changes

COMMIT

*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# Rules to translate requests for port 80 of the public interface
# so that we can forward correctly to the web server using the
# private interface.

# Web server network details:

# * Public IP Address: 203.0.113.2
# * Private IP Address: 192.0.2.2
# * Public Interface: eth0
# * Private Interface: eth1
#
# Firewall network details:
#
# * Public IP Address: 203.0.113.15
# * Private IP Address: 192.0.2.15
# * Public Interface: eth0
# * Private Interface: eth1
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2
-A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15
# End of NAT translations for web server traffic
COMMIT

*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT</pre>

<p dir="rtl">
	قم بحفظ الملف وأغلقه بعد إضافة ما سبق وضبط القيم لكي تنطبق على بيئة شبكتك الخاصّة.
</p>

<p dir="rtl">
	نختبر صياغة ملف القواعد لدينا بكتابة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo iptables-restore -t &lt; /etc/iptables/rules.v4</pre>

<p dir="rtl">
	إن لم يتم اكتشاف أيّة أخطاء نقوم بتحميل مجموعة القواعد:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ sudo service iptables-persistent reload</pre>

<p dir="rtl">
	نختبر أنّ خادوم الويب لدينا لا يزال قابل للنفاذ من خلال عنوان IP العالم للجدار النّاري:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
firewall $ curl 203.0.113.15</pre>

<p dir="rtl">
	ينبغي لهذا أن يعمل كما عمل سابقًا.
</p>

<h2 dir="rtl">
	الخاتمة
</h2>

<p dir="rtl">
	ينبغي الآن أن نكون متآلفين مع إعادة توجيه المنافذ على خادوم لينِكس باستخدام iptables، تتضمّن العملية السماح بإعادة التوجيه على مستوى النّواة، إعداد النفاذ للسماح بإعادة التوجيه لحركة مرور البيانات لمنافذ مُحدّدة بين واجهتين على نظام الجدار النّاري، وضبط قواعد NAT بحيث يُمكِن توجيه الرُّزَم بشكل صحيح، ربّما تبدو هذه عمليّة صعبة، ولكنّها تُوضّح أيضًا مرونة إطار عمل ترشيح الرُّزَم netfilter وجدار iptables النّاري، يُمكِن استخدام هذا لتمويه بُنية الشبكة الخاصّة لدينا مع السمّاح بحركة مرور البيانات للخدمات بالمرور بشكل حر عبر بوّابة جهاز الجدار النّاري.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- لـ <a href="https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway-with-iptables" rel="external nofollow">How To Forward Ports through a Linux Gateway with Iptables</a> لصاحبه Justin Ellingwood.
</p>

<p><a href="https://academy.hsoub.com/uploads/monthly_2015_12/bacula-ubuntu-backup.png.fc374c8efe0c19b3ddaf412693982b49.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="8317" src="https://academy.hsoub.com/uploads/monthly_2015_12/bacula-ubuntu-backup.thumb.png.44bfac32e700fa9260264fa65049cdb0.png" class="ipsImage ipsImage_thumbnailed" alt="bacula-ubuntu-backup.png"></a></p>]]></description><guid isPermaLink="false">150</guid><pubDate>Fri, 04 Dec 2015 21:50:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x633;&#x631;&#x62F; &#x648;&#x62D;&#x630;&#x641; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x62C;&#x62F;&#x627;&#x631; IPTables &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B3%D8%B1%D8%AF-%D9%88%D8%AD%D8%B0%D9%81-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1-iptables-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-r142/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/iptables-list-delete-rules.png.4558738b8ddb58a4e0eb4bab46704fc4.png" /></p>

<div id="wmd-preview-section-11">
	<p id="كيفية-سرد-وحذف-قواعد-جدار-iptables-الناري">
		<strong>iptables</strong> عبارة عن جدار ناري firewall يلعب دورًا أساسيًّا في أمان الشبكات لمعظم أنظمة لينِكس، وبينما تقوم العديد من دروس iptables بتعليمنا <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-iptables-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D9%88%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-r119/" rel="">كيفيّة إنشاء قواعد الجدار النّاري لتأمين خادومنا</a>، يُركِّز هذا الدرس على ناحية مختلفة من إدارة الجدار النّاري: سرد listing وحذف القواعد rules.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/iptables-list-delete-rules.png.4bce5fdc8f6e54cbafd0e45ee8963f84.png" data-fileid="7502" rel="external"><img alt="iptables-list-delete-rules.png" class="ipsImage ipsImage_thumbnailed" data-fileid="7502" src="https://academy.hsoub.com/uploads/monthly_2015_11/iptables-list-delete-rules.thumb.png.dae9b2f97a0ccd7176032e77de551c09.png"></a>
	</p>
</div>

<div id="wmd-preview-section-12">
	<p>
		سنشرح في هذا الدّرس كيفيّة القيام بمهام iptables التالية:
	</p>

	<ul>
<li>
			سرد القواعد list rules
		</li>
		<li>
			مسح عدادات Packet وByte
		</li>
		<li>
			حذف القواعد
		</li>
		<li>
			إفراغ السلاسل Flush chains (حذف جميع القواعد في السلسلة)
		</li>
		<li>
			إفراغ السلاسل والجداول، حذف السلاسل، وقبول أي حركة مرور البيانات traffic
		</li>
	</ul>
<p>
		<strong>ملاحظة:</strong> احذر عند التعامل مع الجدار النّاري من حظر نفسك عن خادومك عن طريق حظر حركة مرور بيانات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> (المنفذ 22 افتراضيًّا)، وإن فقدت النفاذ إليه بسبب إعدادات الجدار النّاري فربّما تحتاج للاتصال إليه عن طريق الـ console لإصلاح نفاذنا إليه، حيث تستطيع بعدها تغيير إعدادات الجدار النّاري للسماح بنفاذ <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> (أو أي حركة مرور بيانات traffic)، وإن كانت قواعد الجدار النّاري المحفوظة لديك تسمح بنفاذ <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> فمن الطرق الأخرى هي إعادة تشغيل خادومك.
	</p>
</div>

<div id="wmd-preview-section-13">
	<h2 id="المتطلبات-الأساسية">
		المتطلبات الأساسية
	</h2>

	<p>
		ينبغي قبل أن تبدأ باتّباع هذا الدّرس أن تمتلك على خادومك حساب superuser غير جذري non-root مُنفصِل (مُستخدِم مع صلاحيّات sudo)، إن أردت إعداده اتبع الدّرس التّالي: <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الابتدائي لخادوم أوبنتو 14.04</a>.
	</p>

	<p>
		فلنقم بإلقاء نظرة على كيفيّة سرد list القواعد أولًا. توجد طريقتان مختلفتان لعرض قواعد iptables النشيطة active: إمّا في جدول أو على شكل قائمة من مواصفات القواعد، تُزوِّدنا هاتان الطريقتان بنفس المعلومات تقريبًا في صيغ مختلفة.
	</p>
</div>

<div id="wmd-preview-section-14">
	<h2 id="سرد-القواعد-بحسب-المواصفات-specification">
		سرد القواعد بحسب المواصفات Specification
	</h2>

	<p>
		لسرد جميع قواعد iptables النشيطة بحسب المواصفات نقوم بتنفيذ الأمر <span style="font-family:courier new,courier,monospace;">iptables</span> مع الخيار <span style="font-family:courier new,courier,monospace;">S-</span>:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -S</pre>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
-P INPUT DROP 
-P FORWARD DROP 
-P OUTPUT ACCEPT 
-N ICMP 
-N TCP 
-N UDP 
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m conntrack --ctstate INVALID -j DROP 
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP 
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP 
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP 
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable 
-A INPUT -p tcp -j REJECT --reject-with tcp-reset 
-A INPUT -j REJECT --reject-with icmp-proto-unreachable 
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT</pre>

	<p>
		يبدو الخرْج Output كما نرى مُشابِهًا للأوامر التي اعتدنا على إنشائها ولكن بدون أن يسبقها الأمر <span style="font-family:courier new,courier,monospace;">iptables</span>، يبدو هذا أيضًا مُشابِهًا لملفّات إعدادات قواعد iptables إن قمت سابقًا باستخدام<span style="font-family:courier new,courier,monospace;"> iptables-persistent </span>أو <span style="font-family:courier new,courier,monospace;">iptables save</span>.
	</p>
</div>

<div id="wmd-preview-section-15">
	<h3 id="1-سرد-سلسلة-محددة">
		سرد سلسلة محددة
	</h3>

	<p>
		إن أردنا تحديد الخَرْج إلى سلسلة مُحدّدة (مثل <span style="font-family:courier new,courier,monospace;">INPUT</span>، <span style="font-family:courier new,courier,monospace;">OUTPUT</span>، <span style="font-family:courier new,courier,monospace;">TCP</span>، إلخ..) فبإمكاننا تحديد اسم السلسلة مباشرة بعد الخيار <span style="font-family:courier new,courier,monospace;">S-</span>، على سبيل المثال لإظهار كافّة مواصفات القواعد في سلسلة <span style="font-family:courier new,courier,monospace;">TCP</span> نقوم بتنفيذ الأمر التالي:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -S TCP</pre>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
-N TCP 
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT</pre>

	<p>
		فلنقم بإلقاء نظرة على الطريقة البديلة لعرض قواعد iptables النشيطة كجدول من القواعد.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="سرد-القواعد-كجداول">
		سرد القواعد كجداول
	</h2>

	<p>
		يُمكِن أن يكون عرض قواعد iptables في طريقة عرض الجدول مفيدًا لمقارنة القواعد المختلفة مع بعضها.
	</p>

	<p>
		لإخراج كافّة قواعد iptables النشيطة في جدول نقوم بتنفيذ الأمر <span style="font-family:courier new,courier,monospace;">iptables</span> مع الخيار <span style="font-family:courier new,courier,monospace;">L-</span>:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -L</pre>

	<p>
		سيقوم هذا بإخراج جميع القواعد الحاليّة مُرتّبة بحسب السلسلة.
	</p>

	<p>
		إن أردنا تحديد الخَرْج إلى سلسلة مُحدّدة (مثل <span style="font-family:courier new,courier,monospace;">INPUT</span>، <span style="font-family:courier new,courier,monospace;">OUTPUT</span>، <span style="font-family:courier new,courier,monospace;">TCP</span>، إلخ..) فبإمكاننا تحديد اسم السلسلة مباشرة بعد الخيار <span style="font-family:courier new,courier,monospace;">L-</span>.
	</p>

	<p>
		دعونا نلقي نظرة على مثال عن سلسلة الدّخل <span style="font-family:courier new,courier,monospace;">INPUT</span>:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -L INPUT</pre>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
Chain INPUT (policy DROP) 
target    prot opt source    destination 
ACCEPT    all  --  anywhere  anywhere        ctstate RELATED,ESTABLISHED 
ACCEPT    all  --  anywhere  anywhere 
DROP      all  --  anywhere  anywhere        ctstate INVALID 
UDP       udp  --  anywhere  anywhere        ctstate NEW 
TCP       tcp  --  anywhere  anywhere        tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 
ICMP      icmp --  anywhere  anywhere        ctstate NEW 
REJECT    udp  --  anywhere  anywhere        reject-with icmp-port-unreachable 
REJECT    tcp  --  anywhere  anywhere        reject-with tcp-reset 
REJECT    all  --  anywhere  anywhere        reject-with icmp-proto-unreachable</pre>

	<p>
		يُشير السّطر الأول من الخَرْج إلى اسم السلسلة (في هذه الحالة <span style="font-family:courier new,courier,monospace;">INPUT</span>) متبوعًا بسياسته policy الافتراضيّة (<span style="font-family:courier new,courier,monospace;">DROP</span>).
	</p>

	<p>
		يتكوّن السّطر التالي من ترويسة كل عمود في الجدول متبوعة بقواعد السلسلة، فلنقم بالمرور على دلالة كل ترويسة:
	</p>

	<ul>
<li>
			<strong>target</strong>: إن كانت الرزمة packet تُطابِق القاعدة يُحدِّد الهدف target ما ينبغي فعله معها، يُمكن على سبيل المثال أن يتم قبول، إسقاط drop، تسجيل، أو إرسال الرزمة إلى سلسلة أخرى لتتم مقارنتها مع قواعد أخرى
		</li>
		<li>
			<strong>prot</strong>: الميفاق protocol، مثل <span style="font-family:courier new,courier,monospace;">tcp</span>، <span style="font-family:courier new,courier,monospace;">udp</span>، <span style="font-family:courier new,courier,monospace;">icmp</span>، أو <span style="font-family:courier new,courier,monospace;">all</span>
		</li>
		<li>
			<strong>opt</strong>: يُشير هذا العمود إلى خيارات عنوان IP ونادرًا ما يتم استخدامه
		</li>
		<li>
			<strong>source</strong>: عنوان IP المصدر أو الشبكة الفرعية subnet لحركة مرور البيانات traffic، أو <span style="font-family:courier new,courier,monospace;">anywhere</span>
		</li>
		<li>
			<strong>destination</strong>: عنوان IP الوجهة destination أو الشبكة الفرعية subnet لحركة مرور البيانات traffic، أو <span style="font-family:courier new,courier,monospace;">anywhere</span>
		</li>
	</ul>
<p>
		يُشير العمود الأخير الذي لا يملك عنوان إلى خيارات options القاعدة، والتي هي أي جزء من القاعدة لم يتم الإشارة إليه في الأعمدة السابقة، يُمكن لها أن تكون أي شيء من منافذ ports المصدر والوجهة، وحتى حالة اتصال الرزمة.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h2 id="إظهار-تعداد-الرزم-packet-counts-والحجم-الكلي-aggregate-size">
		إظهار تعداد الرزم Packet Counts والحجم الكلي Aggregate Size
	</h2>

	<p>
		من الممكن أيضًا عند سرد قواعد iptables أن نظهر عدد الرُّزَم packets والحجم الكلّي لها بالبايت، والذي يُقابل كل قاعدة مُحدّدة، يكون هذا مُفيدًا عادةً عندما نحاول أخذ فكرة تقريبيّة عن القواعد التي تُطابِق الرُّزَم، ولفعل هذا نستخدم ببساطة الخيارين <span style="font-family:courier new,courier,monospace;">L- </span>و<span style="font-family:courier new,courier,monospace;">v-</span> معًا.
	</p>

	<p>
		فلنلقِ نظرة على سبيل المثال على سلسلة الدّخل INPUT مرّة أخرى مع الخيار <span style="font-family:courier new,courier,monospace;">v-</span>:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -L INPUT -v</pre>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
Chain INPUT (policy DROP 0 packets, 0 bytes) 
 pkts bytes  target  prot opt  in   out  source    destination 
 284K   42M  ACCEPT  all  --   any  any  anywhere  anywhere      ctstate RELATED,ESTABLISHED 
    0     0  ACCEPT  all  --   lo   any  anywhere  anywhere 
    0     0  DROP    all  --   any  any  anywhere  anywhere      ctstate INVALID 
  396 63275  UDP     udp  --   any  any  anywhere  anywhere      ctstate NEW 
17067 1005K  TCP     tcp  --   any  any  anywhere  anywhere      tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 
 2410  154K  ICMP    icmp --   any  any  anywhere  anywhere      ctstate NEW 
  396 63275  REJECT  udp  --   any  any  anywhere  anywhere      reject-with icmp-port-unreachable 
 2916  179K  REJECT  all  --   any  any  anywhere  anywhere      reject-with icmp-proto-unreachable 
    0     0  ACCEPT  tcp  --   any  any  anywhere  anywhere      tcp dpt:<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> ctstate NEW,ESTABLISHED</pre>

	<p>
		نلاحظ أنّ القائمة تحتوي الآن على عمودين إضافيين وهما <strong>pkts</strong> <strong>وbytes</strong>.
	</p>

	<p>
		الآن وقد عرفنا كيفيّة سرد قواعد الجدار النّاري النشيطة بطرق متعدّدة، فلنلقِ نظرة على كيفيّة تصفير reset عدادات الرُّزم والبايتات.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h2 id="تصفير-تعداد-الرزم-packet-counts-والحجم-الكلي-aggregate-size">
		تصفير تعداد الرزم Packet Counts والحجم الكلي Aggregate Size
	</h2>

	<p>
		إن أردنا مسح أو تصفير عدادات الرُّزَم والبايتات لقواعدنا نستخدم الخيار <span style="font-family:courier new,courier,monospace;">Z-</span>، يتم أيضًا تصفيرها عند حدوث إعادة تشغيل، وهذا مفيد لمعرفة إن كان خادومنا يتلقّى حركة مرور بيانات جديدة تتوافق مع قواعدنا الحاليّة.
	</p>

	<p>
		لمسح العدادات لجميع السلاسل والقواعد نستخدم الخيار <span style="font-family:courier new,courier,monospace;">Z-</span>:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -Z</pre>

	<p>
		ولمسح العدادات لجميع القواعد في سلسلة مُحدّدة نستخدم الخيار <span style="font-family:courier new,courier,monospace;">Z-</span> مع تحديد السلسلة المطلوبة، على سبيل المثال لمسح عدادات سلسلة الدّخل <span style="font-family:courier new,courier,monospace;">INPUT</span> نكتب هذا الأمر:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -Z INPUT</pre>

	<p>
		إن أردنا مسح العدادات من أجل قاعدة مُحدّدة نُحدِّد اسم السلسلة ورقم القاعدة، على سبيل المثال لتصفير العدادات للقاعدة الأولى في سلسلة الدّخل <span style="font-family:courier new,courier,monospace;">INPUT</span> نقوم بتنفيذ الأمر التالي:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -Z INPUT 1</pre>

	<p>
		الآن وقد عرفنا كيفيّة تصفير عدادات الرُّزَم والبايتات في iptables فلنلقِ نظرة على طريقتي حذفهما.
	</p>
</div>

<div id="wmd-preview-section-19">
	<h2 id="حذف-القاعدة-بحسب-المواصفات-specification">
		حذف القاعدة بحسب المواصفات Specification
	</h2>

	<p>
		إنّ إحدى طرق حذف قواعد iptables هي عن طريق مواصفات القاعدة، ولفعل هذا نستطيع تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">iptables</span> مع الخيار <span style="font-family:courier new,courier,monospace;">D-</span> متبوعًا بمواصفات القاعدة، إن أردنا استخدام هذه الطريقة لحذف القواعد فبإمكاننا استخدام خَرْج سرد القواعد (<strong>iptables –S</strong>) من أجل المساعدة.
	</p>

	<p>
		إن أردنا على سبيل المثال حذف القاعدة التي تقوم بإسقاط (drop) الرُّزَم الخاطئة القادمة فبإمكاننا تنفيذ هذا الأمر:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP</pre>

	<p>
		نلاحظ أنّه يجب علينا استبعاد الخيار <span style="font-family:courier new,courier,monospace;">A-</span> والذي يُستخدَم للإشارة إلى موقع القاعدة في وقت إنشائها.
	</p>
</div>

<div id="wmd-preview-section-20">
	<h2 id="حذف-القاعدة-بحسب-السلسلة-والرقم">
		حذف القاعدة بحسب السلسلة والرقم
	</h2>

	<p>
		الطريقة الأخرى لحذف قواعد iptables هي عن طريق سلسلتها chain ورقم سطرها line number، ولتحديد هذا الرقم نقوم بسرد القواعد في صيغة جدول مع إضافة الخيار <span style="font-family:courier new,courier,monospace;">line-numbers--</span>:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -L --line-numbers</pre>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
Chain INPUT (policy DROP) 
num target prot opt source   destination 
  1 ACCEPT all  --  anywhere anywhere     ctstate RELATED,ESTABLISHED 
  2 ACCEPT all  --  anywhere anywhere 
  3 DROP   all  --  anywhere anywhere     ctstate INVALID 
  4 UDP    udp  --  anywhere anywhere     ctstate NEW 
  5 TCP    tcp  --  anywhere anywhere     tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 
  6 ICMP   icmp --  anywhere anywhere     ctstate NEW 
  7 REJECT udp  --  anywhere anywhere     reject-with icmp-port-unreachable 
  8 REJECT tcp  --  anywhere anywhere     reject-with tcp-reset 
  9 REJECT all  --  anywhere anywhere     reject-with icmp-proto-unreachable 
 10 ACCEPT tcp  --  anywhere anywhere     tcp dpt:<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> ctstate NEW,ESTABLISHED ...</pre>

	<p>
		يُضيف هذا الخيار رقم السطر لكل قاعدة مع الإشارة إليه بالترويسة num.
	</p>

	<p>
		بعد أن نعرف ما هي القاعدة التي نريد حذفها نتأكد من سلسلة ورقم سطر هذه القاعدة ثم نقوم بتنفيذ الأمر <span style="font-family:courier new,courier,monospace;">iptables –D </span>متبوعًا بسلسلة ورقم القاعدة.
	</p>

	<p>
		على سبيل المثال إن أردنا حذف قاعدة input التي تُسقِط الرُّزَم الخاطئة نستطيع أن نرى أنّها القاعدة 3 من السلسلة <span style="font-family:courier new,courier,monospace;">INPUT</span> لذا نقوم بتنفيذ الأمر التالي:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -D INPUT 3</pre>

	<p>
		الآن وقد عرفنا كيفيّة حذف قواعد الجدار النّاري المفردة فلننتقل إلى كيفيّة إفراغ flush سلاسل القواعد.
	</p>
</div>

<div id="wmd-preview-section-21">
	<h2 id="إفراغ-السلاسل">
		إفراغ السلاسل
	</h2>

	<p>
		تُزوّدنا iptables بطريقة لحذف كافّة القواعد في سلسلة، أي إفراغ flush السلسلة، يُغطّي هذا القسم الطرق المتعدّدة لفعل هذا.
	</p>

	<p>
		<strong>ملاحظة: </strong>انتبه، فقد تحظر نفسك عن خادومك عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> عن طريق إفراغ سلسلة تمتلك سياسة افتراضيّة drop أو deny، إن فعلت ذلك فربّما تحتاج للاتصال بخادومك عبر الـ console لإصلاح النفاذ إليه.
	</p>
</div>

<div id="wmd-preview-section-22">
	<h3 id="1-إفراغ-سلسلة-مفردة">
		1- إفراغ سلسلة مفردة
	</h3>

	<p>
		لإفراغ سلسلة مُحدّدة، والذي يقوم بحذف كافّة القواعد في هذه السلسلة، فبإمكاننا استخدام الخيار <span style="font-family:courier new,courier,monospace;">F-</span> (أو الخيار <span style="font-family:courier new,courier,monospace;">flush--</span> المُكافِئ له) مع اسم السلسلة التي نريد إفراغها.
	</p>

	<p>
		على سبيل المثال لحذف جميع القواعد في سلسلة الدّخل <span style="font-family:courier new,courier,monospace;">INPUT</span> نقوم بتنفيذ هذا الأمر:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -F INPUT
</pre>
</div>

<div id="wmd-preview-section-23">
	<h3 id="2-إفراغ-كافة-السلاسل">
		2- إفراغ كافة السلاسل
	</h3>

	<p>
		لإفراغ كافّة السلاسل، والذي يقوم بحذف كامل قواعد الجدار النّاري لدينا، فبإمكاننا استخدام الخيار<span style="font-family:courier new,courier,monospace;"> F-</span> (أو الخيار <span style="font-family:courier new,courier,monospace;">flush--</span> المُكافِئ له):
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -F
</pre>
</div>

<div id="wmd-preview-section-24">
	<h2 id="إفراغ-جميع-القواعد-حذف-كامل-السلاسل-وقبول-أي-حركة-مرور-بيانات-traffic">
		إفراغ جميع القواعد، حذف كامل السلاسل، وقبول أي حركة مرور بيانات traffic
	</h2>

	<p>
		سنشاهد في هذا القسم كيفيّة إفراغ كامل قواعد الجدار النّاري لدينا، الجداول، والسلاسل، والسماح بأي حركة مرور بيانات traffic على الشبكة.
	</p>

	<p>
		<strong>ملاحظة:</strong> سيقوم هذا بتعطيل الجدار النّاري لديك بشكل كامل، ينبغي فقط أن تتبع هذا القسم إن أردت البدء من جديد في إعداد الجدار النّاري لديك.
	</p>

	<p>
		نُعيّن في البداية السياسات الافتراضيّة لكل سلسلة مُضمَّنة إلى <span style="font-family:courier new,courier,monospace;">ACCEPT</span>، السبب الأساسي لفعل هذا هو التأكد من عدم حظر أنفسنا عن خادومنا عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>:
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT</pre>

	<p>
		نقوم بعدها بإفراغ الجداول <strong>nat</strong> و<strong>mangle</strong>، إفراغ كامل السلاسل (<span style="font-family:courier new,courier,monospace;">F-</span>)، وحذف كافّة السلاسل غير الافتراضيّة (<span style="font-family:courier new,courier,monospace;">X-</span>):
	</p>

	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo iptables -t nat -F sudo iptables -t mangle -F sudo iptables -F sudo iptables -X</pre>

	<p>
		سيسمح الآن جدارنا النّاري بكافة حركة مرور البيانات traffic على الشبكة، وإن قمنا بسرد قواعدنا الآن سنشاهد أنّه لا توجد أي قاعدة، وأنّه فقط بقيت لنا السلاسل الثلاث الافتراضية (<span style="font-family:courier new,courier,monospace;">INPUT</span>، <span style="font-family:courier new,courier,monospace;">FORWARD</span>، <span style="font-family:georgia,serif;">وOUTPUT</span>).
	</p>
</div>

<div id="wmd-preview-section-25">
	<h2 id="الخاتمة">
		الخاتمة
	</h2>

	<p>
		ينبغي بعد قراءة هذا هذا الدّرس أن تتكوّن لديك صورة واضحة حول كيفيّة سرد وحذف قواعد جدار iptables النّاري لديك.
	</p>

	<p>
		تذكّر أنّ أي تغيير لـ iptables عبر الأمر <span style="font-family:courier new,courier,monospace;">iptables</span> هو تغيير عابر، ويجب حفظه ليبقى بشكل دائم بعد إعادة تشغيل الخادوم، وقد تم شرح هذا في <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-iptables-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D9%88%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-r119/" rel="">قسم حفظ القواعد من درس قواعد وأوامر شائعة للجدار النّاري</a>.
	</p>

	<p>
		ترجمة -وبتصرّف- لـ <a href="https://www.digitalocean.com/community/tutorials/how-to-list-and-delete-iptables-firewall-rules" rel="external nofollow">How To List and Delete Iptables Firewall Rules</a> لصاحبه Mitchell Anicas.
	</p>
</div>
]]></description><guid isPermaLink="false">142</guid><pubDate>Tue, 17 Nov 2015 12:26:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x642;&#x644; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x62C;&#x62F;&#x627;&#x631; IPTables &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A; &#x625;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x622;&#x62E;&#x631; &#x62C;&#x62F;&#x64A;&#x62F;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D9%82%D9%84-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1-iptables-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A2%D8%AE%D8%B1-%D8%AC%D8%AF%D9%8A%D8%AF-r122/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-migrations.png.39a738e74e46982044155d41d0e425a6.png" /></p>

<p>من المرغوب عادةً عند الانتقال من خادوم إلى آخر أن تُنقَل قواعد الجدار الناري iptables كجزءٍ من العملية؛ سيشرح هذا الدرس لك كيف تنسخ بسهولة القواعد المُفعّلة لجدار iptables من خادوم إلى آخر.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-migrations.png.25af8ebfc5e1ab5be89a3da002e88809.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="6043" src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-migrations.thumb.png.85c29056cb280b5996c504087e36234e.png" class="ipsImage ipsImage_thumbnailed" alt="iptables-migrations.thumb.png.85c29056cb"></a></p><h2>المتطلبات المسبقة</h2><p>يتطلب هذا الدرس وجود خادومَين؛ سنشير إلى الخادوم المصدر (الذي توجد فيه قواعد iptables) بالخادوم A، والخادوم الوجهة (الذي ستُنقَل إليه القواعد) بالخادوم B.<br>ستحتاج إلى امتيازات الجذر على كلي الخادومين.</p><h2>عرض قواعد Iptables الموجودة</h2><p>قبل نقل قواعد iptables، لننظر إليها أولًا؛ يمكنك فعل ذلك عبر تطبيق هذا الأمر على الخادوم A:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -S</pre><p>مثالٌ عن ناتج الأمر السابق:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 15.15.15.51/32 -j DROP</pre><p>ستُستخدَم القواعد الناتجة في المثال السابق لشرح عملية نقل الجدار الناري.</p><h2>تصدير قواعد Iptables</h2><p>يكتب الأمر <code>iptables-save</code> قواعد iptables الحالية إلى <code>stdout</code> (مجرى الخرج القياسي)؛ مما يمنحنا طريقةً سهلةً لتصدير قواعد الجدار الناري إلى ملف، وذلك عبر إعادة توجيه <code>stdout</code> إلى ملف.<br>استخدم الأمر <code>iptables-save</code> على الخادوم A -الذي تريد نقل القواعد منه- لتصدير القواعد الحالية إلى ملف باسم «iptables-export» كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">cd ~
sudo iptables-save &gt; iptables-export</pre><p>هذا سيُنشئ الملف <code>iptables-export</code> في مجلد المنزل (home) الخاص بمستخدمك؛ يمكن أن يُستخدَم هذا الملف على خادومٍ آخر لتحميل قواعد الجدار الناري إلى iptables.</p><h2>عرض محتويات الملف (خطوة اختيارية)</h2><p>لنلقِ نظرةً سريعةً على محتويات الملف؛ سنستخدم الأمر <code>cat</code> لإظهار الملف على الطرفية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">cat iptables-export</pre><p>سيكون ناتج الأمر السابق شبيهًا بما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># Generated by iptables-save v1.4.21 on Tue Sep  1 17:32:29 2015
*filter
:INPUT ACCEPT [135:10578]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [8364:1557108]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 15.15.15.51/32 -j DROP
COMMIT
# Completed on Tue Sep  1 17:32:29 2015</pre><p>كما لاحظت، يحتوي الملف على ضبط قواعد iptables المُفعّلة؛ نحن جاهزون الآن لنسخ هذا الملف إلى الوجهة، التي هي الخادوم B.</p><h2>نسخ القواعد المصدرة إلى الخادوم الوجهة</h2><p>سنحتاج إلى نسخ ملف القواعد إلى الخادوم الوجهة (الخادوم B)؛ أسهل طريقة لفعل ذلك هي استخدام <code>scp</code> أو نسخ محتويات الملف ثم لصقها في ملفٍ جديد على الخادوم B. سنشرح كيفية استخدام الأمر <code>scp</code> لنسخ الملف عبر الشبكة إلى مجلد <code>‎/tmp</code>.<br>نفِّذ أمر <code>scp</code> الآتي على الخادوم A؛ تأكد أنك قد استبدلت الأجزاء المعلّمة ببيانات دخولك إلى الخادوم وعنوان IP له:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">scp iptables-export *user*@*server_b_ip_address*:/tmp</pre><p>سيُنسَخ الملف إلى مجلد <code>‎/tmp</code> في الخادوم B بعد الاستيثاق (authentication)؛ الحظ أن محتويات المجلد <code>‎/tmp</code> ستُحذَف عند إعادة الإقلاع، لذا يمكنك نسخ ذاك الملف إلى مكانٍ آخر إن أردت الاحتفاظ به.</p><h2>استيراد قواعد Iptables</h2><p>بعد نسخ القواعد المُصدَّرة إلى الخادوم الوجهة، فيمكننا الآن تحميلها إلى iptables؛ لكن -وبالاعتماد على بيئتك- ربما تحتاج إلى تحديث القواعد في الملف ووضع عناوين ومجالات IP جديدة، وربما تريد أيضًا أن تعدِّل أسماء البطاقات الشبكيّة؛ إذا أردت أن تعدِّل القواعد قبل تحميلها، فعليك تعديل الملف <code>‎/tmp/iptables-export</code> الآن.<br>بعد أن تكون جاهزًا لتحميل القواعد من ملف <code>iptables-export</code> إلى iptables، فاستخدم الأمر <code>iptables-restore</code> لفعل ذلك.<br>على الخادوم الوجهة (الخادوم B)، نفِّذ هذا الأمر لتحميل قواعد الجدار الناري:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables-restore &lt; /tmp/iptables-export</pre><p>سيحمِّل الأمر السابق القواعد إلى ipables، يمكنك التحقق من تحميلها بوساطة الأمر <code>sudo iptables -S</code>.</p><h2>حفظ القواعد</h2><p>تكون قواعد Iptables مؤقتةً، لذلك يجب أخذ الحيطة عند التعامل معها للحفاظ عليها حتى بعد إعادة الإقلاع؛ سيكون عليك تنفيذ هذه الخطوة على الخادوم B. سنشرح كيفية حفظ القواعد على توزيعتَي أوبنتو و CentOS.</p><h3>توزيعة أوبنتو</h3><p>إن أسهل طريقة لحفظ قواعد Iptables في أوبنتو لكي تبقى بعد إعادة الإقلاع هي استخدام حزمة <code>iptables-persistent</code>؛ يمكنك تثبيتها باستخدام الأمر apt-get:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get install iptables-persistent</pre><p>ستُسأل أثناء التثبيت إذا ما كنتَ تريد حفظ قواعد الجدار الناري الحالية؛ اختر <code>yes</code> إذا أردت حفظها.<br>إذا حدَّثتَ قواعد جدارك الناري في المستقبل، وأردت حفظ التعديلات، فنفِّذ هذا الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo invoke-rc.d iptables-persistent save</pre><h3>توزيعة CentOS 6 وما قبلها</h3><p>على توزيعة CentOS 6 وما قبلها (حيث تستخدم CentOS 7 افتراضيًا جدار FirewallD الناري)، يمكنك استخدام سكربت init الخاص بتطبيق iptables لحفظ القواعد:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service iptables save</pre><p>سيحفظ الأمر السابق قواعد iptables الحالية إلى الملف <code>‎/etc/sysconfig/iptables</code>، الذي يحمَّل بوساطة iptables عند الإقلاع.</p><h2>الخلاصة</h2><p>تهانينا، لقد أتممت نقل قواعد جدارك الناري من خادومك الأصلي إلى خادومك الجديد.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-migrate-iptables-firewall-rules-to-a-new-server">How To Migrate Iptables Firewall Rules to a New Server</a> لصاحبه: Mitchell Anicas.</p>
]]></description><guid isPermaLink="false">122</guid><pubDate>Sat, 17 Oct 2015 20:20:52 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; UFW: &#x642;&#x648;&#x627;&#x639;&#x62F; &#x648;&#x623;&#x648;&#x627;&#x645;&#x631; &#x634;&#x627;&#x626;&#x639;&#x629; &#x644;&#x644;&#x62C;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-ufw-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D9%88%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-r121/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/ufw.png.2276087c31a327e98deb0d32046fbfdd.png" /></p>

<p>إن UFW هو أداةٌ لضبط iptables موجودٌ افتراضيًا في أوبنتو؛ يوفِّر هذا الدرس مرجعًا سريعًا لأوامر UFW التي ستُنشِئ قواعد جدار iptables الناري لحالات الاستخدام الشائعة، وهذا يتضمن أمثلةً عن استخدام UFW للسماح وحجب مختلف الخدمات عبر المنفذ، والبطاقة الشبكيّة، وعنوان IP المصدر.</p><p style="text-align: center;"><img data-fileid="o_1a1mqlh8n1pptqen1ijdb325edh" src="" class="ipsImage ipsImage_thumbnailed" alt=""><a href="https://academy.hsoub.com/uploads/monthly_2015_10/ufw.png.4392171e58ffa87ef857fd6f40c0ac06.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5964" src="https://academy.hsoub.com/uploads/monthly_2015_10/ufw.thumb.png.8f3b1333ca864250698a9d51505a50ca.png" class="ipsImage ipsImage_thumbnailed" alt="ufw.thumb.png.8f3b1333ca864250698a9d5150"></a></p><h3>كيف تستخدم هذا الدرس</h3><ul><li>إذا كنت قد بدأت لتوِّك باستخدام UFW لضبط جدارك الناري، فراجع الدرس <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1%D8%A7-%D9%86%D8%A7%D8%B1%D9%8A%D8%A7-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ufw-r120/">تمهيد إلى UFW</a>.</li><li>تفترض أغلبية القواعد المشروحة هنا أنك تستخدم مجموعة قواعد UFW الافتراضية؛ التي تكون مضبوطةً للسماح بالاتصالات الصادرة وحجب الاتصالات الواردة، لذا عليك أن تنتقي البيانات التي تريد تمريرها</li><li>استعمل الأمثلة الموجودة في الأقسام المتتالية الملائمة لما تودّ تحقيقه؛ لا تعتمد أغلبية الأقسام في هذا الدرس على بعضها بعضًا، لذا يمكنك استخدام الأمثلة الآتية استخدامًا مستقلًا</li><li>انسخ والصق الأمثلة عن الأوامر الموجودة في هذا الدرس، مستبدلًا قيمك بالقيم المُعلَّمة بالأحمر</li></ul><p>تذكر أنك تستطيع أن تتحقق من مجموعة قواعد UFW الحالية عبر الأمر <code>sudo ufw status</code> أو <code>sudo ufw status verbose</code>.</p><h2>حجب عنوان IP</h2><p>نفِّذ الأمر الآتي لحجب جميع الاتصالات الشبكية التي تُنشَأ من عنوان IP معيّن، مثلًا <code>15.15.15.51</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw deny from 15.15.15.51</pre><p>يُحدِّد التعبير <code>from 15.15.15.51</code> في المثال السابق عنوان IP مصدري (source IP) هو «15.15.15.51»؛ يمكنك تحديد شبكة فرعية مثل <code>15.15.15.0/24</code> إن أردت ذلك. يمكن تحديد عنوان IP مصدري في أيّة قاعدة من قواعد الجدار الناري، بما في ذلك قاعدة allow.</p><h3>حجب الاتصالات إلى بطاقة شبكية معينة</h3><p>استعمل هذا الأمر لحجب جميع الاتصالات من عنوان IP محدد (على سبيل المثال، <code>15.15.15.51</code>) إلى بطاقة شبكيّة معيّنة، مثل <code>eth0</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw deny in on eth0 from 15.15.15.51</pre><p>يشبه هذا الأمرُ الأمرَ السابق، لكن مع زيادة التعبير <code>in on eth0</code>. يمكن تحديد البطاقة الشبكية في أيّة قاعدة من قواعد الجدار الناري، وهذه طريقةٌ ممتازةٌ لتحديد الدور الذي تلعبه بطاقة شبكية معيّنة.</p><h2>خدمة SSH</h2><p>إذا كنتَ تستخدم خادومًا سحابيًا، فربما تريد السماح لاتصالات SSH الواردة (المنفذ 22) لذا يمكنك الاتصال وإدارة خادومك؛ يشرح هذا القسم كيف تَضبط جدارك الناري بمختلف القواعد المتعلقة بخدمة SSH.</p><h3>السماح لاتصالات SSH</h3><p>تستطيع استخدام الأمر الآتي للسماح باتصالات SSH الواردة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow ssh</pre><p>صيغةٌ بديلةٌ عن الصيغةِ السابقة هي تحديد رقم المنفذ بدلًا من اسم خدمة SSH:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 22</pre><h3>السماح لاتصالات SSH الواردة من عنوان IP معين أو شبكة فرعية</h3><p>للسماح باتصالات SSH الواردة من عنوان IP معيّن أو شبكة فرعية، فعليك تحديد المصدر؛ على سبيل المثال، إذا أردت السماح لكامل الشبكة الفرعية <code>15.15.15.0/24</code>، فنفِّذ هذا الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow from 15.15.15.0/24  to any port 22</pre><h3>السماح لاتصالات Rsync الواردة من عنوان IP معين أو شبكة فرعية</h3><p>يمكن أن يُستخدَم Rsync (الذي يعمل على المنفذ 873) لنقل الملفات من حاسوبٍ إلى آخر.<br>للسماح باتصالات rsync الواردة من عنوان IP معيّن أو شبكة فرعية، فحدد عنوان IP المصدري والمنفذ الوجهة؛ على سبيل المثال، إذا أردت السماح لكامل الشبكة الفرعية <code>15.15.15.0/24</code> باستخدام rsync على خادومك، فنفِّذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow from 15.15.15.0/24 to any port 873</pre><h2>خادم الويب</h2><p>تستمع خوادم الويب -مثل أباتشي و Nginx- للطلبيات على المنفذين 80 و 443 لاتصالات HTTP و HTTPS على التوالي وبالترتيب. إذا كانت السياسة الافتراضية للاتصالات الواردة هي الحجب أو التجاهل، فربما تريد إنشاء قواعد تسمح لخادومك بالرد على تلك الطلبيات.</p><h3>السماح لجميع اتصالات HTTP الواردة</h3><p>استخدم الأمر الآتي للسماح لجميع اتصالات HTTP (المنفذ 80) الواردة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow http</pre><p>صيغةٌ بديلةٌ عن الصيغةِ السابقة هي تحديد رقم المنفذ بدلًا من اسم خدمة HTTP:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 80</pre><h3>السماح لجميع اتصالات HTTPS الواردة</h3><p>استخدم الأمر الآتي للسماح لجميع اتصالات HTTPS (المنفذ 443) الواردة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow https</pre><p>صيغةٌ بديلةٌ عن الصيغةِ السابقة هي تحديد رقم المنفذ بدلًا من اسم خدمة HTTPS:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 443</pre><h3>السماح لجميع اتصالات HTTP و HTTPS الواردة</h3><p>إذا أردت السماح لاتصالات HTTP و HTTPS معًا، فيمكنك إنشاء قاعدة وحيدة تسمح لكلي المنفذين؛ وذلك بتنفيذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow proto tcp from any to any port 80,443</pre><p>الحظ أنك ستحتاج إلى تحديد البروتوكول (باستخدام <code>proto tcp</code>) عند تحديد عدِّة منافذ.</p><h2>قواعد بيانات MySQL</h2><p>تستمع MySQL إلى اتصالات العميل على المنفذ 3306؛ إذا كان سيُستخدَم خادم قواعد بيانات MySQL من عميلٍ على خادوم بعيد؛ فتأكد أنك تسمح بمرور تلك البيانات الشبكية.</p><h3>السماح لاتصالات MySQL الواردة من عنوان IP معين أو شبكة فرعية</h3><p>للسماح باتصالات MySQL الواردة من عنوان IP معيّن أو شبكة فرعية، فحدِّد المصدر؛ على سبيل المثال، تستطيع تنفيذ هذا الأمر إذا أردت السماح للشبكة الفرعية <code>15.15.15.0/24</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow from 15.15.15.0/24 to any port 3306</pre><h3>السماح لاتصالات MySQL الواردة إلى بطاقة شبكية معينة</h3><p>استخدم الأمر الآتي للسماح لاتصالات MySQL لبطاقة شبكيّة معيّنة -لنفترض أنّك تملك بطاقة شبكيّة خاصة باسم <code>eth1</code>-:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow in on eth1 to any port 3306</pre><h2>قواعد بيانات PostgreSQL</h2><p>تستمع PostgreSQL إلى اتصالات العميل على المنفذ 5432 إذا كان سيُستخدَم خادم قواعد بيانات PostgreSQL من عميلٍ على خادوم بعيد؛ فتأكد أنك تسمح بمرور تلك البيانات الشبكية.</p><h3>السماح لاتصالات PostgreSQL الواردة من عنوان IP معين أو شبكة فرعية</h3><p>للسماح باتصالات PostgreSQL الواردة من عنوان IP معيّن أو شبكة فرعية، فحدِّد المصدر؛ على سبيل المثال، تستطيع تنفيذ هذا الأمر إذا أردت السماح للشبكة الفرعية <code>15.15.15.0/24</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow from 15.15.15.0/24 to any port 5432</pre><h3>السماح لاتصالات PostgreSQL الواردة إلى بطاقة شبكية معينة</h3><p>استخدم الأمر الآتي للسماح لاتصالات PostgreSQL لبطاقة شبكيّة معيّنة -لنفترض أنّك تملك بطاقة شبكيّة خاصة باسم <code>eth1</code>-:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow in on eth1 to any port 5432</pre><h2>خدمة البريد</h2><p>تستمع خوادم البريد مثل Sendmail و Postfix إلى تشكيلة واسعة من المنافذ بناءً على البروتوكولات المستخدمة لتوصيل البريد؛ إذا كنت تُشغِّل خادوم بريدٍ إلكتروني، فحدِّد البروتوكولات التي تستخدمها واسمح للاتصالات الموافقة لها. سنستعرض أيضًا مثالًا عن إنشاء قاعدة لحجب بريد SMTP الصادر.</p><h3>حجب بريد SMTP الصادر</h3><p>ربما تريد أن تحجب بريد SMTP الصادر إذا لم يكن من المفترض لخادومك أن يُرسِل بريدًا إلكترونيًّا؛ استخدم الأمر الآتي لحجب بريد SMTP الصادر (الذي يستخدم المنفذ 25):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw deny 25</pre><p>يضبط الأمر السابق خادومك لتجاهل كل البيانات المُرسَلة على المنفذ 25؛ إذا أردت أن تحجب خدمةً أخرى عبر رقم منفذها، فضع رقم المنفذ الخاص بها بدلًا من 25.</p><h3>السماح لجميع اتصالات SMTP الواردة</h3><p>للسماح لخادومك بالرد على اتصالات SMTP على المنفذ 25، فعليك تنفيذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 25</pre><p><strong>ملاحظة: من الشائع لخوادم SMTP أن تستخدم المنفذ 587 للبريد الصادر.</strong></p><h3>السماح لجميع اتصالات IMAP الواردة</h3><p>للسماح لخادومك بالرد على اتصالات IMAP على المنفذ 143، فعليك تنفيذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 143</pre><h3>السماح لجميع اتصالات IMAPS الواردة</h3><p>للسماح لخادومك بالرد على اتصالات IMAPS على المنفذ 993، فعليك تنفيذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 993</pre><h3>السماح لجميع اتصالات POP3 الواردة</h3><p>للسماح لخادومك بالرد على اتصالات POP3 على المنفذ 110، فعليك تنفيذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 110</pre><h3>السماح لجميع اتصالات POP3S الواردة</h3><p>للسماح لخادومك بالرد على اتصالات POP3S على المنفذ 995، فعليك تنفيذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo ufw allow 995</pre><h2>الخلاصة</h2><p>يجب أن يكون قد غطى هذا الدرس الكثير من الأوامر شائعة الاستخدام عند استعمال UFW لضبط الجدار الناري؛ وبالطبع إن UFW هو أداةٌ مرنةٌ جدًا، لذلك تستطيع دمج مختلف الخيارات مع الأوامر السابقة لملائمة متطلبات خادومك إن لم تكن تلك الأوامر مبيّنةً هنا.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands">UFW Essentials: Common Firewall Rules and Commands</a> لصاحبه: Mitchell Anicas.</p>
]]></description><guid isPermaLink="false">121</guid><pubDate>Thu, 15 Oct 2015 22:33:49 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x636;&#x628;&#x637; &#x62C;&#x62F;&#x627;&#x631;&#x627; &#x646;&#x627;&#x631;&#x64A;&#x627; &#x641;&#x64A; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; UFW</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1%D8%A7-%D9%86%D8%A7%D8%B1%D9%8A%D8%A7-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ufw-r120/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-firewall.png.c891220f751bfc197deaa9631cdaa5c0.png" /></p>

<div id="wmd-preview-section-46"><p id="كيف-تضبط-جدارا-ناريا-في-أوبنتو-1404-باستخدام-ufw">إن <strong>UFW</strong>، أو Uncomplicated Firewall (الجدار الناري غير المعقَّد)، هو واجهة للجدار الناري <strong>iptables</strong> الذي يجنح لتبسيط عملية ضبط جدار ناري؛ وعلى الرغم من أنَّ iptables هو أداةٌ قويةٌ ومرنة، لكن قد يكون من الصعب على المبتدئين أن يتعلموا استخدامه ليضبطوا جدارًا ناريًا ضبطًا سليمًا. إذا كنت تطمح إلى أن تبدأ بتأمين شبكتك، ولكنك لست متأكدًا من أيّ أداةٍ ستختار، فربما يكون UFW هو الخيار المناسب لك. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-firewall.png.6cfc56e45aa80ab7b59ab6f910c0dd1f.png"><img data-fileid="5878" class="ipsImage ipsImage_thumbnailed" alt="iptables-firewall.thumb.png.d95ce359c56b" src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-firewall.thumb.png.d95ce359c56b1fae1ba2bebf9434542b.png"></a></p><p>سيريك هذا الدرس كيفية ضبط جدارٍ ناريٍ في أوبنتو 14.04 بوساطة UFW.</p></div><div id="wmd-preview-section-48"><h2 id="المتطلبات-المسبقة">المتطلبات المسبقة</h2><p>قبل أن تبدأ في تطبيق هذا الدرس، يجب أن تملك حسابَ مستخدمٍ ليس جذرًا لكنه يستطيع الحصول على امتيازات الجذر عبر الأمر sudo. يمكنك تعلم كيف يتم ذلك عبر تطبيق الخطوات من 1 إلى 3 على الأقل في درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">الإعداد الابتدائي لخادوم أوبنتو 14.04</a>. </p><p>يكون UFW مُثبَّتًا افتراضيًا في أوبنتو؛ إذا ألغي تثبيته لسببٍ ما، فيمكنك إعادة تثبيته باستخدام الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install ufw
</pre></div><div id="wmd-preview-section-49"><h2 id="استخدام-ipv6-مع-ufw">استخدام IPv6 مع UFW</h2><p>إذا كان IPv6 مفعّلًا على خادومك، فتأكد أن UFW مضبوطٌ لدعم IPv6 كي تستطيع إدارة قواعد الجدار الناري الخاصة بعناوين IPv6 بالإضافة إلى IPv4؛ ولفعل ذلك، عدِّل ضبط UFW بمحررك النصي المفضّل؛ سنستخدم nano هنا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/default/ufw </pre><p>تأكد من أن قيمة «IPV6» مساويةٌ للقيمة «yes»؛ إذ يجب أن يبدو الملف كما يلي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">/etc/default/ufw excerpt 
… 
IPV6=yes 
… </pre><p>احفظ واخرج، اضغط <span style="font-family:comic sans ms,cursive;">Ctrl-X</span> للخروج من الملف، ثم Y لحفظ التعديلات التي أجريتها، ثم اضغط Enter لتأكيد اسم الملف. </p><p>عندما يفعَّل UFW، فسيُضبَط لكتابة قواعد جدار ناري لعناوين IPv4 و IPv6. </p><p>كُتِبَ هذا الدرس مع أخذ IPv4 بعين الاعتبار، لكنه قابل للتطبيق على IPv6 طالما كنت مفعِّلًا إياه.</p></div><div id="wmd-preview-section-50"><h2 id="التحقق-من-حالة-وقواعد-ufw">التحقق من حالة وقواعد UFW</h2><p>في أي وقتٍ تريد، تستطيع التحقق من حالة UFW باستخدام هذا الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw status verbose </pre><p>افتراضيًا، يكون UFW معطّلًا لذلك سيظهر عندك شيءٌ شبيهٌ بما يلي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Status: inactive </pre><p>إذا كان UFW مفعّلًا، فسيخبرك الناتج ذلك، وسيُظهِر أيّة قواعد قد ضُبِطَت؛ على سبيل المثال، إذا ضُبِطَ الجدار الناري للسماح بالاتصالات من أيّ مكانٍ إلى SSH (المنفذ 22)، فسيكون الناتج شيئًا شبيهًا بما يلي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Status: active 
Logging: on (low) 
Default: deny (incoming), allow (outgoing), disabled (routed) 
New profiles: skip

To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere</pre><p>يمكنك استخدام الأمر <span style="font-family:courier new,courier,monospace;">status</span> في أي وقتٍ إذا أردت أن تعرف كيف ضَبَطَ UFW الجدارَ الناري. </p><p>قبل تفعيل UFW، ربما تريد أن تتأكد أن جدارك الناري مضبوطٌ للسماح لك بالاتصال عبر SSH. </p><p>لنبدأ بضبط السياسات الافتراضية (default policies).</p></div><div id="wmd-preview-section-51"><h2 id="ضبط-السياسات-الافتراضية">ضبط السياسات الافتراضية</h2><p>إذا كنت قد بدأت لتوِّك مع جدارك الناري، فإن أولى القواعد التي عليك تعريفها هي السياسات الافتراضية؛ تتحكم هذه القواعد بطريقة معالجة البيانات الشبكية التي لم تُطابَق بدقّة مع أيّة قواعد أخرى؛ افتراضيًا، UFW مضبوطٌ لمنع جميع الاتصالات الواردة والسماح لكل الاتصالات الصادرة. هذا يعني أن أي شخصٍ يحاول أن يصل إلى خادومك السحابي لن يستطيع الاتصال، بينما يستطيع أيُ تطبيقٍ على خادومك أن يصل إلى «العالم الخارجي». </p><p>لنرجع الضبط الافتراضي لقواعد UFW لكي نتأكد أنك تستطيع الإكمال مع هذا الدرس؛ استخدم الأمرين الآتيين لإعادة ضبط القيم الافتراضية المُستخدَمة من UFW: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw default deny incoming </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw default allow outgoing </pre><p>وكما توقّعتَ، يعيد الأمران السابقان ضبط UFW إلى القيم الافتراضية بمنع الاتصالات الواردة والسماح للاتصالات الصادرة؛ قد تكون هذه القيم الافتراضية كافيةً للحواسيب الشخصية لكن تحتاج الخواديم إلى الرد على الطلبيات (requests) القادمة من المستخدمين الخارجيين؛ سنلقي نظرةً على ذلك لاحقًا.</p></div><div id="wmd-preview-section-52"><h2 id="السماح-لاتصالات-ssh">السماح لاتصالات SSH</h2><p>إذا فعّلنا جدار UFW الآن، فسيحجب جميع الاتصالات الواردة؛ هذا يعني أننا سنحتاج إلى إنشاء قواعد تسمح (وبدقّة) للاتصالات الشرعيّة (مثل اتصالات SSH أو HTTP) إذا أردنا أن يجيب خادومنا إلى ذاك النوع من الطلبيات؛ إذا كنت تستخدم خادومًا سحابيًا، فربما تريد السماح لاتصالات SSH الواردة كي تستطيع الاتصال وإدارة خادومك عن بُعد. </p><p>لضبط خادومك للسماح باتصالات SSH، فاستخدم أمر UFW الآتي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow ssh </pre><p>ينُشِئ الأمر السابق قواعد جدار ناري تسمح لجميع الاتصالات على المنفذ 22، الذي هو المنفذ الذي يستمع إليه «عفريت» (daemon)‏‏ ‏SSH؛ يعلم UFW ما هو «ssh» (بالإضافة إلى عدد كبير من أسماء الخدمات الأخرى) ولذلك لأنه مذكورٌ كخدمةٍ تَستخدمُ المنفذ 22 في ملف ‎<span style="font-family:courier new,courier,monospace;">/etc/services</span>.</p><p>نستطيع كتابة قاعدة مكافئة للقاعدة السابقة بتحديد المنفذ بدلًا من اسم الخدمة؛ على سبيل المثال، سيعمل هذا الأمر عمل الأمر السابق تمامًا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 22 </pre><p>إذا ضبطتَ عفريت SSH ليستخدم منفذًا آخر، فربما عليك تحديد المنفذ الملائم؛ على سبيل المثال، إذا كان يستمع خادم SSH إلى المنفذ 2222، فيمكنك استخدام الأمر الآتي للسماح للاتصالات على ذاك المنفذ: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 2222 </pre><p>الآن، وبعد أن ضبطتَ جدارك الناري للسماح لاتصالات SSH القادمة، فعلينا تفعيله.</p></div><div id="wmd-preview-section-53"><h2 id="تفعيل-ufw">تفعيل UFW</h2><p>استخدم الأمر الآتي لتفعيل UFW: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw enable </pre><p>سيظهر لك تحذيرٌ يقول: «قد يقطع هذا الأمر اتصالات SSH الموجودة»؛ لكننا قد ضبطنا مسبقًا قاعدةً تسمح لاتصالات SSH، لذلك لا بأس من الإكمال، أجب بكتابة y. <br>قد فعَّلتَ الجدار الناري الآن، تستطيع تنفيذ الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> sudo ufw status verbose </pre><p>لمعرفة القواعد المضبوطة.</p></div><div id="wmd-preview-section-54"><h2 id="السماح-لبقية-الاتصالات">السماح لبقية الاتصالات</h2><p>عليك الآن السماح لبقية الاتصالات التي يجب على خادومك الإجابة عليها؛ الاتصالات التي ستَسمح لها تتعلق باحتياجاتك. ولحسن الحظ، لقد تعلمت كيف تكتب قواعدًا تسمح للاتصالات بناءً على اسم الخدمة أو المنفذ (حيث فعلنا ذلك لخدمة SSH على المنفذ 22)؛ سنريك عدّة أمثلة لخدماتٍ شائعةٍ جدًا ربما تريد أن تسمح لها في جدارك الناري. إذا كانت لديك أيّة خدمات أخرى تريد السماح لاتصالاتها الواردة، فاتّبِع تلك الصيغة.</p></div><div id="wmd-preview-section-55"><h3 id="خدمة-http-المنفذ-80">خدمة HTTP – المنفذ 80</h3><p>يمكن السماح لاتصالات HTTP التي تستخدمها خوادم الويب غير المشفَّرة (unencrypted) بالأمر الآتي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow http </pre><p>أو إذا كنت تفضِّل استخدام رقم المنفذ (80)، فنفِّذ هذا الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 80
</pre></div><div id="wmd-preview-section-56"><h3 id="خدمة-https-المنفذ-443">خدمة HTTPS – المنفذ 443</h3><p>يمكن السماح لاتصالات HTTPS التي تستخدمها خوادم الويب المشفَّرة (encrypted) بالأمر الآتي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow https </pre><p>أو إذا كنت تفضِّل استخدام رقم المنفذ (443)، فنفِّذ هذا الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 443
</pre></div><div id="wmd-preview-section-57"><h3 id="خدمة-ftp-المنفذ-21">خدمة FTP – المنفذ 21</h3><p>يمكن السماح لاتصالات FTP التي تُستخدَم لنقل الملفات دون تشفير (والتي لا يجدر بك استخدامها على أيّة حال) بالأمر الآتي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow ftp </pre><p>أو إذا كنت تفضِّل استخدام رقم المنفذ (21)، فنفِّذ هذا الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 21/tcp
</pre></div><div id="wmd-preview-section-58"><h2 id="السماح-لمجالات-منافذ-معينة">السماح لمجالات منافذ معيّنة</h2><p>يمكنك تحديد مجالات منافذ عبر UFW؛ حيث تَستخدِم بعض التطبيقات عدِّة منافذ، بدلًا من منفذٍ واحد. </p><p>على سبيل المثال، للسماح لاتصالات X11، التي تستخدم المنافذ<strong> 6000-6007</strong>، فاستخدم هذين الأمرين: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 6000:6007/tcp </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow 6000:6007/udp </pre><p>عند تحديد مجالات للمنافذ مع UFW، فيجب عليك تحديد البروتوكول (tcp أو udp) الذي تُطبَّق عليه القاعدة؛ لم نذكر ذلك من قبل لأنه عدم تحديد البروتوكول يسمح ببساطة بالاتصالات لكلي البروتوكولَين، وهذا مقبولٌ في أغلبية الحالات.</p></div><div id="wmd-preview-section-59"><h2 id="السماح-لعناوين-ip-محددة">السماح لعناوين IP محددة</h2><p>عند العمل مع UFW، تستطيع تحديد عناوين IP؛ على سبيل المثال، إذا أردت السماح للاتصالات من عنوان IP محدد، مثل عنوان IP للعمل أو المنزل الذي هو <strong>15.15.15.51</strong>، فعليك استخدام الكلمة «<span style="font-family:courier new,courier,monospace;">from</span>» ثم عنوان IP: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow from 15.15.15.51 </pre><p>تستطيع تحديد منفذ معيّن يُسمَح لعنوان IP بالاتصال إليه عبر كتابة «<strong>to any port</strong>» متبوعةً برقم المنفذ؛ على سبيل المثال، إذا أردت السماح لعنوان <strong>15.15.15.51</strong> بالاتصال إلى المنفذ 22 (SSH)، فاستخدم هذا الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow from 15.15.15.51 to any port 22
</pre></div><div id="wmd-preview-section-60"><h2 id="السماح-للشبكات-الفرعية">السماح للشبكات الفرعية</h2><p>إذا أردت السماح لشبكة فرعية من عناوين IP، فيمكنك استخدام «ترميز CIDR»‏ (CIDR notation) لتحديد شبكة فرعية؛ فعلى سبيل المثال، إذا أردت السماح لجميع عناوين IP التي تتراوح بين <strong>15.15.15.1</strong> إلى <strong>15.15.15.254</strong> فيمكنك استخدام هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow from 15.15.15.0/24</pre><p>وبشكلٍ مشابه، تستطيع أيضًا تحديد منفذ يُسمَح للشبكة الفرعية <strong>15.15.15.0/24</strong> بالاتصال إليه؛ سنستخدم أيضًا المنفذ 22 (SSH) كمثال: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw allow from 15.15.15.0/24 to any port 22
</pre></div><div id="wmd-preview-section-61"><h2 id="السماح-بالاتصالات-إلى-بطاقة-شبكية-محددة">السماح بالاتصالات إلى بطاقة شبكية محددة</h2><p>إذا أردت إنشاء قاعدة جدار ناري تُطبَّق فقط على بطاقةٍ شبكيّةٍ محددة، فيمكنك فعل ذلك عبر كتابة «<strong>allow in on</strong>» متبوعةً باسم البطاقة الشبكيّة. <br>ربما تريد أن تبحث عن بطاقاتك الشبكيّة قبل الإكمال؛ استخدم هذا الأمر لفعل ذلك: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ip addr </pre><p><strong>الناتج: </strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">… 
2: eth0:
</pre></div><div id="wmd-preview-section-62"><h2 id="حجب-الاتصالات">حجب الاتصالات</h2><p>إذا لم تعدِّل السياسة الافتراضية للاتصالات الواردة، فإن UFW مضبوطٌ ليحجب كل الاتصالات الواردة؛ عمومًا، هذا يُبسِّط عملية إنشاء سياسة جدار ناري آمنة وذلك بتطلّب إنشاء قواعد تحدد بدقة المنافذ وعناوين IP التي يسمح لها «بالعبور»؛ لكن في بعض الأحيان، تريد أن تحجب اتصالاتٍ معينة بناءً على عنوان IP المصدري أو الشبكة الفرعية، ربما لأنك تعلم أن خادومك يتعرض للهجوم من هناك. وأيضًا لو حوّلت سياسة التعامل الافتراضية مع الاتصالات الواردة إلى «السماح» (والذي ليس مستحسنًا لصالح الأمان)، فعليك إنشاء قيود «حجب» لأي خدمة أو عناوين IP لا تريد السماح بمرور الاتصالات إليها. </p><p>يمكنك استخدام الأوامر المشروحة آنفًا لكتابة قيود الحجب، لكن مع استبدال «<strong>deny</strong>» بالكلمة «<strong>allow</strong>». </p><p>على سبيل المثال، لحجب اتصالات HTTP، فعليك استخدام الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw deny http </pre><p>أو إذا أردت حجب جميع الاتصالات من <strong>15.15.15.51</strong> فيمكنك استخدام هذا الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw deny from 15.15.15.51 </pre><p>إذا أردت مساعدةً في كتابة قواعد الحجب، فانظر إلى قواعد السماح السابقة وعدِّلها بما يلائمها. <br>لنلقِ الآن نظرةً على طريقة حذف القواعد.</p></div><div id="wmd-preview-section-63"><h2 id="حذف-القواعد">حذف القواعد</h2><p>معرفة كيفية حذف قواعد الجدار الناري بنفس أهمية معرفة كيفية إنشائها؛ هنالك طريقتان لتحديد أيّة قواعد لتحذف: عبر رقم القاعدة أو عبر القاعدة نفسها (بشكلٍ شبيه لطريقة تحديد القاعدة عندما أُنشِئت). سنبدأ بطريقة الحذف عبر رقم القاعدة لأنها أسهل، مقارنةً بكتابة القواعد نفسها، خصوصًا إن كنتَ حديث العهد بالتعامل مع UFW.</p></div><div id="wmd-preview-section-64"><h3 id="عبر-رقم-القاعدة">عبر رقم القاعدة</h3><p>إذا كنت تستخدم رقم القاعدة لحذف قواعد الجدار الناري، فإن أول شيء تريد فعله هو الحصول على قائمة بقواعد جدارك الناري؛ يملك أمر<span style="font-family:courier new,courier,monospace;"> UFW status</span> خيارًا لعرض الأرقام بجوار قواعدها، كما هو مبيّن هنا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw status numbered </pre><p><strong>الناتج: </strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Status: active

To Action From -- ------ ---- [ 1] 22 ALLOW IN 15.15.15.0/24 [ 2] 80 ALLOW IN Anywhere</pre><p>إذا قررت أنك تريد حذف القاعدة 2، التي تسمح بالاتصالات إلى المنفذ 80 (HTTP)، فيمكنك ذلك عبر تمرير رقمها إلى أمر UFW delete كما يلي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw delete 2 </pre><p>ما سبق سيُظهِر محثًا (prompt) ليطلب موافقتك، ثم سيحذف القاعدة 2 التي تسمح باتصالات HTTP. الحظ أنك إن كنت قد فعَّلت IPv6، فعليك أن تحذف قاعدة IPv6 المناظرة لها.</p></div><div id="wmd-preview-section-65"><h3 id="عبر-القاعدة-نفسها">عبر القاعدة نفسها</h3><p>البديل عن تحديد رقم القاعدة هو تحديد القاعدة نفسها؛ على سبيل المثال، إذا أردت حذف قاعدة «<span style="font-family:courier new,courier,monospace;">allow http</span>»، فيمكنك كتابة الأمر كما يلي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw delete allow http </pre><p>يمكنك أيضًا تحديد القاعدة مستعملًا «<span style="font-family:courier new,courier,monospace;">allow 80</span>»، بدلًا من اسم الخدمة: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw delete allow 80 </pre><p>ستَحذُف هذه الطريقة قواعد IPv4 و IPv6 إن كانت موجودةً.</p></div><div id="wmd-preview-section-66"><h2 id="كيفية-تعطيل-ufw-خطوة-اختيارية">كيفية تعطيل UFW (خطوة اختيارية)</h2><p>إذا قررت أنّك لا تريد استعمال UFW لأي سببٍ كان، فيمكنك تعطيله عبر هذا الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw disable </pre><p>ستُعطَّل أيّة قواعد أنشَأتها باستخدام UFW، يمكنك بأي وقتٍ تنفيذ:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw enable </pre><p>إذا احتجت لتفعيله لاحقًا.</p></div><div id="wmd-preview-section-67"><h2 id="إعادة-ضبط-قواعد-ufw-خطوة-اختيارية">إعادة ضبط قواعد UFW (خطوة اختيارية)</h2><p>إذا كانت لديك قواعد UFW مضبوطة، لكنك قررت أن تبدأ من الصفر، فيمكنك استخدام الأمر <span style="font-family:courier new,courier,monospace;">reset</span>: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ufw reset </pre><p>سيُعطِِّل الأمر السابق UFW ويحذف أيّة قواعد عرَّفتَها سابقًا. أبقِ في بالك أن السياسات الافتراضية لن يُعاد ضبطها إلى إعداداتها الافتراضية إذا كنت قد عدَّلتها.</p></div><div id="wmd-preview-section-68"><h2 id="الخلاصة">الخلاصة</h2><p>يجب أن يكون قد ضُبِطَ جدارك الناري للسماح (على الأقل) لاتصالات SSH؛ تأكد أن تسمح لأيّة اتصالات واردة أخرى لخادومك بينما تقيّد أيّة اتصالات غير ضرورية، كي يكون خادومك آمنًا ويعمل عملًا صحيحًا. </p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-14-04">How To Set Up a Firewall with UFW on Ubuntu 14.04</a> لصاحبه Mitchell Anicas.</p></div>
]]></description><guid isPermaLink="false">120</guid><pubDate>Tue, 13 Oct 2015 23:41:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; IPTables - &#x642;&#x648;&#x627;&#x639;&#x62F; &#x648;&#x623;&#x648;&#x627;&#x645;&#x631; &#x634;&#x627;&#x626;&#x639;&#x629; &#x644;&#x644;&#x62C;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-iptables-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D9%88%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-r119/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-essentials.png.92af21c01b9863d1833355143a5ff8bd.png" /></p>

<p>Iptables هو برمجية جدار ناري مضمَّنة افتراضيًّا في أغلبية توزيعات لينُكس. يوفِّر هذا الدرس مرجعًا سريعًا لأوامر iptables التي ستُنشِئ قواعدًا لحالات الاستخدام الشائعة، وهذا يتضمن أمثلةً عن استخدام iptables للسماح وحجب مختلف الخدمات عبر المنفذ، والبطاقة الشبكيّة، وعنوان IP المصدر.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-essentials.png.6d857c1986fa0787bc06cf81d992afdb.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5851" src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-essentials.thumb.png.96cb83c3aad4b864547fd8512e8ec49f.png" class="ipsImage ipsImage_thumbnailed" alt="iptables-essentials.thumb.png.96cb83c3aa"></a></p><h3>كيف تستخدم هذا الدرس</h3><ul><li>إذا كنت قد بدأت لتوِّك باستخدام iptables لضبط جدارك الناري، فراجع الدرس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">تمهيد إلى iptables</a>.</li><li>تفترض أغلبية القواعد المشروحة هنا أنَّ iptables مضبوطٌ لتجاهل الاتصالات الواردة عبر السياسة الافتراضية، لذا عليك أن تنتقي البيانات التي تريد تمريرها.</li><li>استعمل الأمثلة الموجودة في الأقسام المتتالية الملائمة لما تودّ تحقيقه؛ لا تعتمد أغلبية الأقسام في هذا الدرس على بعضها بعضًا، لذا يمكنك استخدام الأمثلة الآتية استخدامًا مستقلًا.</li><li>انسخ والصق الأمثلة عن الأوامر الموجودة في هذا الدرس، مستبدلًا قيمك بالقيم المُعلَّمة بالأحمر.</li></ul><p>أبقِ في بالك أنَّ ترتيب القواعد مهم؛ تستخدم جميع أوامر <code>iptables</code> الآتية الخيار <code>‎-A</code> الذي يُلحِق (append) القاعدة الجديدة إلى نهاية سلسلة، إذا أردت وضعها في مكانٍ آخر، فيمكنك استخدام الخيار <code>‎-I</code> الذي يسمح لك بتحديد موقع القاعدة الجديدة (أو ببساطة وضعها في بداية السلسلة [chain] إن لم تُحدِّد رقمًا للقاعدة).</p><p><strong>ملاحظة: احذر عند العمل مع الجدر النارية أن تمنع نفسك من الدخول إلى خادومك عبر حجب اتصالات SSH (المنفذ 22 افتراضيًّا)؛ إذا فقدت القدرة على الوصول إلى خادومك بسبب ضبط جدارك الناري، فستحتاج إلى الدخول عبر !طرفية محلية! لتقويم الخلل. بعد أن تسجل دخولك عبر الطرفية المحلية، يمكنك تعديل قواعد جدارك الناري للسماح بالوصول إلى خدمة SSH (أو السماح بعبور جميع بيانات التراسل الشبكي)؛ إذا كانت قواعد جدارك الناري المحفوظة تسمح بالوصول عبر SSH، فستتمكن عبر إعادة تشغيل الخادوم من الاتصال مجددًا عبر SSH.</strong></p><p>تذكَّر أنك تستطيع التحقق من مجموعة قواعد iptables الحالية بالأمرَين <code>sudo iptables -S</code> و <code>sudo iptables -L</code>.<br>لنلقِ نظرةً على أوامر iptables.</p><h2>حفظ القواعد</h2><p>تكون قواعد iptables مؤقتة، مما يعني أنه من الضروري حفظها يدويًا لكي تبقى بعد إعادة الإقلاع.</p><h3>توزيعة أوبنتو</h3><p>أسهل طريقة لحفظ قواعد iptables في أوبنتو كي تبقى حتى لو أُعيد الإقلاع هي استخدام الحزمة <code>iptables-persistent</code>؛ ثبِّتها عبر apt-get كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get install iptables-persistent</pre><p>ستُسأل أثناء التثبيت إذا ما كنت تريد حفظ قواعد جدارك الناري الحالية.<br>إذا حدَّثت قواعد جدارك الناري وأردت حفظ التغييرات، فنفِّذ الأمر الآتي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo invoke-rc.d iptables-persistent save</pre><h3>توزيعة CentOS 6 وما قبلها</h3><p>يمكنك استخدام سكربت init لجدار iptables لحفظ القواعد في توزيعة CentOS 6 وما قبلها (تَستخدم توزيعة CentOS 7 جدار FirewallD افتراضيًّا):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service iptables save</pre><p>سيحفظ الأمر السابق قواعد iptables الحالية إلى ملف <code>‎/etc/sysconfig/iptables</code>.</p><h2>قواعد مفيدة عموما</h2><p>يتضمن هذا القسم تشكيلةً من أوامر iptables التي ستُنشِئ قواعدًا مفيدةً في أغلبية الخواديم.</p><h3>السماح بالاتصالات إلى بطاقة Loopback</h3><p>بطاقة «loopback» (التي يُشار إليها أيضًا بالاسم <code>lo</code>) هي البطاقة التي يستخدمها الحاسوب لإجراء اتصالات شبكيّة مع نفسه؛ على سبيل المثال، إذا شغَّلت <code>ping localhost</code> أو <code>ping 127.0.0.1</code>، فإن خادومك سيجري عملية ping لنفسه باستخدام بطاقة loopback؛ يمكن الاستفادة أيضًا من بطاقة loopback إذا ضَبطتَ تطبيقك للاتصال إلى خادوم قواعد بيانات ذي العنوان «localhost»؛ ولهذا عليك أن تتأكد أنَّ جدارك الناري يسمح بمرور لهذه الاتصالات.<br>لقبول مرور جميع بيانات التراسل الشبكي على بطاقة loopback، فعليك تنفيذ هذين الأمرين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT</pre><h3>السماح للاتصالات الواردة المنشأة والمتعلقة</h3><p>يجب عادةً أن تمر بيانات التراسل الشبكي باتجاهين (صادرة وواردة) لكي تعمل الاتصالات الشبكية عملًا صحيحًا؛ من الاعتيادي إنشاء قاعدة في الجدار الناري للسماح بالاتصالات الواردة المُنشَأة (established) والمتعلقة (related)، مما يمكِّن الخادوم من استقبال البيانات المُرجَعة من اتصالات صادرة بدأها الخادوم نفسه؛ سيكون الأمر كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT</pre><h3>السماح بمرور البيانات للاتصالات الصادرة المنشأة</h3><p>ربما تود السماح للبيانات الصادرة لجميع الاتصالات المُنشَأة، التي تكون عادةً الرد على الاتصالات الواردة المسموح لها؛ الأمر الذي يفعل بذلك هو:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><h3>التمرير من الشبكة الداخلية إلى الخارجية</h3><p>على فرض أنَّ <code>eth0</code> هي شبكتك الخارجية، و <code>eth1</code> هي شبكتك الداخلية، فإن الأمر الآتي سيسمح بتمرير البيانات من الشبكة الداخلية إلى الخارجية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT</pre><h3>تجاهل الرزم الشبكية غير الصالحة</h3><p>تُعلَّم بعض الرزم الشبكية على أنها «غير صالحة» (invalid)؛ قد يكون مفيدًا في بعض الأخيان تسجيل هذا النوع من الرزم لكن يكون عادةً من المقبول تجاهلها. يمكنك فعل ذلك بوساطة هذا الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP</pre><h2>حجب عنوان IP</h2><p>استعمل الأمر الآتي لحجب الاتصالات الشبكية التي تنحدر من عنوان IP معيّن، ولنقل أنه <code>15.15.15.51</code> مثلًا:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -s 15.15.15.51 -j DROP</pre><p>يُحدِّد التعبير <code>‎-s 15.15.15.51</code> عنوان IP المصدري على أنه «15.15.15.51»، يمكن أن يُحدَّد عنوان IP المصدري في أيّة قاعدة من قواعد الجدار الناري، بما في ذلك قواعد السماح (allow).<br>إذا كنت تريد «رفض» (reject) الاتصال بدلًا من تجاهله (أي سيكون الرد على الاتصال هو خطأ «connection refused») فبدِّل «DROP» إلى «REJECT» كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -s 15.15.15.51 -j REJECT</pre><h3>حجب الاتصالات إلى بطاقة شبكية</h3><p>لحجب جميع الاتصالات من عنوان IP معيّن (<code>15.15.15.51</code> مثلًا)، إلى بطاقة شبكيّة معيّنة (<code>eth0</code> مثلًا) فاستخدم هذا الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP</pre><p>يشبه هذا الأمر كثيرًا الأمرَ في الفقرة السابقة، لكنه يزيد عنه بالتعبير <code>‎-i eth0</code>؛ يمكن تحديد البطاقة الشبكية في أيّة قاعدة من قواعد الجدار الناري، وهذه طريقةٌ رائعةٌ لجعل قاعدةٍ ما محدودةً إلى شبكةٍ معيّنةٍ فقط.</p><h2>خدمة SSH</h2><p>إذا كنتَ تستخدم خادومًا سحابيًا، فربما تريد السماح لاتصالات SSH الواردة (المنفذ 22) لذا يمكنك الاتصال وإدارة خادومك؛ يشرح هذا القسم كيف تضبط جدارك الناري بمختلف القواعد المتعلقة بخدمة SSH.</p><h3>السماح لاتصالات SSH</h3><p>تستطيع استخدام الأمرين الآتيين للسماح لجميع اتصالات SSH الواردة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات SSH المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لاتصالات SSH الواردة من عنوان IP معين أو شبكة فرعية</h3><p>للسماح باتصالات SSH الواردة من عنوان IP معيّن أو شبكة فرعية، فعليك تحديد المصدر؛ على سبيل المثال، إذا أردت السماح لكامل الشبكة الفرعية <code>15.15.15.0/24</code>، فنفِّذ هذين الأمرين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات SSH المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لاتصالات SSH الصادرة</h3><p>إذا لم تكن سياسة <code>OUTPUT</code> في جدارك الناري مضبوطةً إلى <code>ACCEPT</code>، فربما تريد السماح لاتصالات SSH الصادرة (أي أن يبدأ خادومك اتصال SSH إلى خادومٍ آخر) بتنفيذ هذين الأمرين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><h3>السماح لاتصالات Rsync الواردة من عنوان IP معين أو شبكة فرعية</h3><p>يمكن أن يُستخدَم Rsync (الذي يعمل على المنفذ 873) لنقل الملفات من حاسوبٍ إلى آخر.<br>للسماح باتصالات rsync الواردة من عنوان IP معيّن أو شبكة فرعية، فحدِّد عنوان IP المصدري والمنفذ الوجهة؛ على سبيل المثال، إذا أردت السماح لكامل الشبكة الفرعية <code>15.15.15.0/24</code> باستخدام rsync على خادومك، فنفِّذ الأمرين الآتيين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات rsync المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h2>خادم الويب</h2><p>تستمع خوادم الويب -مثل أباتشي و Nginx- للطلبيات على المنفذين 80 و 443 لاتصالات HTTP و HTTPS على التوالي وبالترتيب. إذا كانت السياسة الافتراضية للاتصالات الواردة هي الحجب أو التجاهل، فربما تريد إنشاء قواعد تسمح لخادومك بالرد على تلك الطلبيات.</p><h3>السماح لجميع اتصالات HTTP الواردة</h3><p>استخدم الأمرين الآتيين للسماح لجميع اتصالات HTTP (المنفذ 80) الواردة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات HTTP المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لجميع اتصالات HTTPS الواردة</h3><p>استخدم الأمرين الآتيين للسماح لجميع اتصالات HTTPS (المنفذ 443) الواردة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات !HTTPS! المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لجميع اتصالات HTTP و HTTPS الواردة</h3><p>إذا أردت السماح لجميع اتصالات HTTP و HTTPS الواردة معًا، فيمكنك استخدام الوحدة (module) ‏«mulitport» لإنشاء قاعدة تسمح بمرور البيانات على كلي المنفذين؛ وذلك عبر الأمرين الآتيين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات HTTP و HTTPS المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h2>قواعد بيانات MySQL</h2><p>تستمع MySQL إلى اتصالات العميل على المنفذ 3306؛ إذا كان سيُستخدَم خادم قواعد بيانات MySQL من عميل على خادوم بعيد؛ فتأكد أنك تسمح بمرور تلك البيانات الشبكية.</p><h3>السماح لاتصالات MySQL الواردة من عنوان IP معين أو شبكة فرعية</h3><p>للسماح باتصالات MySQL الواردة من عنوان IP معيّن أو شبكة فرعية، فحدِّد المصدر؛ على سبيل المثال، تستطيع تنفيذ هذين الأمرين إذا أردت السماح للشبكة الفرعية <code>15.15.15.0/24</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات MySQL المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لاتصالات MySQL الواردة إلى بطاقة شبكية معينة</h3><p>استخدم الأمر الآتي للسماح لاتصالات MySQL لبطاقة شبكيّة معيّنة -لنفترض أنّك تملك بطاقة شبكيّة خاصة باسم <code>eth1</code>-:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات MySQL المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h2>قواعد بيانات PostgreSQL</h2><p>تستمع PostgreSQL إلى اتصالات العميل على المنفذ 5432 إذا كان سيُستخدَم خادم قواعد بيانات PostgreSQL من عميل على خادومٍ بعيد؛ فتأكد أنك تسمح بمرور تلك البيانات الشبكية.</p><h3>السماح لاتصالات PostgreSQL الواردة من عنوان IP معين أو شبكة فرعية</h3><p>للسماح باتصالات PostgreSQL الواردة من عنوان IP معيّن أو شبكة فرعية، فحدِّد المصدر؛ على سبيل المثال، تستطيع تنفيذ هذين الأمرين إذا أردت السماح للشبكة الفرعية <code>15.15.15.0/24</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات PostgreSQL المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لاتصالات PostgreSQL الواردة إلى بطاقة شبكية معينة</h3><p>استخدم الأمر الآتي للسماح لاتصالات PostgreSQL لبطاقة شبكيّة معيّنة -لنفترض أنّك تملك بطاقة شبكيّة خاصة باسم <code>eth1</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات PostgreSQL المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h2>خدمة البريد</h2><p>تستمع خوادم البريد مثل Sendmail و Postfix إلى تشكيلة واسعة من المنافذ بناءً على البروتوكولات المستخدمة لتوصيل البريد؛ إذا كنت تُشغِّل خادوم بريدٍ إلكتروني، فحدِّد البروتوكولات التي تستخدمها واسمح للاتصالات الموافقة لها. سنستعرض أيضًا مثالًا عن إنشاء قاعدة لحجب بريد SMTP الصادر.</p><h3>حجب بريد SMTP الصادر</h3><p>ربما تريد أن تحجب بريد SMTP الصادر إذا لم يكن من المفترض لخادومك أن يرسل بريدًا إلكترونيًّا؛ استخدم الأمر الآتي لحجب بريد SMTP الصادر (الذي يستخدم المنفذ 25):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT</pre><p>يضبط الأمر السابق خادومك لتجاهل كل البيانات المُرسَلة على المنفذ 25؛ إذا أردت أن تحجب خدمةً أخرى عبر رقم منفذها، فضع رقم المنفذ الخاص بها بدلًا من 25.</p><h3>السماح لجميع اتصالات SMTP الواردة</h3><p>للسماح لخادومك بالرد على اتصالات SMTP على المنفذ 25، فعليك تنفيذ الأمرين الآتيين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات SMTP المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><p><strong>ملاحظة: من الشائع لخوادم SMTP أن تستخدم المنفذ 587 للبريد الصادر.</strong></p><h3>السماح لجميع اتصالات IMAP الواردة</h3><p>للسماح لخادومك بالرد على اتصالات IMAP على المنفذ 143، فعليك تنفيذ الأمرين الآتيين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات IMAP المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لجميع اتصالات IMAPS الواردة</h3><p>للسماح لخادومك بالرد على اتصالات IMAPS على المنفذ 993، فعليك تنفيذ الأمرين الآتيين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات IMAPS المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لجميع اتصالات POP3 الواردة</h3><p>للسماح لخادومك بالرد على اتصالات POP3 على المنفذ 110، فعليك تنفيذ الأمرين الآتيين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -i -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات POP3 المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h3>السماح لجميع اتصالات POP3S الواردة</h3><p>للسماح لخادومك بالرد على اتصالات POP3S على المنفذ 995، فعليك تنفيذ الأمرين الآتيين:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT</pre><p>الأمر الثاني (الذي يسمح بمرور بيانات التراسل الشبكي لاتصالات POP3S المُنشَأة) مطلوبٌ فقط إذا لم تكن سياسة <code>OUTPUT</code> مضبوطةً إلى <code>ACCEPT</code>.</p><h2>الخلاصة</h2><p>يجب أن يكون قد غطى هذا الدرس الكثير من الأوامر شائعة الاستخدام عند استعمال iptables لضبط الجدار الناري؛ وبالطبع iptables هو أداةٌ مرنةٌ جدًا، لذلك تستطيع دمج مختلف الخيارات مع الأوامر السابقة لملائمة متطلبات خادومك إن لم تكن تلك الأوامر مبيّنةً هنا.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands">Iptables Essentials: Common Firewall Rules and Commands</a> لصاحبه: Mitchell Anicas.</p>
]]></description><guid isPermaLink="false">119</guid><pubDate>Mon, 12 Oct 2015 21:50:50 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x636;&#x628;&#x637; &#x62C;&#x62F;&#x627;&#x631; IPTables &#x644;&#x62D;&#x645;&#x627;&#x64A;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x646;&#x642;&#x648;&#x644;&#x629; &#x628;&#x64A;&#x646; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645;&#x643;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1-iptables-%D9%84%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%86%D9%82%D9%88%D9%84%D8%A9-%D8%A8%D9%8A%D9%86-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85%D9%83-r118/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-firewall.png.404e6ec84b7fb6a0aa029cd5ea2950a8.png" /></p>

<p>نشر مختلف مكونات تطبيقك على عدِّة عقد (nodes) هو طريقةٌ شائعةٌ لتخفيف الحِمل (load) والبدء في التوسع أفقيًا (scaling horizontally)؛ مثالٌ اعتياديٌ عن ذلك هو ضبط قاعدة بيانات على خادوم منفصل عن تطبيقك؛ وعلى الرغم من العدد الكبير من المحاسن الناتجة عن هذا الإعداد، لكن الاتصال عبر الشبكة ينضوي على مخاطر أمنية.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-firewall.png.d858e4859ba07b4d31ea56f6ae2736d5.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5772" src="https://academy.hsoub.com/uploads/monthly_2015_10/iptables-firewall.thumb.png.ab0e267e7da8eca903dd90d1be5060d3.png" class="ipsImage ipsImage_thumbnailed" alt="iptables-firewall.thumb.png.ab0e267e7da8"></a></p><p>سنشرح في هذا الدرس كيف نعد جدار ناري بسيط على كل خادوم من خواديمك عند استخدامك للضبط الموزَّع (distributed setup)؛ سنضبط السياسة لكي تسمح بمرور البيانات بين المكونات (components)، وتمنع في الوقت ذاته مرور أيّة بيانات أخرى.</p><p>سنستخدم في هذا الدليل خادومَي أوبنتو 14.04؛ واحدٌ سيحتوي على نسخة من وردبريس مُخدَّمة بوساطة nginx، والآخر يستضيف قاعدة بيانات MySQL للتطبيق. وعلى الرغم من أننا سنستخدم هذا الإعداد كمثال، لكنك تستطيع تعديل التقنيات التي سنستخدمها لكي تلائم متطلبات خادومك.</p><h3>المتطلبات المسبقة</h3><p>للبدء، عليك أن تحصل على خادومَي Ubuntu؛ وتضيف مستخدمًا عاديًا بامتيازات الجذر عبر الأمر <code>sudo</code> على كلي الخادومَين؛ يمكنك اتباع درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">الضبط المبدئي لخادوم أوبنتو 14.04</a> لكي تتعلم كيف تفعل ذلك بشكلٍ صحيح.</p><h2>ضبط جدار ناري بسيط</h2><p>سنبدأ بضبط أساسي للجدار الناري على كل خادوم من خواديمنا. السياسة التي سنتبعها تأخذ منحى «الأمان أولًا»، أي أننا سنمنع كل شيء عدا بيانات التراسل التابعة لخدمة SSH ثم سنفتح «فجوات» في الجدار الناري خاصة بتطبيقنا.</p><p>يوفر الجدار الناري المضبوط في <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1%D9%8D-%D9%86%D8%A7%D8%B1%D9%8A%D9%91-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D8%B9%D9%84%D9%89-ubuntu-1404-r38/">هذا الدرس</a> إعدادًا أساسيًا لما سنحتاج؛ ثبِّت الحزمة <code>iptables-persistent</code> ثم الصق القواعد الأساسية في ملف <code>‎/etc/iptables/rules.v4</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get update
sudo apt-get install iptables-persistent
sudo nano /etc/iptables/rules.v4</pre><p>محتويات الملف: <span style="font-family:courier new,courier,monospace;"><code>etc/iptables/rules.v4/</code></span></p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]

# Acceptable UDP traffic

# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

# Acceptable ICMP traffic

# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT

# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP

# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable

# Commit the changes
COMMIT

*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT</pre><p>إذا كنتَ تجري هذه التعديلات على «بيئة حيّة» فلا تعيد تحميل قواعد الجدار الناري! تحميل القواعد الأساسية المذكورة هنا سيؤدي مباشرةً إلى قطع الاتصال بين تطبيقك وخادوم قواعد البيانات؛ سنحتاج إلى تعديل القواعد لكي تعكس احتياجاتنا لكي يعمل التطبيق قبل إعادة التحميل.</p><h2>معرفة المنافذ التي تستخدمها الخدمات التي تشغلها</h2><p>لكي نستطيع إضافة استثناءات للسماح بالاتصالات بين مختلف مكونات التطبيق، فسنحتاج إلى معرفة المنافذ الشبكية المُستخدَمة؛ يمكنك معرفة المنافذ الشبكية الصحيحة بتفحص ملفات الضبط، لكن طريقة اكتشاف المنافذ غير مرتبطة بالتطبيقات هي التحقق من الخدمات التي «تستمع» إلى الاتصالات على كل جهاز.</p><p>يمكننا استخدام الأداة <code>netstat</code> لمعرفة ذلك؛ ولمّا كان تطبيقنا يتواصل عبر IPv4 فقط، فسنضيف الوسيط ‎-4 لكنك تستطيع إزالته إذا كنت تستخدم IPv6 أيضًا؛ الوسائط الأخرى اللازمة لمعرفة الخدمات التي تعمل هي <code>‎-plunt</code>.</p><p>على خادوم الويب، سنرى شيئًا شبيهًا بما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo netstat -4plunt</pre><p>الناتج:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1058/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4187/nginx</pre><p><br>يُظهِر أول عمود عنوان IP والمنفذ للخدمة التي تستمع إليه (الموجود اسمها في آخر السطر)؛ عنوان <code>0.0.0.0</code> الخاص يعني أن الخدمة المعنية تستمع إلى جميع العناوين المتاحة (جميع البطاقات الشبكية).<br>وعلى خادوم قواعد البيانات، يجب أن نشاهد شيئًا شبيهًا بما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo netstat -4plunt</pre><p>الناتج:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1097/sshd
tcp        0      0 192.0.2.30:3306         0.0.0.0:*               LISTEN      3112/mysqld</pre><p>يمكنك قراءة الأعمدة السابقة بنفس الطريقة. يمثّل عنوان <code>192.0.2.30</code> في المثال السابق عنوان IP الخاص لخادوم قواعد البيانات؛ وعند إعداد التطبيق، لقد حصرنا استخدام MySQL إلى البطاقة الخاصة فقط لأسبابٍ أمنية.</p><p>الحظ القيم التي ستجدها في هذه الخطوة، هذه هي التفاصيل الشبكية التي سنحتاج لها لكي نعدِّل ضبطنا للجدار الناري.</p><p>في مثالنا التوضيحي، سنلاحظ أنه علينا التأكد من أن هذه المنافذ متاحة على خادوم الويب:</p><ul><li>المنفذ 80 على جميع العناوين</li><li>المنفذ 22 على جميع العناوين (وذلك موجودٌ في قواعد الجدار الناري)</li></ul><p>وعلينا التأكد من أن هذه المنافذ متاحةٌ على خادوم قواعد البيانات:</p><ul><li>المنفذ 3306 على العنوان <code>192.0.2.30</code> (أو البطاقة الشبكية المرتبطة معه)</li><li>المنفذ 22 على جميع العناوين (وذلك موجودٌ في قواعد الجدار الناري)</li></ul><h2>تعديل قواعد الجدار الناري لخادوم الويب</h2><p>لدينا الآن معلومات المنافذ التي نحتاج إليها لتعديل مجموعة قواعد الجدار الناري لخادوم الويب الخاص بنا؛ افتح ملف القواعد في محررك النصي بامتيازات الجذر (عبر <code>sudo</code>):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo nano /etc/iptables/rules.v4</pre><p>سنحتاج إلى السماح بمرور بيانات التراسل الشبكي على المنفذ 80 في خادوم الويب؛ ولمّا كان الخادوم يستمع إلى الاتصالات على جميع العناوين المتوفرة، فإننا لن نقيّد القاعدة ببطاقة شبكية أو عنوان معيّن.</p><p>سيستخدم زوار موقعنا بروتوكول TCP للاتصال؛ إطار العمل الذي أنشأناه لجدارنا الناري فيه سلسلة خاصة باسم <code>TCP</code> لوضع استثناءات لتطبيقات TCP؛ يمكننا إضافة المنفذ 80 إلى السلسلة، مباشرةً بعد الاستثناء الخاص بمنفذ SSH:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">/etc/iptables/rules.v4

*filter
. . .

# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 80 -j ACCEPT

. . .</pre><p>سيبدأ خادوم الويب اتصالًا مع خادوم قواعد البيانات؛ ليست الاتصالات الشبكية الخارجة من خادومنا مقيدةً في جدارنا الناري ويُسمَح للاتصالات الواردة المرتبطة مع اتصالات مُنشَأة مسبقًا، لذلك لن نحتاج إلى فتح أيّة منافذ إضافية في هذا الخادوم للسماح بهذا الاتصال.</p><p>احفظ وأغلق الملف عندما تنتهي من تعديله، يجب أن يملك خادوم الويب الآن سياسة جدارٍ ناريٍ تسمح بمرور البيانات الشرعية وتحجب في الوقت نفسه أي شيءٍ آخر.</p><p>اختبر ملف القواعد للكشف عن الأخطاء البنيوية (syntax errors):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables-restore -t &lt; /etc/iptables/rules.v4</pre><p>إذا لم تظهر أيّة أخطاء، فأعد تحميل الجدار الناري لتطبيق مجموعة القواعد الجديدة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service iptables-persistent reload</pre><h2>تعديل قواعد الجدار الناري لخادوم قواعد البيانات</h2><p>يجب علينا السماح بالوصول إلى المنفذ <code>3306</code> على عنوان IP الخاص بخادوم قواعد البيانات، الذي هو <code>192.0.2.30</code>، يمكننا وضع قيود على الوصول لهذا العنوان تحديدًا، أو يمكننا وضع القيود للبيانات القادمة إلى البطاقة الشبكية المرتبطة مع هذا العنوان.</p><p>لمعرفة البطاقة الشبكية المرتبطة مع هذا العنوان، فنفِّذ الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">ip -4 addr show scope global</pre><p>الناتج:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 203.0.113.5/24 brd 104.236.113.255 scope global eth0
   valid_lft forever preferred_lft forever
3: eth1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.0.2.30/24 brd 192.0.2.255 scope global eth1
   valid_lft forever preferred_lft forever</pre><p>ما سبق يظهر أنّ البطاقة <code>eth1</code> هي البطاقة الشبكيّة المرتبطة مع ذاك العنوان.</p><p>ومن ثم علينا أن نعدِّل قواعد الجدار الناري في خادوم قواعد البيانات. افتح ملف القواعد بامتيازات الجذر (عبر <code>sudo</code>) في خادوم قواعد البيانات:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo nano /etc/iptables/rules.v4</pre><p>مرةً أخرى، سنضيف قاعدةً إلى سلسلة <code>TCP</code> لتشكيل استثناء للاتصال بين خادومَي الويب وقواعد البيانات.</p><p>إذا أردت تقييد الوصول بناءً على العنوان، فيمكنك إضافة قاعدة مثل هذه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">/etc/iptables/rules.v4

 *filter
. . .

# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -d 192.0.2.30 -j ACCEPT

. . .</pre><p>إذا كنت تفضِّل أن تسمح بالاستثناء بناءً على البطاقة الشبكية التي تستضيف العنوان، فيمكنك إضافة قاعدة شبيهة بالقاعدة السابقة بدلًا منها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">/etc/iptables/rules.v4

*filter
. . .

# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -i eth1 -j ACCEPT

. . .</pre><p>احفظ وأغلق الملف عندما تنتهي من تعديله.</p><p>اختبر ملف القواعد للكشف عن الأخطاء البنيوية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables-restore -t &lt; /etc/iptables/rules.v4</pre><p>عندما تكون جاهزًا، فأعد تحميل قواعد الجدار الناري:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service iptables-persistent reload</pre><p>يجب أن يكون كلا الخادومَين محميًا الآن دون تقييد تدفق البيانات بينهما.</p><h2>الخلاصة</h2><p>يجب أن يكون إعداد جدارٍ ناريٍ سليم جزءًا من خطة نشر التطبيق؛ وعلى الرغم من أننا شرحنا هذا الضبط مستخدمين خادومَين يشغِّلان Nginx وMySQL لكي تعمل نسخة من وردبريس، لكن التقنيات المشروحة في هذا الدرس قابلةٌ للتطبيق بغض النظر عن الخدمات المُشغَّلة.</p><p><span style="line-height: 1.6;">ترجمة -وبتصرف- للمقال: </span><a rel="external nofollow" style="line-height: 1.6;" href="https://www.digitalocean.com/community/tutorials/how-to-set-up-an-iptables-firewall-to-protect-traffic-between-your-servers">How To Set Up an Iptables Firewall to Protect Traffic Between your Servers</a><span style="line-height: 1.6;"> لصاحبه: Justin Ellingwood.</span></p>
]]></description><guid isPermaLink="false">118</guid><pubDate>Sun, 11 Oct 2015 21:02:59 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; &#x627;&#x644;&#x62C;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x646;&#x627;&#x631;&#x64A; &#x648;&#x643;&#x64A;&#x641; &#x64A;&#x639;&#x645;&#x644;&#x61F;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%85%D8%A7-%D9%87%D9%88-%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D9%88%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84%D8%9F-r114/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/firewall.png.803952051a5b6dc7fc4034c2ea12ef86.png" /></p>
<p dir="rtl">
	الجدار الناري هو نظامٌ يوفِّر حمايةً للشبكة عبر ترشيح البيانات المُرسَلة والمُستقبَلة عبر الشبكة بناءً على قواعد حدّدها المستخدم. عمومًا، الهدف من الجدار الناري هو تقليل أو إزالة وجود الاتصالات الشبكية غير المرغوب فيها والسماح في الوقت نفسه للاتصالات «الشرعية» أن تُنقَل بحريّة؛ تُوفِّر الجدر النارية طبقةً أساسيةً من الحماية التي -عندما تُدمَج مع غيرها- تمنع المهاجمين من الوصول إلى خادومك بطرقٍ خبيثة.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/firewall.png.e9a2ea28e8591e30077f242c08ede202.png" data-fileid="5581" data-fileext="png" rel=""><img alt="firewall.thumb.png.71fcfd3c64d4be7b0f70e" class="ipsImage ipsImage_thumbnailed" data-fileid="5581" src="https://academy.hsoub.com/uploads/monthly_2015_10/firewall.thumb.png.71fcfd3c64d4be7b0f70e55d6fc31254.png"></a>
</p>

<p dir="rtl">
	يناقش هذا الدّرس كيف تعمل الجدر النارية، مع التركيز على برمجيات الجدر النارية «ذات الحالة» (stateful)، مثل iptable و FirewallD، لأنها تتعلق بالخواديم السحابية؛ سنبدأ بشرح موجز عن رزم TCP الشبكية والأنواع المختلفة للجدر النارية، ثم سنناقش تنوع المواضيع التي تتعلق بالجدر النارية ذات الحالة؛ في النهاية، سنوفر روابط لمقالاتٍ أخرى ستساعدك في إعداد جدار ناري على خادومك.
</p>

<h2 dir="rtl">
	رزم TCP الشبكية
</h2>

<p dir="rtl">
	قبل نقاش مختلف أنواع الجدر النارية، لنأخذ نظرةً سريعةً على شكل بيانات التراسل الشبكي لبروتوكول التحكم في النقل (Transport Control Protocol اختصارًا TCP).
</p>

<p dir="rtl">
	تنتقل بيانات TCP الشبكية عبر الشبكة في «رزم» (packets)، التي تمثِّل حاويات تتألف من ترويسة الرزمة (packet header) –التي تحتوي على معلومات التحكم مثل عناوين المصدر والوجهة، ومعلومات تسلسل الرزم– والبيانات (التي تعرف أيضًا بالمصطلح «الحمولة» [payload])؛ وبينما تساعد بيانات التحكم في كل رزمة على التأكد من أن البيانات المرتبطة معها ستصل وصولًا صحيحًا، لكن العناصر التي تحتويها تُوفِّر للجدر النارية طرقًا مختلفة لمطابقة الرزم الشبكية على قواعد الجدار الناري.
</p>

<p dir="rtl">
	من المهم الملاحظة أنه من الضروري لاستقبال صحيح لرزم TCP قادمة أن يُرسِل المُستقبِل رزمًا تحتوي على إشعار بالاستلام إلى المُرسِل؛ يمكن أن يستخدم دمج معلومات التحكم في الرزم المُستقبَلة والمُرسَلة لتحديد حالة الاتصال (مثلًا، جديد [new]، مُنشَأ [established]، متعلق [related]) بين المُرسِل والمُستقبِل.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة علوم الحاسوب
		</p>

		<p class="banner-subtitle">
			دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/computer-science/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة علوم الحاسوب" src="https://academy.hsoub.com/learn/assets/images/courses/computer-science.png">
	</div>
</div>

<h2 dir="rtl">
	أنواع الجدر النارية
</h2>

<p dir="rtl">
	لنناقش بسرعة الأنواع الثلاثة الأساسية للجدر النارية للشبكة: ترشيح الرزم (packet filtering) أو عديمة الحالة [stateless])، ذات الحالة (stateful)، وطبقة التطبيقات (application layer).
</p>

<ul dir="rtl">
	<li>
		<strong>ترشيح الرزم</strong>، أو الجدر عديمة الحالة، تعمل عبر تفصّح كل الرزم الشبكية على حدة؛ وبالتالي، ستكون غير مدركة لحالة الاتصال ويمكنها فقط أن تسمح أو تمنع مرور الرزم بناءً على ترويسات كل رزمة بشكل منفرد.
	</li>
	<li>
		<strong>الجدر ذات الحالة</strong> قادرة على تحديد حالة الاتصال للرزم، مما يجعل تلك الجدر أكثر مرونةً من الجدر عديمة الحالة. إنها تعمل عبر جمع الرزم الشبكية المترابطة إلى أن تستطيع تحديد حالة الاتصال قبل أن تطبَّق أيّة قواعد للجدار الناري على بيانات التراسل الشبكي.
	</li>
	<li>
		<strong>جدر التطبيقات</strong> (Application firewalls) تذهب خطوةً إضافيةً إلى الأمام عبر تحليل البيانات التي قد أُرسِلَت، مما يسمح بمطابقة بيانات التراسل الشبكي على قواعد الجدار الناري التي تكون مخصصة لخدمات أو تطبيقات معينة. تسمى هذه الجدر أيضًا باسم «الجدر النارية الوسيطة» (proxy-based firewalls).
	</li>
</ul>

<p dir="rtl">
	بالإضافة إلى برمجية الجدار الناري، المتوفرة في جميع أنظمة التشغيل الحديثة، يمكن توفير وظيفة الجدار الناري عبر أجهزة عتادية، مثل الموجهات (routers) أو أجهزة جدر نارية خاصة. مرةً أخرى، سنركِّز في نقاشنا على الجدر النارية ذات الحالة التي تعمل على الخواديم التي عليها حمايتها.
</p>

<h2 dir="rtl">
	قواعد الجدار الناري
</h2>

<p dir="rtl">
	كما ذُكِر في الأعلى، البيانات الشبكية التي تعبر جدارًا ناريًا ستُطابَق على قواعدٍ لتحديد إذا كان يُسمَح لها بالمرور أم لا؛ طريقة سهلة لشرح كيف تبدو قواعد الجدار الناري هي عرض بعض الأمثلة، لنفعل ذلك الآن.
</p>

<p dir="rtl">
	لنفترض أن لديك خادومًا بهذه القائمة من قواعد الجدار الناري التي تنطبق على البيانات القادمة:
</p>

<ol dir="rtl">
	<li>
		السماح للبيانات الشبكية القادمة من اتصالات جديدة أو مُنشَأة مسبقًا إلى البطاقة الشبكية العامة على المنفذين 80 و 443 (بيانات HTTP و HTTPS للويب).
	</li>
	<li>
		تجاهل البيانات القادمة من عناوين IP للموظفين غير التقنيين في مكتبك إلى المنفذ 22 (خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>).
	</li>
	<li>
		السماح للبيانات الشبكية القادمة من اتصالات جديدة أو مُنشَأة مسبقًا من مجال عناوين IP لمكتبك إلى البطاقة الشبكية الخاصة على المنفذ 22 (خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>).
	</li>
</ol>

<p dir="rtl">
	الحظ أنَّ أول كلمة في كل مثال من الأمثلة الثلاثة السابقة هي إما كلمة «السماح» (accept) أو «رفض» (reject) أو «تجاهل» (drop). هذا يُحدِّد ما سيفعله الجدار الناري في حال طابقت البيانات الشبكية تلك القاعدة. «السماح» تعني أنه يمكن للبيانات الشبكية المرور، و«الرفض» تعني منع مرور البيانات الشبكية ولكن إرسال خطأ «unreachable»، بينما «التجاهل» تعني منع مرور البيانات الشبكية وعدم إرسال رد؛ يحتوي ما تبقى من كل قاعدة على الشرط الذي يجب أن تُطابَق عليه كل رزمة شبكية.
</p>

<p dir="rtl">
	وكما يبدو، فإن البيانات الشبكية ستُطابَق على قائمة بقواعد الجدار الناري بتسلسل (chain) من أول قاعدة إلى آخر قاعدة. وخصوصًا عندما تُطابَق قاعدة، فسينفَّذ الحدث المُطابِق لها على البيانات الشبكية؛ في مثالنا السابق، إذا حاول محاسب في المكتب إنشاء اتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> إلى الخادوم، فسيُرفَض اتصاله بناءً على القاعدة رقم 2، حتى قبل التحقق من القاعدة رقم 3؛ لكن مديرًا للنظام سيتمكَّن من إنشاء الاتصال لأنه سيُطابِق القاعدة رقم 3 فقط.
</p>

<h2 dir="rtl">
	السياسة الافتراضية (Default Policy)
</h2>

<p dir="rtl">
	من الطبيعي لسلسلة من قواعد الجدار الناري ألا تغطي بدقة كل حالة ممكنة؛ فلهذا السبب، يجب تحديد سياسة افتراضية لسلاسل قواعد الجدار الناري، التي تحتوي على ما سيُفعَل بالبيانات الشبكية فقط (قبول، أو رفض، أو تجاهل).
</p>

<p dir="rtl">
	افترض أننا ضبطنا السياسة الافتراضية للمثال السابق إلى «تجاهل»؛ فإذا حاول حاسوب خارج مكتبك إنشاء اتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> إلى خادومك، فسيتم تجاهل البيانات الشبكية التي أرسلها لأنها لا تطابق أيّ من القواعد السابقة.
</p>

<p dir="rtl">
	أما لو ضُبِطَت السياسة الافتراضية إلى «السماح»، فإن أي شخص –ما عدا موظفي المكتب غير التقنيين– سيتمكن من إنشاء اتصال لأي خدمة مفتوحة على خادومك؛ هذا مثالٌ عن أن جدارًا ناريًا مضبوطٌ ضبطًا سيئًا سيمنع جزءًا من الموظفين فقط.
</p>

<h2 dir="rtl">
	البيانات الشبكية الداخلة والخارجة
</h2>

<p dir="rtl">
	لمّا كانت تُفصَل البيانات الشبكية –من وجهة نظر الخادوم– إلى بيانات داخلة أو خارجة، فإن الجدار الناري يبقي مجموعةً منفصلةً من القواعد لكل حالة؛ البيانات التي أصلها من مكانٍ آخر –أي البيانات الداخلة– تُعامَل معاملةً مختلفةً عن البيانات الخارجة من الخادوم؛ من الطبيعي أن يسمح الخادوم بأغلبية البيانات الخارجة لأن الخادوم عادةً «يثق بنفسه». ومع ذلك، يمكن استخدام مجموعة قواعد للبيانات الخارجة لمنع الاتصالات غير المرغوبة في حال أُخترِق الخادوم من مهاجم أو عبر ملف تنفيذي خبيث.
</p>

<p dir="rtl">
	لكي نعظِّم الاستفادة الأمنية من الجدار الناري، فيجب عليك تحديد جميع الطرق التي تريد للأنظمة الأخرى أن تتعامل مع خادومك فيها؛ وذلك بإنشاء قواعد تسمع لتلك الحالات بدقة، ثم تتجاهل بقية البيانات الشبكية. أبقِ في بالك أنَّ قواعد البيانات الخارجة يجب أن تكون صحيحة للسماح للخادوم بإرسال إشعارات استلام لأي اتصالات داخلة مسموحٌ لها؛ تذكر أيضًا أنه ولما كان على الخادوم أن يبدأ اتصالات شبكية خاصة به لمختلف الأسباب (مثل تنزيل التحديثات، أو الاتصال إلى قاعدة بيانات)، فمن الضروري تضمين تلك الحالات في مجموعة القواعد للبيانات الخارجة.
</p>

<h2 dir="rtl">
	كتابة قواعد البيانات الخارجة
</h2>

<p dir="rtl">
	افترض أن مثالنا عن الجدار الناري مضبوط لتجاهل البيانات الشبكية الخارجة افتراضيًا، هذا يعني أنَّ قواعد السماح للبيانات الداخلة ستكون عديمة الفائدة دون قواعد البيانات الشبكية الخارجة المُكمِّلة لها.
</p>

<p dir="rtl">
	لملائمة المثال عن قواعد البيانات الداخلة في الجدار الناري (القاعدتين 1 و 3)، من قسم «قواعد الجدار الناري» السابق، وللسماح بالاتصالات الملائمة بناءً على هذه العناوين والمنافذ؛ فعلينا استخدام هذه القواعد للاتصالات الخارجة:
</p>

<ol dir="rtl">
	<li>
		السماح بالبيانات الشبكية الخارجة المُنشَأة على البطاقة الشبكية العامة على المنفذ 80 و 443 (HTTP و HTTPS).
	</li>
	<li>
		السماح بالبيانات الشبكية الخارجة المُنشَأة على البطاقة الشبكية الخاصة على المنفذ 22 (<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>).
	</li>
</ol>

<p dir="rtl">
	الحظ أننا لم نحتج إلى كتابة قاعدة محددة للبيانات القادمة التي أُهمِلَت (القاعدة رقم 2) لأن الخادوم لا يحتاج إلى إنشاء أو إرسال إشعار إلى ذاك الاتصال.
</p>

<h2 dir="rtl">
	برمجيات وأدوات الجدار الناري
</h2>

<p dir="rtl">
	بعد أن تعلّمنا كيف تعمل الجدر النارية، فلنلقي نظرة على حزم برمجية شائعة تساعدنا على ضبط جدار ناري فعّال؛ وعلى الرغم من أنَّ هنالك العديد من الحزم المتعلقة بالجدر النارية، إلا أنَّ هذه هي أكثرها فعاليةً وشيوعًا.
</p>

<h3 dir="rtl">
	Iptables
</h3>

<p dir="rtl">
	إن <strong>Iptables</strong> هو الجدار الناري القياسي الموجود في أغلبية توزيعات لينكس افتراضيًا (بديل عصري له يسمى nftables بدأ باستبداله)؛ هو في الواقع واجهة أمامية (front-end) لنظام netfilter الخاص بالنواة الذي يمكنه تعديل الاتصالات الشبكية في لينُكس؛ حيث يعمل بمطابقة كل رزمة شبكية تمرّ عبر بطاقة شبكية على مجموعة من القواعد لتحديد ما الذي يجب فعله.
</p>

<p dir="rtl">
	لتعلم المزيد من المعلومات حول استخدام iptables كجدار ناري، رجاءً راجع هذه الروابط:
</p>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1%D9%8D-%D9%86%D8%A7%D8%B1%D9%8A%D9%91-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D8%B9%D9%84%D9%89-ubuntu-1404-r38/" rel="">كيفية إعداد جدار ناري باستخدام iptables على Ubuntu 14.04</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%87%D9%85-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%B7%D8%B1%D9%82-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-r90/" rel="">فهم إعدادات "الطرق على المنافذ" على أوبنتو باستخدام IPTables</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%B7%D8%B1%D9%82-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-r91/" rel="">كيف تضبط "الطرق على المنافذ" على أوبنتو باستخدام IPTables</a>
	</li>
</ul>

<h3 dir="rtl">
	UFW
</h3>

<p dir="rtl">
	إن <strong>UFW</strong>، الذي يرمز إلى «Uncomplicated Firwall» (الجدار الناري غير المعقّد)، هو واجهة إلى iptables مجهزٌ لتبسيط عملية ضبط جدار ناري.
</p>

<h3 dir="rtl">
	FirewallD
</h3>

<p dir="rtl">
	<strong>FirewallD</strong> هو حلّ كامل لضبط الجدار الناري متوفرٌ افتراضيًا على خواديم CentOS 7؛ يجدر بالذكر أن FirewallD يستخدم iptables لضبط netfilter.
</p>

<h3 dir="rtl">
	Fail2ban
</h3>

<p dir="rtl">
	إن <strong>Fail2ban</strong> هو برمجية لمنع التطفل يمكنها ضبط جدارك الناري تلقائيًا لحجب محاولات تسجيل الدخول باستخدام «القوة القاسية» (brute force) وهجمات الحرمان من الخدمة المُوزَّعة (DDoS).
</p>

<p dir="rtl">
	للمزيد من المعلومات حول Fail2ban، راجع هذه الروابط:
</p>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-fail2ban-%D8%B9%D9%84%D9%89-%D8%B2%D9%8A%D8%A7%D8%AF%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r88/" rel="">كيف يعمل Fail2ban على زيادة حماية خادومك</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-ssh-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-fail2ban-%D8%B9%D9%84%D9%89-ubuntu-r113/" rel="">كيفية حماية <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> باستخدام Fail2Ban على Ubuntu</a>
	</li>
	<li>
		 <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D8%A7%D9%84%D8%AC-fail2ban-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%B6%D8%A8%D8%B7-%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%A7%D9%84%D8%AD%D8%B8%D8%B1-r89/" rel="">كيف يعالج Fail2ban ملفات الضبط لتنفيذ الحظر</a>
	</li>
</ul>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	أصبحت تعرف الآن كيف تعمل الجدر النارية، يجب عليك أخذ إنشاء جدار ناري بعين الاعتبار لتحسين مستوى حماية خادومك بالاستعانة بأحد الدروس سابقة الذكر.ش
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/what-is-a-firewall-and-how-does-it-work" rel="external nofollow">What is a Firewall and How Does It Work?</a>‎ لصاحبه Mitchell Anicas.
</p>

<p dir="rtl">
	حقوق الصورة البارزة: <a href="http://www.freepik.com/free-vector/security-lock-vector-image_715014.htm" rel="external nofollow">Designed by Freepik</a>.
</p>
]]></description><guid isPermaLink="false">114</guid><pubDate>Tue, 06 Oct 2015 21:07:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62D;&#x645;&#x627;&#x64A;&#x629; SSH &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Fail2Ban &#x639;&#x644;&#x649; Ubuntu</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-ssh-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-fail2ban-%D8%B9%D9%84%D9%89-ubuntu-r113/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/fail2ban-ssh.png.96613c2ea046f813705bd496c2fe6923.png" /></p>

<p dir="rtl">بالرّغم من أنّ الاتصال إلى الخادوم عبر SSH آمن جدًّا، فإنّ SSH daemon (وهو عمليّة تعمل في خلفيّة النّظام بشكل دائم) بحدّ ذاتها هي خدمة يجب تعريضها إلى الإنترنت لتعمل بشكل صحيح، ويأتي هذا مع بعض المخاطر الكامنة ويخلق ناقلات للهجوم لأي مهاجمين مُحتَملين.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_10/fail2ban-ssh.png.ff8c2b7b21525818dee90abd5885a4ea.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5474" src="https://academy.hsoub.com/uploads/monthly_2015_10/fail2ban-ssh.thumb.png.29add589b5a9862c5c410b95c4b69d1d.png" class="ipsImage ipsImage_thumbnailed" alt="fail2ban-ssh.thumb.png.29add589b5a9862c5"></a></p><p dir="rtl">إنّ أي خدمة مُعرّضة إلى الشّبكة هي هدف مُحتمل بهذه الطريقة، فإذا ألقينا انتباهنا إلى سجلّات التطبيق لهذه الخدمات سنجد محاولات مُنظّمة ومتكرّرة لتسجيل الدخول والتي تُمثّل هجمات بالقوّة القاسية Brute force attacks عن طريق مستخدمين أو روبوتات bots على حدٍّ سواء.</p><p dir="rtl">يُمكن الحد من هذه المشكلة عن طريق خدمة تُدعى <strong>fail2ban</strong> والتي تقوم بإنشاء قواعد تستطيع تبديل إعدادات جدار حماية iptables بناءً على عدد معرّف مُسبقًا من محاولات تسجيل الدخول غير النّاجحة، يسمح هذا لخادومنا بالاستجابة لمحاولات النّفاذ غير الشّرعية من دون أي تدخّل منّا.</p><p dir="rtl">سنغطّي في هذا الدّرس كيفيّة تثبيت واستخدام fail2ban على خادوم Ubuntu.</p><h2 dir="rtl">تثبيت Fail2Ban على Ubuntu</h2><p dir="rtl">إنّ عمليّة التثبيت لهذه الأداة بسيطة لأنّ فريق تحزيم Ubuntu يُحافِظ على الحِزمة Package في المستودعات الافتراضيّة default repositories.</p><p dir="rtl">نحتاج في البداية لتحديث دليل الحِزَم المحلّي local package index لدينا، وبعدها نستطيع استخدام <strong>apt</strong> لتنزيل وتثبيت الحِزمة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update

sudo apt-get install fail2ban</pre><p dir="rtl">إنّ عملية التثبيت بديهيّة كما نرى، نستطيع الآن البدء بإعداد الأداة لاستخدامنا الشّخصي.</p><h2 dir="rtl">إعداد Fail2Ban مع إعدادات الخدمة الخاصة بنا</h2><p dir="rtl">تحتفظ خدمة fail2ban بملفّات إعداداتها في الدّليل <span style="font-family:courier new,courier,monospace;">etc/fail2ban/</span>، يوجد ملف مع إعدادات افتراضيّة يُدعى <span style="font-family:courier new,courier,monospace;">jail.conf</span>.</p><p dir="rtl">ولأنّه يُمكن أن يتم تعديل هذا الملف عن طريق ترقية الحِزَم لذلك لا ينبغي علينا تحرير هذا الملف في مكانه، بل من الأفضل أن نقوم بنسخه حتى نستطيع القيام بتغييراتنا بأمان.</p><p dir="rtl">نحتاج لنسخه إلى ملف يُدعى <span style="font-family:courier new,courier,monospace;">jail.local</span> حتى يستطيع fail2ban إيجاده:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</pre><p dir="rtl">حالما يتم نسخ الملف بإمكاننا فتحه للتحرير لنرى كيف يعمل كل شيء:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/fail2ban/jail.local</pre><p dir="rtl">يوجد في هذا الملف القليل من الإعدادات التي قد نرغب بضبطها، يتم تطبيق هذه الإعدادات الموجودة تحت قسم<strong> [DEFAULT] </strong>على جميع الخدمات المُمَكَّنة enabled من أجل fail2ban الذي لا يتم تجاوزه في القسم الخاص بالخدمة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ignoreip = 127.0.0.1/8</pre><p dir="rtl">نستطيع ضبط مصدر العناوين التي يتجاهلها fail2ban عن طريق إضافة قيمة إلى المُعامِل parameter <strong>ignoreip</strong>.</p><p dir="rtl">يتم ضبطه افتراضيًّا بأن لا يقوم بمنع أي نقل للبيانات traffic قادم من الجهاز المحلّي، نستطيع إضافة المزيد من العناوين التي نريد تجاهلها عن طريق إلحاقها بنهاية هذا المُعامِل مع الفصل بينها بفراغ Space.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">bantime = 600</pre><p dir="rtl">يقوم المُعامِل <strong>bantime</strong> بتعيين المُدّة الزمنيّة التي سيتم خلالها حظر العميل عندما يفشل بالاستيثاق authenticate بشكلٍ صحيح، يتم قياس هذا المُعامِل بالثّواني، وقيمته الافتراضيّة هي 600 ثانية أي 10 دقائق.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">findtime = 600

maxretry = 3</pre><p dir="rtl">ومن المُعامِلات التي نرغب أن نلقي لها انتباهًا نجد المُعامِلَين <strong>findtime</strong> و <strong>maxretry</strong>، وهما يعملان معًا لتأسيس الشّروط التي نستطيع بناءً عليها اعتبار عميل ما مستخدمًا غير قانونيٍ يجب علينا حظره.</p><p dir="rtl">يقوم المُتغيّر maxretry بتعيين عدد المحاولات التي يجب خلالها أن يقوم العميل بالاستيثاق خلال فترة زمنيّة مُعرّفة بـ findtime وذلك قبل أن يتمّ حظره، تقوم الإعدادات الافتراضيّة لخدمة fail2ban بحظر العميل الذي يقوم بثلاث محاولات غير ناجحة لتسجيل الدخول خلال فترة 10 دقائق.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">destemail = root@localhost

sendername = Fail2Ban

mta = sendmail</pre><p dir="rtl">ومن بعض الإعدادات الأخرى التي قد نرغب بتعديلها نجد الإعدادات <strong>destemail</strong>، <strong>sendername</strong>، و <strong>mta</strong> إن أردنا ضبط تنبيهات alerts البريد الإلكتروني، يقوم المُعامِل destemail بتعيين عنوان البريد الإلكتروني الذي سيستقبل رسائل الحظر، يقوم المُعامِل sendername بتعيين قيمة الحقل From في البريد الإلكتروني، يُحدّد المُعامِل mta خدمة البريد الإلكتروني التي سيتم استخدامها لإرسال البريد.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">action = $(action_)s</pre><p dir="rtl">يضبط هذا المُعامل الإجراءات التي يتّخذها fail2ban عندما يريد إقامة حظر، إنّ القيمة<span style="font-family:courier new,courier,monospace;"> _action</span> مُعرَّفة في الملف قبل هذا المُعامِل بقليل، الإجراء الافتراضي هو ببساطة أن يتم ضبط الجّدار النّاري firewall لكي يرفض نقل البيانات من المُضيف Host المُهاجِم حتى تنتهي مُدّة الحظر.</p><p dir="rtl">إن أردنا ضبط تنبيهات البريد الإلكتروني نستطيع تغيير القيمة من<span style="font-family:courier new,courier,monospace;"> _action</span> إلى<span style="font-family:courier new,courier,monospace;"> action_mw</span>، وإن كُنّا نرغب أن يقوم البريد الإلكتروني بتضمين سطور السّجلات المُتعلّقة بذلك نستطيع تغييرها إلى <span style="font-family:courier new,courier,monospace;">action_mwl</span>، يجب أن نتأكّد من أنّه يتم ضبط إعدادات البريد المُناسبة إن اخترنا استخدام تنبيهات البريد.</p><h3 dir="rtl">1. إعدادات Jail الفردية</h3><p dir="rtl">لقد وصلنا أخيرًا إلى الجزء من ملف الإعدادات الذي يتعامل مع الخدمات الفرديّة، والتي يتم تحديدها في القسم headers مثل<strong> [SSH]</strong>.</p><p dir="rtl">نستطيع تمكين كل واحد من هذه الأقسام عن طريق تعديل أو إضافة السّطر enabled وتعيينه إلى true:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">enabled = true</pre><p dir="rtl">نجد بشكل افتراضي أنّ خدمة SSH مُمكّنة وباقي الخدمات مُعطّلة.</p><p dir="rtl">تعمل هذه الأقسام عن طريق استخدام القيم الافتراضيّة التي عرّفناها مُسبقًا، وإن أردنا تجاوز override أي قيم نستطيع فعل ذلك في قسم الخدمات، أمّا إن أردنا استخدام القيم الافتراضيّة فلا داعي لإضافة أي شيء.</p><p dir="rtl">ومن الإعدادات الأخرى التي يُمكن تعيينها هنا هي filter والذي يستخدم ليحدّد إذا ما كان السطر في ملف السّجل يشير إلى استيثاق فاشل، وlogpath الذي يُخبِر fail2ban أين توجد السّجلات لتلك الخدمة بالتحديد.</p><p dir="rtl">إنّ قيمة filter هي في الواقع إشارة reference إلى ملف يتوضّع في الدّليل<span style="font-family:courier new,courier,monospace;"> etc/fail2ban/filter.d/</span> مع إزالة لاحقته <span style="font-family:courier new,courier,monospace;">conf.</span>، يحتوي هذا الملف على التّعابير النمطيّة regular expressions التي تُحدّد إذا ما كان السّطر في ملف السّجل سيّئًا، لن نقوم بالتّحدث بالتفصيل عن هذا الملف في هذا الدّرس، لأنّه مُعقّد إلى حدٍ ما، والإعدادات المُعرّفة مُسبقًا تتوافق مع السطور المُلائمة لها بشكل جيّد.</p><p dir="rtl">بإمكاننا على أيّة حال أن نرى أنواع المُرشّحات filters المتوفرة من خلال النّظر إلى هذا الدّليل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ls /etc/fail2ban/filter.d</pre><p dir="rtl">عندما نجد ملفًّا مرتبطًا بالخدمة التي نستخدمها ينبغي أن نفتحه باستخدام مُحرّر نصوص.</p><p dir="rtl">مُعظم هذه الملفّات تحتوي على تعليقات للشرح بشكل جيّد ويجب أن نكون قادرين على الأقل أن نعرف ما هو نوع الشّروط التي تم تصميم الـ script من أجل الحماية ضدّها، تملك أغلب هذه المُرشّحات أقسام (مُعطّلة) مناسبة في ملف <span style="font-family:courier new,courier,monospace;">jail.local </span>والتي نستطيع تمكينها عند الرغبة بذلك.</p><p dir="rtl">فلنفترض على سبيل المثال أنّنا نقوم بتخديم موقع باستخدام nginx وأدركنا أنّ قسم منه محمي بكلمة مرور يتعرّض لمحاولات تسجيل دخول، نستطيع إخبار fail2ban أن يستخدم الملف <span style="font-family:courier new,courier,monospace;">nginx-http-auth.conf</span> لكي يفحص هذا الشّرط من خلال الملف <span style="font-family:courier new,courier,monospace;">var/log/nginx/error.log/</span>.</p><p dir="rtl">هذا الشّرط مُعَد مُسبقًا في الواقع ضمن قسم يُدعى<strong> [nginx-http-auth]</strong> في الملف <span style="font-family:courier new,courier,monospace;">etc/fail2ban/jail.local/</span>، نحتاج فقط إلى قلب المُعامِل enabled إلى true لحماية الخدمة الخاصّة بنا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[nginx-http-auth]

enabled = true

filter = nginx-http-auth

port = http,https

logpath = /var/log/nginx/error.log</pre><p dir="rtl">إن قمنا بتفعيلها نحتاج إلى إعادة تشغيل خدمة fail2ban للتأكّد من أنّ قواعدنا مبنيّة بشكل صحيح.</p><h2 dir="rtl">وضع كل ذلك معا</h2><p dir="rtl">الآن وقد فهمنا الفكرة الأساسيّة من وراء fail2ban، فلنقم بتشغيل إعداد أساسي.</p><p dir="rtl">سنقوم بإعداد سياسة حظر تلقائي من أجل SSH وNginx تمامًا كما وصفنا سابقًا، نريد من fail2ban أن يقوم بإرسال بريد إلكتروني لنا عندما يتم حظر عنوان IP.</p><p dir="rtl">فلنقم في البداية بتثبيت جميع البرمجيّات المتعلقّة بذلك.</p><p dir="rtl">إن كُنّا لا نملك nginx يجب علينا تثبيته، لأنّنا سنقوم بمراقبة سجلّاته، سنحتاج أيضًا sendmail لكي يرسل التّنبيهات إلينا، سنقوم بتثبيت iptables-persistent لكي يسمح للخادوم بإعداد قواعد الجّدار النّاري تلقائيًّا عند الإقلاع boot، نستطيع الحصول على كل هذا من مستودعات Ubuntu الافتراضيّة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update

sudo apt-get install nginx sendmail iptables-persistent
</pre><h3 dir="rtl">1. إنشاء جدار ناري أساسي</h3><p dir="rtl">ينبغي علينا بعد الانتهاء من كل هذا إنشاء جدار ناري افتراضي، تستطيع تعلّم كيفيّة إعداد <strong>iptables</strong> للجدار الناري على Ubuntu من هنا، سنقوم في هذا الدّرس فقط بإنشاء جدار ناري أساسي.</p><p dir="rtl">سنخبر الجّدار النّاري بالسّماح للاتصالات التي تمّ تأسيسها، نقل البيانات traffic الذي يتم توليده من قبل الخادوم نفسه، مقدار نقل البيانات من أجل SSH لدينا، ومنافذ ports خادوم الوِب، وسنقوم باستبعاد أي نقل بيانات آخر، نستطيع إعداد هذا الجّدار النّاري الأساسي عن طريق كتابة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

sudo iptables -A INPUT -j DROP</pre><p dir="rtl">ستقوم هذه الأوامر بتنفيذ السّياسة السّابقة، وبإمكاننا رؤية قواعد الجّدار النّاري الحاليّة عن طريق كتابة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -S

-P INPUT ACCEPT

-P FORWARD ACCEPT

-P OUTPUT ACCEPT

-N fail2ban-ssh

-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh

-A INPUT -i lo -j ACCEPT

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -j DROP

-A fail2ban-ssh -j RETURN</pre><p dir="rtl"><a rel="external nofollow" name="_GoBack"></a> حصلنا هنا على سياستنا الافتراضيّة لكل واحدة من السلاسل لدينا، ومن ثمّ القواعد الخمس التي أنشأناها للتو، إنّ الأسطر التي تحتوي على:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-N fail2ban-ssh </pre><p dir="rtl">و</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh</pre><p dir="rtl">و</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-A fail2ban-ssh -j RETURN </pre><p dir="rtl">هي عبارة عن البُنية الافتراضيّة المُعدّة من قبل fail2ban حيث أنّه يقوم مُسبقًا بتنفيذ سياسات حظر SSH بشكل افتراضي.</p><h3 dir="rtl">2. ضبط إعدادات Fail2ban</h3><p dir="rtl">نحتاج الآن لضبط إعدادات fail2ban باختيار الإعدادات التي نرغب بها، فلنقم بفتح الملف <span style="font-family:courier new,courier,monospace;">jail.local</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/fail2ban/jail.local</pre><p dir="rtl">نستطيع هنا تعيين زمن للحظر أشد طولًا، فلنقم بتغيير الإعداد <strong>bantime</strong> الموجود تحت الترويسة الافتراضيّة بحيث تقوم خدمتنا بحظر العملاء لمدة نصف ساعة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">bantime = 1800</pre><p dir="rtl">نحتاج أيضًا لضبط معلومات تنبيهات البريد الإلكتروني، نقوم في البداية بإيجاد المُعامِل <strong>destemail</strong> ونضع بداخله عنوان البريد الإلكتروني الذي نرغب باستخدامه لجمع هذه الرسائل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">destemail = admin@example.com</pre><p dir="rtl">نستطيع تعيين <strong>sendername</strong> إلى قيمة أخرى إن أردنا ذلك، على الرغم من أنّه من المفيد أن يكون لها قيمة يُمكن تصفيتها بسهولة باستخدام خدمة البريد الإلكتروني الخاصّة بنا، وإلّا امتلأ صندوق الوارد بالتنبيهات إن كانت هناك الكثير من محاولات الاختراق من أماكن متعدّدة.</p><p dir="rtl">بالانتقال للأسفل نحتاج لضبط المُعامِل <strong>action</strong> إلى أحد الإجراءات التي ترسل لنا بريد إلكتروني، الخيارات محصورة بين <span style="font-family:courier new,courier,monospace;">action_mw</span> والذي يُنشِئ الحظر ومن ثمّ يرسل لنا بريدًا إلكترونيًّا يحتوي على تقرير whois حول المُضيف المخالف، أو <span style="font-family:courier new,courier,monospace;">action_mwl</span> والذي يقوم بما سبق ولكن يرسل لنا أيضًا سطور السجل المتعلّقة بذلك.</p><p dir="rtl">سوف نختار <span style="font-family:courier new,courier,monospace;">action_mwl </span>لأنّ سطور السّجلات ستساعدنا على استكشاف الأخطاء وجمع المزيد من المعلومات إن كانت توجد مشاكل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">action = %(action_mwl)s</pre><p dir="rtl">وبالانتقال إلى قسم SSH لدينا، إن أردنا ضبط عدد المحاولات غير الناجحة التي ينبغي أن نسمح بها قبل إنشاء حظر نستطيع تعديل الإدخال <strong>maxretry</strong>، وإن كُنّا نستخدم منفذ غير 22 سنحتاج لضبط المُعامِل port بشكلٍ مُناسِب، وكما قلنا سابقًا فإنّ هذه الخدمة مُمكّنة مُسبقًا لذلك لا حاجة لتعديل ذلك.</p><p dir="rtl">فلنبحث بعد ذلك عن القسم <strong>nginx-http-auth</strong> ونُغيّر المُعامِل enabled ليصبح true:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[nginx-http-auth]


enabled = true

. . .</pre><p dir="rtl">هذا هو كل ما ينبغي علينا فعله في هذا القسم ما لم يكن يعمل خادوم الوِب لدينا على منافذ غير معياريّة أو قمنا بنقل المسار الافتراضي لسجلّات الأخطاء.</p><h3 dir="rtl">3. إعادة تشغيل خدمة Fail2ban</h3><p dir="rtl">بعد الانتهاء مما سبق نقوم بحفظ وإغلاق الملف.</p><p dir="rtl">نقوم الآن ببدء تشغيل أو إعادة تشغيل خدمة fail2ban، من الأفضل أحيانًا إيقاف تشغيل الخدمة بشكلٍ تام ومن ثم تشغيلها مرة أخرى:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service fail2ban stop</pre><p dir="rtl">نستطيع الآن إعادة تشغيلها بكتابة ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service fail2ban start</pre><p dir="rtl">قد تستغرق بضع لحظات لكي يتم ملء جميع قواعد الجّدار النّاري لدينا، على أيّة حال نستطيع بعد ذلك التأكّد من القواعد الجديدة بكتابة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -S



-P INPUT ACCEPT

-P FORWARD ACCEPT

-P OUTPUT ACCEPT

-N fail2ban-nginx-http-auth

-N fail2ban-ssh

-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth

-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh

-A INPUT -i lo -j ACCEPT

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -j DROP

-A fail2ban-nginx-http-auth -j RETURN

-A fail2ban-ssh -j RETURN</pre><p dir="rtl">إن الأسطر التي قامت بإنشائها سياسات fail2ban لدينا هي:</p><ul><li><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-N fail2ban-nginx-http-auth
</pre></li><li><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-N fail2ban-ssh
</pre></li><li><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
</pre></li><li><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
</pre></li><li><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-A fail2ban-nginx-http-auth -j RETURN
</pre></li><li><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-A fail2ban-ssh -j RETURN
</pre></li></ul><p dir="rtl">تقوم هذه الأسطر الآن بتوجيه نقل البيانات إلى سلاسل جديدة وفارغة تقريبًا ومن ثمّ تسمح لنقل البيانات بالتدفق والعودة إلى سلسلة الدّخل INPUT.</p><p dir="rtl">على أيّة حال هذه السلاسل الجديدة هي حيث يتم إضافة قواعد الحظر الجّديدة.</p><h3 dir="rtl">4. اختبار سياسات الحظر</h3><p dir="rtl">نستطيع اختبار القواعد من خادوم آخر -خادوم لا نحتاج له للدخول إلى خادوم fail2ban- عن طريق جعل هذا الخادوم الثاني ينحظر.</p><p dir="rtl">بعد الدخول إلى الخادوم الثاني نقوم بمحاولة الدخول عن طريق SSH إلى خادوم fail2ban، نستطيع على سبيل المثال محاولة الاتصال باستخدام اسم غير موجود:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ssh blah@fail2ban_server_IP</pre><p dir="rtl">فلنقم بإدخال أحرف عشوائيّة في النّافذة التي تطلب منّا كلمة مرور، ومن ثمّ نعيد هذه الخطوة عدّة مرات، سيقوم خادوم fail2ban في نقطة ما بإيقاف الاستجابة مع رسالة تم رفض الإذن Permission denied، وهذا يشير إلى أنه تم حظر الخادوم الثاني من قبل خادوم fail2ban.</p><p dir="rtl">نستطيع على خادوم fail2ban مشاهدة القواعد الجديدة عن طريق التّحقق مرة أخرى من iptables لدينا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -S



-P INPUT ACCEPT

-P FORWARD ACCEPT

-P OUTPUT ACCEPT

-N fail2ban-nginx-http-auth

-N fail2ban-ssh

-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth

-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh

-A INPUT -i lo -j ACCEPT

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -j DROP

-A fail2ban-nginx-http-auth -j RETURN

-A fail2ban-ssh -s 11.111.111.11/32 -j REJECT --reject-with icmp-port-unreachable

-A fail2ban-ssh -j RETURN</pre><p dir="rtl">وكما نرى في السّطر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> -A fail2ban-ssh -s 11.111.111.11/32 -j REJECT --reject-with icmp-port-unreachable</pre><p dir="rtl">نملك الآن قاعدة جديدة في إعداداتنا ترفض نقل البيانات القادمة من عنوان IP خادومنا الثاني عبر منفذ SSH، ينبغي أيضًا أن نكون قد حصلنا على بريد إلكتروني حول هذا الحظر في الحساب الذي قمنا بإعداده.</p><h2 dir="rtl">خاتمة</h2><p dir="rtl">ينبغي أن نكون قادرين الآن على إعداد بعض سياسات الحظر الأساسيّة لخدماتنا، من السّهل جدًّا إعداد Fail2ban وهو طريقة رائعة لحماية أي نوع من الخدمات تستخدم الاستيثاق.</p><p dir="rtl">إن أردت تعلّم المزيد حول كيفيّة عمل fail2ban بإمكانك تفحّص هذا الدّرس التعليمي حول <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-fail2ban-%D8%B9%D9%84%D9%89-%D8%B2%D9%8A%D8%A7%D8%AF%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r88/">كيفيّة عمل قواعد وملفّات fail2ban</a>.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-14-04">How To Protect SSH with Fail2Ban on Ubuntu 14.04</a> لصاحبه Justin Ellingwood.</p><p dir="rtl">حقوق الصورة البارزة: <a href="http://www.freepik.com/free-vector/safety-lock-vector-design_717950.htm" rel="external nofollow">Designed by Freepik</a>.</p>
]]></description><guid isPermaLink="false">113</guid><pubDate>Sun, 04 Oct 2015 10:07:12 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x636;&#x628;&#x637; "&#x627;&#x644;&#x637;&#x631;&#x642; &#x639;&#x644;&#x649; &#x627;&#x644;&#x645;&#x646;&#x627;&#x641;&#x630;" &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; IPTables</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%B7%D8%B1%D9%82-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-r91/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/port-knocking.png.b1deabc5a74dceba16b38c522872fb30.png" /></p>

<p>قدمنا في الجزء الأول من هذا الدليل الخطة التي نعمل على إعدادها من أجل <a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%87%D9%85-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%B7%D9%91%D8%B1%D9%92%D9%82-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-r90/">ضبط آلية للطرق على المنافذ تعتمد حصرا على جدار iptables الناري</a>. نستكمل في هذا الجزء ما بدأناه بتنفذ الآلية المشروحة في الجزء السابق.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/port-knocking.png.471474a0ca1c65a48de9516dcc1f0f17.png"><img data-fileid="3708" class="ipsImage ipsImage_thumbnailed" alt="port-knocking.thumb.png.b25d4b1fc5df78c0" src="https://academy.hsoub.com/uploads/monthly_2015_08/port-knocking.thumb.png.b25d4b1fc5df78c03d5c5e96df81d792.png"></a></p><h2 id="إعداد-إطار-عمل-نظامي-للجدار-الناري">إعداد إطار عمل نظامي للجدار الناري</h2><p>نبدأ بوضع إطار أساسي للاتصالات في الخادوم. ستتولى سلسلة <code>INPUT</code> التعامل مع جميع الاتصالات القادمة. سنزيل جميع قواعد الجدار الناري المطبقة حاليا من أجل بدء الإعداد من الصفر. لكن قبل ذلك يجب أن نتأكد من أن السياسات الافتراضية مضبوطة على <code>ACCEPT</code> للاستمرار في الاتصال الجاري:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F</pre><p>بهذه الطريقة نبدأ مع جدار ناري مفتوح تماما. قبل تقييد الاتصالات ننفذ أوامر إضافة السلاسل الجديدة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -N KNOCKING
sudo iptables -N GATE1
sudo iptables -N GATE2
sudo iptables -N GATE3
sudo iptables -N PASSED</pre><p>نتوفر الآن على ثماني سلاسل. سنستخدمها كلَّها ما عدا سلسلتيْ <code>OUTPUT</code> و<code>FORWARD</code> اللتان لا تعنياننا هنا.</p><p>نبدأ بالتعامل مع الاتصالات التي لا تحتاج للطرق على المنافذ لفتحها، فنضيف قاعدة إلى سلسلة <code>INPUT</code> للسماح للاتصالات الجارية كافةً بالاستمرار:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT</pre><p>وأخرى لقبول جميع الاتصالات من الجهاز المحلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -i lo -j ACCEPT</pre><p>إذا كانت لديك خدمات موجَّهة للعموم، مثل خادوم ويب، فأضف قاعدة على النحو التالي حتى يمكن الاتصال بها:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p protocol --dport port -j ACCEPT</pre><p>مثال لقاعدة تتيح الوصول إلى خادوم الويب:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT</pre><p>أنهينا الآن إعداد قواعد الاتصالات المسموح بها. نمرّر جميع الاتصالات التي لا تنطبق عليها إحدى القواعد السابقة إلى سلسلة <code>KNOCKING</code> من أجل التنفيذ الفعلي لآلية الطرْق:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -j KNOCKING</pre><h2 id="إعداد-البوابة-الأولى">إعداد البوابة الأولى</h2><p>سنُلحِق “البوابات” بعد اكتمال إعدادها بسلسلة <code>KNOCKING</code> لتمرير حركة البيانات عبر الاختبارات المشروحة في الجزء الأول من هذا الدليل. لكن قبل ذلك يجب وضع أساس كل اختبار على انفراد.</p><p>نبدأ بتعريف أول اختبار طرْق.</p><p>عندما يحاول عميل الاتصال فإننا ننظر في المنفذ الذي يرسل إليه الطلب؛ إن كان يوافق المنفذ الأول لدينا في متتالية الطرْق نشير إلى أن العميل تجاوز الاختبار الأول بنجاح؛ وإلا نتجاهل الطلب.</p><p>نضع علامة على العميل عند محاولة الاتصال بالمنفذ الصحيح:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j DROP</pre><p>يؤدي السطر أعلاه مهام عدة؛ يضيف قاعدة جديدة إلى سلسلة <code>GATE1</code>. شروط تنفيذ القاعدة هي أن يكون البروتوكول المستخدَم هو <code>tcp</code> والمنفذ المطلوب هو<code>1111</code>، أي المنفذ اﻷول في سلسلة الطرق. عند تحقق الشروط نستدعي وِحدة <code>recent</code> (باستخدام خيار <code>m-</code>) ونضع علامة <code>AUTH1</code> (باستخدام <code>name AUTH1 --set--</code>). ستُستعمَل هذه العلامة عند اختبار إصابة المنفذ الثاني. أخيرا، وبعد تعيين العلامة، نتجاهل الحزمة لكي لا يعرف العميل مالذي يحدث.</p><p>ثم نتجاهل جميع حزم البيانات الأخرى، لأن أي معلومة تُرسَل إلى هذه السلسلة تبحث فقط عن موافقة أول حزمة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE1 -j DROP
</pre><p>أنجزنا الآن ما يتعلق بالمنفذ الأول من متتالية الطرْق: إما أن توافق الحزمة المنفذ المطلوب أو تُتَجاهَل. إذا وافقت المنفذ توضع عليها علامة <code>AUTH1</code>.</p><h2 id="إعداد-البوابة-الثانية">إعداد البوابة الثانية</h2><p>تُضبط البوابة الثانية بطريقة مشابهة إلا أنها أكثر تعقيدا.</p><p>أول ما يجب الانتباه إليه هو أن قرار توجيه محاولات الاتصال إلى هذه السلسلة سيكون ضمن السلسلة الأم <code>KNOCKING</code>. لن تحتاج سلسلة <code>GATE2</code> إلى التأكد من مطابقة محاولة الاتصال للبوابة الأولى، لأن هذا الاختبار جرى سلفا.</p><p>مع ذلك يجب أن تحذف أي علامات قد تكون وُضعت على العميل قبل البدء في التعامل مع محاولة الاتصال. عدم إزالة العلامات السابقة قد ينتج عنه وضع علامات عدة على عنوان العميل ممّا قد يؤدي إلى نجاح الطرق على المنفذ بمجرد فحص المنافذ ثلاث مرات. طبعا هذا أمر لا نرغب فيه.</p><p>نستخدم وحدة <code>recent</code> مرة أخرى لحذف الاسم (العلامة):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE2 -m recent --name AUTH1 --remove</pre><p>لا تتخذ القاعدة أعلاه أي قرارات أو إعادة توجيه؛ كل ما تفعله هو حذف العلامة الحالية (وهي تلك التي سمحت بتوجيه الاتصال إلى هذه السلسلة) وتوجيه البيانات إلى القاعدة الموالية.</p><p>يصبح العنوان - بعد تجاوز القاعدة الأولى من السلسلة - خاليا من أي علامات. نتحقق من المنفذ الذي يطلبه العنوان ومن مطابقته للمنفذ الثاني في متتالية الطرْق (<code>2222</code>):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j DROP</pre><p>نفس ما فعلناه مع البوابة الأولى. نضع علامة <code>AUTH2</code> للإشارة إلى أن عنوان الطلب تجاوز الاختبار الثاني إذا كان العميل يحاول الاتصال عبر المنفذ المطلوب، ثم نتجاهل الحزمة لكي لا يعرف العميل مالذي نفعله.</p><p>قد تبدو القاعدة التالية غريبة لأول وهلة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE2 -j GATE1</pre><p>قد تظن أن تجاهل الحزمة بعد وضع علامة <code>AUTH2</code> هو - منطقيا - الخطوة التالية. إلا أن فعل ذلك سيجعلنا في وضع حرج أثناء حالة خاصة.</p><p>لو كانت لدينا قاعدة <code>drop all</code> هنا وكانت الحزمة المرسلة في هذه الأثناء توافق المنفذ الأول في سلسلة الطرْق، فلن تسجَّل على أنها بداية لمتتالية الطرق. نفرض على سبيل المثال أن العميل أرسل - عن طريق الخطأ - محاولتي اتصال إلى المنفذ الأول. في هذه الحالة لن يعُدّ الجدار الناري محاولة الاتصال الثانية صحيحة لأنه سيرى المتتالية كما يلي:</p><ul><li>محاولة اتصال عبر المنفذ الأول. سيحسب الجدار الناري أن الاختبار الأول تُجووِز بنجاح.</li><li>محاولة الاتصال عبر المنفذ الأول. فشل في الاختبار الثاني. يُعاد تعيين المتتالية.</li><li>محاولة الاتصال عبر المنفذ الثاني. فشل في الاختبار الأول (يطبَّق الاختبار الأول لأن المتتالية أعيد تعيينها في الخطوة السابقة). يُعاد تعيين المتتالية.</li><li>محاولة الاتصال عبر المنفذ الثالث. فشل في الاختبار الأول (يُطبق الاختبار الأول لأن المتتالية أعيد تعيينها في الخطوة السابقة). يُعاد تعيين المتتالية.</li></ul><p>نجد أن العميل في الافتراض السابق أرسل المتتالية الصحيحة، إلا أن الجدار الناري لم يعتمدها لأنه حصل تشويش لديه في أي قاعدة يجب عليه أن يطبق. يجب إذن على العميل، إذا أخطأ، إرسال طلب وهمي من أجل إعادة تعيين السلسلة، قبل البدء في إرسال المتتالية.</p><p>لتجنب الوقوع في هذه الحالة لن نتجاهل الحزمة بل سنوجّهها - بدلا من ذلك - إلى سلسلة <code>GATE1</code> التي أعددناها سابقا. نرسل جميع حزم البيانات التي لم تُصِب المنفذ الثاني إلى البوابة الأولى من جديد:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE2 -j GATE1</pre><p>نكون هنا أمام خيارين: إما أن يكون الطلب موجَّها إلى المنفذ الأول، هنا نبدأ من جديد في المتتالية؛ وإلا فإن الجدار الناري سيتجاهل الطلب حسب العادة. أي أننا تجنبنا الوقوع في الحالة المعروضة آنفا.</p><h2 id="إعداد-البوابة-الثالثة">إعداد البوابة الثالثة</h2><p>ننفذ البوابة الثالثة بنفس طريقة تنفيذ البوابة الثانية تماما.</p><p>نمسح أولا جميع العلامات التي وُضعت على العنوان مثل ما فعلنا في إعداد البوابة الثانية ولنفس الأسباب:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE3 -m recent --name AUTH2 --remove</pre><p>ثم نختبر هل أصابت محاولة الاتصال المنفذ الثالث في متتالية الطرق، فإن فعلت نضع علامة <code>AUTH3</code> التي تشير إلى أن العميل نجح في طرق المنافذ المطلوبة حسب المرجو؛ ثم نتجاهل - مثل ما هي العادة - الحزمة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE3 -p tcp --dport 3333 -m recent --name AUTH3 --set -j DROP</pre><p>إن لم تفلح محاولة الاتصال في إصابة المنفذ المطلوب نعيد توجيهها إلى البوابة الأولى لترى هل أصابت المنفذ الأول في المتتالية لبدء المسار من جديد:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A GATE3 -j GATE1</pre><p>بالوصول إلى هذه النقطة يكون العملاء الذي نجحوا في طرق المنافذ المطلوبة حسب الترتيب المفروض قد حصلوا على علامة <code>AUTH3</code> التي تمكننا من فتح خدمة SSH لهم ضمن سلسلة <code>PASSED</code>.</p><h2 id="إعداد-سلسلة-passed">إعداد سلسلة PASSED</h2><p>تُستخدَم هذه السلسلة لفتح منفذ SSH لمدة ثلاثين ثانية للعميل الذي نجح في طرق المتتالية الصحيحة.</p><p>لن يُفتَح منفذ SSH إلا إذا كانت محاولة الاتصال الموالية من العميل تطلب السماح لها بعبوره. تفرض هذه القاعدة على من يحاول عشوائيا طرق المنافذ تجربة الاتصال بSSH بعد كل محاولة، الأمر الذي يصعِّب من معرفة متتالية الطرق.</p><p>نبدأ - حسب العادة - بإعادة تعيين العلامات:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A PASSED -m recent --name AUTH3 --remove</pre><p>نقبل الاتصال عبر SSH من المستخدمين الذين وصلوا إلى هذه السلسلة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A PASSED -p tcp --dport 22 -j ACCEPT</pre><p>بالنسبة للمستخدمين الذي لم يحاولوا الاتصال عبر SSH فإننا نعيدهم إلى البوابة الأولى:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A PASSED -j GATE1</pre><p>أكملنا الآن إعداد جميع السلاسل المتفرعة عن سلسلة <code>KNOCKING</code>. بقي إعداد السلسلة العامة التي ستمرر حركة البيانات إلى السلاسل الفرعية.</p><h2 id="إعداد-سلسلة-knocking">إعداد سلسلة KNOCKING</h2><p>يمكننا الآن بعد إعداد السلاسل الفرعية منفردةً إلحاقها بالسلسلة العامة <code>KNOCKING</code> وبالتالي تنفيذ خطة عملنا.</p><p>نبدأ أولا بتوجيه اتصالات العملاء الذين نجحوا في اختبارات الطرْق مباشرة إلى سلسلة <code>PASSED</code>. تمكننا إضافة خيارات هنا. سنقيد الفترة الزمنية التي يمكن للعميل الاتصال فيها بخدمة SSH بعد تجاوزه لاختبارات الطرق، ولتكن ثلاثين ثانية. بعد هذه المهلة لن يكون بمقدوره الاتصال ويجب عليه إرسال متتالية الطرق مرة أخرى.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A KNOCKING -m recent --rcheck --seconds 30 --name AUTH3 -j PASSED</pre><p>ثم نختبر العلامات الأخرى بدءا بالأكثر تقييدا. تمكننا إضافة عشر ثوان لتحديد مهلة لانتهاء صلاحية الطَّرْقات؛ يعني هذا أنه يتوجب على العملاء ألايفصلوا بين كل طرْقتين بأكثر من عشر ثوان.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2</pre><p>نعيد توجيه جميع محاولات الاتصال التي لم توافق أيا من القواعد السابقة إلى البوابة الأولى:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A KNOCKING -j GATE1</pre><p>بهذا تأخذ جميع سلاسل الجدار الناري مكانها. تُلحَق سلسلة <code>KNOCKING</code> كاملة مع السلاسل التابعة لها بسلسلة <code>INPUT</code> الاعتيادية.</p><p>أعددنا لآن آلية الطرق. حان الوقت لاختبارها.</p><h2 id="اختبار-الطرق-على-المنافذ">اختبار الطرق على المنافذ</h2><p>توجد الكثير من الأدوات التي يمكن استخدامها لإنشاء حزم بيانات تستخدم بروتوكول <code>TCP</code> المطلوبة في إعدادات الطرْق على المنافذ. سنستخدم <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-nmap-%D9%84%D9%81%D8%AD%D8%B5-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D8%A7%D9%84%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r81/">أداة <code>nmap</code></a> نظرا لوجودها افتراضيا على أغلب توزيعات لينكس.</p><p>يستخدم <code>nmap</code> افتراضيا حزم بيانات <code>TCP</code>. لذا يجب أن نطلب منه تجاهل استكشاف المستضيف الموجود في سلوكه الابتدائي لكي لا يتداخل مع الطرْقات. إضافة لذلك نريد أن تنتهي مهلة محاولة الاتصال بعد ثانية واحدة فقط لنتابع مع الطرقة الموالية.</p><p>ستبدو كل طرْقة، من هذا المنطلق، على النحو التالي. في المثال أول منفذ نريد طرْقه:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nmap -Pn --host_timeout 201 --max-retries 0 -p 1111 your_server</pre><p>أي أن متتالية الطرق ستصبح على النحو التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nmap -Pn --host_timeout 201 --max-retries 0 -p 1111 your_server
nmap -Pn --host_timeout 201 --max-retries 0 -p 2222 your_server
nmap -Pn --host_timeout 201 --max-retries 0 -p 3333 your_server</pre><p>ستكون لدينا بعدها ثلاثون ثانية للاتصال بخدمة SSH.</p><p>يمكننا الاستفادة من أساسيات في برمجة <a href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D9%85%D9%8A%D9%8E%D8%B3%D9%91%D9%8E%D8%B1-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-shell-r56/">Bash</a> لجعل الأمور آليةً أكثر. سنستخدم حلقة <code>for</code> لتنفيذ الأوامر السابقة ضمن حلقة تكرارية ثم تشغيل عميل SSH للاتصال بالخادوم:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">for x in 1111 2222 3333; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x your_server &amp;&amp; sleep 1; done &amp;&amp; ssh user@your_server</pre><p>ما نفعله هنا هو الطرْق على المنفذ الأول، انتظار ثانية واحدة، الطرْق على الثاني، وهكذا إلى أن تكتمل المتتالية. ثم نحاول بعدها الاتصال بخدمة SSH على الخادوم.</p><p>ننشئ ملفا للسكربت لجعل الأمر أكثر أناقة وأيسر للاستخدام. نسمي الملف <code>knock_client</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano knock_client</pre><p>ونضع فيه المحتوى التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">#!/bin/bah

ports="1111# 2222 3333"
host="your_server"

for x in $ports
do
nmap -Pn --host_timeout 201 --max-retries 0 -p $x $host
sleep 1
done
ssh user@${host}</pre><p>احفظ الملف (CTRL + O) ثم أغلقه (CTRL + X).</p><p>نجعل الملف قابلا للتنفيذ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">chmod 755 knock_client</pre><p>نحاول الاتصال بالخادوم بتنفيذ الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">./knock_client</pre><p>يمكن الآن، إذا جرى كل شيء على ما يرام، الاتصال بالخادوم عن طريق SSH.</p><p>بقيت خطوة أخيرة بعد التحقق من عمل الخطة التي نفذناها حسب المُراد. نجعل قواعد الجدار الناري دائمة (لا يُعاد تعيينها بعد إعادة تشغيل الخادوم) بتنزيل وتثبيت حزمة <code>iptables-persistent</code> على الخادوم:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get install iptables-persistent</pre><p>وتشغيل خدمة <code>iptables-persistent</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service iptables-persistent start</pre><h2 id="خاتمة">خاتمة</h2><p>يكون لديك باكتمال هذا الدليل نظام عملي للطرق على المنافذ يعتمد فقط على الوظائف الموجودة في جدار <code>iptables</code> الناري.</p><p>توجد مزايا لاعتماد <code>iptables</code> حصرا في هذا الإطار. أولا، ينتشر استخدام <code>iptables</code> ويشيع خضوعه لفحوص بحثا عن ثغرات أمنية قد تمثل خطرا على مستخدميه. يعني هذا أنه ما دامت القواعد التي أنشأتها تؤدي العمل الذي تظن أنها تؤديه فأنت في مأمن.</p><p>ميزة أخرى لهذا الإعداد في مقابل خدمة منفصلة للطرق على المنافذ هي أنه لا مجال أن تفشل خدمة تنفيذ الطرق في تغيير قواعد الجدار الناري وتدع المنفذ مفتوحا.</p><p>ترجمة - بتصرف - لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps">How To Configure Port Knocking Using Only IPTables on an Ubuntu VPS</a>.</p><p><span style="line-height: 22.3999996185303px;">حقوق الصورة البارزة: </span><a style="line-height: 22.3999996185303px;" rel="external nofollow" href="http://www.freepik.com/free-photos-vectors/shield">Shield vector designed by Freepik</a><span style="line-height: 22.3999996185303px;">.</span></p>
]]></description><guid isPermaLink="false">91</guid><pubDate>Fri, 31 Jul 2015 16:53:52 +0000</pubDate></item><item><title>&#x641;&#x647;&#x645; &#x625;&#x639;&#x62F;&#x627;&#x62F;&#x627;&#x62A; "&#x627;&#x644;&#x637;&#x631;&#x642; &#x639;&#x644;&#x649; &#x627;&#x644;&#x645;&#x646;&#x627;&#x641;&#x630;" &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; IPTables</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%81%D9%87%D9%85-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%B7%D8%B1%D9%82-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-r90/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/port-knocking.png.ad9bec16dcbd92f78135bbd029cab98e.png" /></p>

<p id="مقدمة">تتعرض الخواديم المتصلة بشبكة الإنترنت لأنواع كثيرة من الهجمات ومحاولات الاختراق التي يقف خلفها متسخدمون خبثاء، سكربتات وبرامج تعمل آليا. قد يكون تأمين الخادوم ضد الهجمات دون التأثير على وصول المستخدمين إلى الخدمات والموارد المتاحة لهم قرارا مؤثرا.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/port-knocking.png.18d9ffaee124c9645aae75a09423b05a.png"><img data-fileid="3700" class="ipsImage ipsImage_thumbnailed" alt="port-knocking.thumb.png.564e4697ceb1cb38" src="https://academy.hsoub.com/uploads/monthly_2015_08/port-knocking.thumb.png.564e4697ceb1cb38c8eafeff5a762ddf.png"></a></p><p>تعد أنواع من الخدمات والموارد لتكون مرئية للعموم ومتاحة للجميع على الإنترنت، مثل خادوم الويب؛ إلا أن أنواعا أخرى من الخدمات لا يستخدمها إلا مدير النظام أو أفراد محددون وهي غير موجهة لتكون موردا يتاح للجميع الوصول إليه. يعرَّف الطرق على المنافذ Port kcnocking بأنه وسيلة لحماية العمليات Processes التي ينطبق عليها الوصف الأخير.</p><p>يعمل الطرق على المنافذ على إخفاء المنافذ المرتبطة بإجراء مّا خلف الجدار الناري إلى أن تُنقل متتالية محدَّدة ومعرَّفة سلفا من حزم البيانات عبر الشبكة؛ حينها تعيد خدمة الطرْق على المنافذ ضبط الجدار الناري من أجل السماح بالوصول إلى التطبيق المحمي.</p><p>تحدثنا في دروس سابقة عن كيفية تفعيل آلية للطرق على المنافذ عبر خدمة خاصة بهذا الغرض (<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%D9%84%D8%B7%D8%B1%D9%82-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D9%84%D8%A5%D8%AE%D9%81%D8%A7%D8%A1-%D8%AE%D8%AF%D9%85%D8%A9-ssh-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%B9%D9%86-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D8%AC%D9%85%D9%8A%D9%86-r87/">knockd</a> أو <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-fwknop-%D9%84%D8%AA%D9%81%D8%B9%D9%8A%D9%84-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D8%AB%D8%A7%D9%82-%D8%B0%D9%8A-%D8%A7%D9%84%D8%AD%D8%B2%D9%85%D8%A9-%D8%A7%D9%84%D9%88%D8%A7%D8%AD%D8%AF%D8%A9-%D8%B9%D9%84%D9%89-ubuntu-1404-r84/">fwknop</a>). سنشرح في هذا الدليل المكون من جزأين طريقة بديلة لإعداد الطرق على المنافذ.</p><p>لا تعتمد هذه الطريقة على برنامج إضافي لتغيير قواعد الجدار الناري؛ بل تستعين بوِحدة لتتبع الحالة State-tracking module موجودة في جدار <code>iptables</code> الناري، تسمى <code>recent</code>.</p><p>نفترض في هذا الدليل معرفة <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1%D9%8D-%D9%86%D8%A7%D8%B1%D9%8A%D9%91-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D8%B9%D9%84%D9%89-ubuntu-1404-r38/">أساسيات التعامل مع <code>iptables</code></a>.</p><p>ستكون الإعدادات على خادوم خاص افتراضي يعمل بتوزيعة أوبنتو 14.04. يجب أن لا تكون هناك تغييرات كبيرة بالنسبة لبقية توزيعات لينكس.</p><p><strong>ملحوظة</strong>: يغطي هذا الشرح الإصدار الرابع من بروتوكول IP. يفصل لينكس بين تأميني الإصدار الرابع والإصدار السادس. على سبيل المثال، لا تنطبق قواعد <code>iptables</code> إلا على حزم البيانات المنقولة عبر عناوين الإصدار الرابع، غير أنه يوجد مكافئ لها بالنسبة لعناوين الإصدار الرابع وهو <code>ip6tables</code>.</p><h2 id="نظرة-عامة-على-الطرق-على-المنافذ-في-iptables">نظرة عامة على الطرق على المنافذ في IPTables</h2><p>أولا، وقبل البدء في ضبط الإعدادات، سنصف كيفية عمل وِحدة <code>recent</code> وكيف تسمح لنا بإنشاء نظام للطرْق على المنفذ.</p><p>يتيح <code>iptables</code> إمكانية تحميل الوحدات عبر خيار <code>m-</code>. يمكن لوِحدة <code>recent</code> تتبع حالات الاتصال، وهو ما سنستغله لجعل محاولات الاتصال بمنفذ هدف (SSH على سبيل المثال) تمر عبر متتالية من المنافذ حسب ما إذا كان المستخدم أصاب المنفذ المطلوب سابقا في المتتالية.</p><p>سنحظُر - لأغراض هذا الدرس - الوصول إلى خدمة SSH من الإنترنت، ممثَّلة بالواجهة <code>eth0</code>. ثم نعيد ضبط الجدار الناري ديناميكيا للسماح باتصالات SSH من الجهاز الذي نستخدمه مباشرة بعد الطرْق حسب المتتالية المتفق عليها؛ وهي:</p><ul><li>1111</li><li>2222</li><li>3333</li></ul><p>يجب ألا تستخدم هذه القيم في الإعدادت الحقيقية، لسهولة تخمينها.</p><p>لكي يُستوثَق من المستخدم بطريقة صحيحة وبالتالي يجعل <code>iptables</code> يعرِض خدمة SSh لعنوان IP الذي يتصل منه فإن عليه طرق منافذ المتتالية بالترتيب، دون أن يرسل أي بيانات أخرى بينها. إن نفذنا هذه الآلية بنجاح فسنحصل على نظام للطرق على المنافذ.</p><h2 id="خطة-إعداد-iptables">خطة إعداد IPTables</h2><p>سنستخدم بضعة سلاسل IPTables من أجل تطبيق الآلية المشروحة في الفقرة السابقة.</p><p>أولا؛ نسمح بجميع حركة البيانات التي لا نريد إخضاعها للطرق على المنافذ. يتعلق الأمر بكل الموارد العمومية، مثل خادوم الويب، والاتصالات الجارية أو تلك القادمة من الواجهة المحلية.</p><p>بعدها مباشرة نوجّه كل الاتصالات التي لا تنطبق عليها القاعدة السابقة إلى سلسلة جديدة تحوي القواعد الأساسية للجدار الناري. من المهم جدا اتباع هذه الطريقة عند تطبيق مجموعة قواعد عريضة ومتحفّظة؛ إذ أنها تتيح وسيلة سهلة لتفعيل ميزة بتمرير الاتصالات إلى السلسلة الجديدة أو تعطيلها بجعلها تتجنبها.</p><p>سنسمي هذه السلسلة <code>KNOCKING</code>.</p><p>سنستخدم أيضا سلاسل أخرى. تسمح وحدة <code>recent</code> بتصنيف الاتصالات وبالتالي التحقق ما إذا كان اتصال مّا يطابق تصنيفا معرفا مسبقا.</p><p>سنعتمد على خاصية تصنيف الاتصالات لوضع علامات على عناوين IP التي أرسَلت طرقة إلى الوجهة (المنفَذ) الأولى؛ ونضيف قاعدة تبحث عن أول عنوان معلَّم وتتحقق من أن حزمة البيانات الثانية أُرسلت إلى الوجهة المطلوبة. إذا كان الأمر كذلك فسننشئ علامة جديدة للدلالة على أننا حصلنا على إجابتين صحيحتين لحد الساعة؛ وإلا فستُلغى الحزمة ويُعاد تعيين العلامة.</p><p>تعمل السلاسل الموالية بنفس طريقة التحقق من العلامة المطلوبة وتمريرها إن استمرت على المسار المطلوب، أي متتالية الطرق. في النهاية وبعد الحصول على الحزم المطلوبة بالترتيب، تُعرض خدمة SSH برهةً قصيرة لعنوان IP الذي طَرَق بمتتالية صحيحة؛ ثم تُخفى من جديد تلقائيا.</p><p>يمكن النظر إلى قواعد الطرْق هذه على أنها ثلاث بوابات للدخول إلى الخدمة، بوابة لكل قاعدة. يعني هذا أن أي عنوان IP سيكون في إحدى حالات أربع:</p><ul><li><p>الحالة الابتدائية: تبقى جميع عناوين IP في الحالة الابتدائية إلى أن ترسل حزمةً إلى أول وِجهة طرق. لن توجد قاعدة للتعامل مع هذه العناوين ضمن وحدة <code>recent</code>. نستخدم هذه الحالة للتدليل على العملاء الذين لم توضع علامات على عناوينهم بعد.</p></li><li><p>الحالة auth1: توضع علامة <code>auth1</code> على العناوين أرسلت حزمة إلى أول منفذ ضمن متتالية الطرق. تحدد الحزمة الموالية ما إذا كان العنوان سيُعاد للحالة الابتدائية أو يتقدم إلى الحالة <code>auth2</code>.</p></li><li><p>الحالة auth2: يعني وجود عنوان في هذه الحالة أنه أصاب الهدفيْن الأول والثاني على التوالي. على منوال قاعدة الانتقال السابقة، تحدد الحزمة الموالية من العميل ما إذا كان العنوان سيُعاد للحالة الابتدائية أو يتقدم إلى الحالة <code>auth3</code>.</p></li><li><p>الحالة auth3: العناوين المعلَّمة ب<code>auth3</code> هي تلك التي أصابت المنافذ الثلاثة على الترتيب وضمن الوقت المخصَّص. إذا حاول عميل يوجد في الحالة <code>auth3</code> الاتصال بالخدمة الآن في الوقت المحدّد فسيُسمَح له بالوصول إليها؛ أما إذا أرسل بيانات مغايرة لتلك المستخدمة في الاتصال بالخدمة فسيرجع إلى الحالة الابتدائية.</p></li></ul><p>ستُنشأ لكل واحدة من هذه الحالات سلسلة Chain ضمن قواعد الجدار الناري، إضافة إلى كونها علامات تضبطها وحدة <code>recent</code>. تُلخَّص السلاسل على النحو التالي:</p><ul><li><p>GATE1: تحدد هل يجب نقل العميل من الحالة الابتدائية إلى <code>auth1</code>.</p></li><li><p>GATE2: تحدد هل يجب نقل عنوان من الحالة <code>auth1</code> إلى <code>auth2</code> أم تجب إعادة تعيينه وإرجاعه إلى الحالة الابتدائية.</p></li><li><p>GATE2: تحدد هل يجب نقل عنوان من الحالة <code>auth2</code> إلى <code>auth3</code> من أجل السماح له بالاتصال عن طريق SSH؛ أم تجب إعادة تعيينه وإرجاعه إلى الحالة الابتدائية.</p></li><li><p>PASSED: تستخدَم هذه السلسلة لفتح منفذ SSH خلال مدة قصيرة للعملاء الذين نجحوا في إرسال الطرْقات. إذا أرسل عميل تنطبق عليه هذه السلسلة بيانات غير موجهة للاتصال بSSH فسيُتجاهل وبالتالي يعاد تعيين حالته إلى الحالة الابتدائية.</p></li></ul><p>من الواضح أن لدينا نقاط قرار عدة. يجب تجاهل كل محاولات الاتصال من سلسلة <code>KNOCKING</code> والسلاسل المتفرعة عنها (باستثناء الاتصالات القادمة إلى خدمة SSH من عملاء نجحوا في الطرْق)؛ وذلك بغض النظر هل وافقت المنفذ الصحيح أم لا.</p><p>آلية وضع العلامات أعلاه هي وسيلة داخلية في الجدار الناري لتتبع محاولات الاتصال، وليست معروضة للعميل. هذا الأمر ضروري لنجاح تنفيذ الطرق على المنافذ. يجب ألا يتلقى من يحاول الاتصال أي رد كما لا يجوز أن يعرف الحالة التي يوجد فيها، بل لا يجوز أصلا أن يعرف وجود آلية على الخادوم للطرق على المنافذ.</p><p>في<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%B7%D9%91%D8%B1%D9%92%D9%82-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D9%81%D8%B0-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-r91/"> الجزء الثاني</a> من هذا الدليل سنشرح كيفية العمل على تنفيذ خطة العمل هذه.</p><p>ترجمة - بتصرف - لمقال <a rel="external nofollow" target="_blank" href="https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps">How To Configure Port Knocking Using Only IPTables on an Ubuntu VPS</a>.</p><p>حقوق الصورة البارزة: <a href="http://www.freepik.com/free-photos-vectors/shield" rel="external nofollow">Shield vector designed by Freepik</a>.</p>
]]></description><guid isPermaLink="false">90</guid><pubDate>Fri, 31 Jul 2015 16:10:21 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x64A;&#x639;&#x627;&#x644;&#x62C; Fail2ban &#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x636;&#x628;&#x637; &#x644;&#x62A;&#x646;&#x641;&#x64A;&#x630; &#x627;&#x644;&#x62D;&#x638;&#x631;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D8%A7%D9%84%D8%AC-fail2ban-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%B6%D8%A8%D8%B7-%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%A7%D9%84%D8%AD%D8%B8%D8%B1-r89/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/fail2ban-intro-2.png.d4bd77df62a954982edf058f1e1e01b8.png" /></p>

<div id="wmd-preview-section-25"><p>تحدثنا في الدرس السابق عن <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-fail2ban-%D8%B9%D9%84%D9%89-%D8%B2%D9%8A%D8%A7%D8%AF%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r88/">الآلية التي تعمل وفقها خدمة fail2ban</a> لحماية خوادم لينكس حيث تحظر أرقام IP المُسيئة التي تحاول اختراق خدمة ما عبر محاولات دخول متكرّرة باستخدام حسابات شائعة. وفصلنا في شرح ملفات الضبط الخاصة بكل من المُرشّح والإجراءات. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/fail2ban-intro-2.png.5d071c77b106c0be3630e55d482db2be.png"><img data-fileid="3517" class="ipsImage ipsImage_thumbnailed" alt="fail2ban-intro-2.thumb.png.5b1471fc48f01" src="https://academy.hsoub.com/uploads/monthly_2015_08/fail2ban-intro-2.thumb.png.5b1471fc48f018cd05c873ef00739b6c.png"></a></p><p>نشرح في هذا الدرس ما يحدث عندما تبدأ خدمة <span style="font-family:courier new,courier,monospace;">fail2ban</span> بالعمل.</p></div><div id="wmd-preview-section-26"><h2 id="تحميل-ملفات-الضبط-الأولى">تحميل ملفات الضبط الأولى</h2><p>في البداية يُقرأ ملف<span style="font-family:courier new,courier,monospace;"> fail2ban.conf</span> الرئيسي لتحديد الشروط التي يجب أن تُنفَّذ العمليّة الرئيسيّة وفقها، ويتم إنشاء كلّ ما يلزم لذلك كالمقابس socket، ملفات السجل log files، وقيم PID. <br>يقرأ <span style="font-family:courier new,courier,monospace;">fail2ban</span> بعد ذلك الملف<span style="font-family:courier new,courier,monospace;"> jail.conf</span> للحصول على تفاصيل الضبط، وهذا يعني قراءة ملفات الضبط الموجودة ضمن الدليل<span style="font-family:courier new,courier,monospace;"> jail.d</span> والمنتهية باللاحقة <span style="font-family:courier new,courier,monospace;">conf.</span> تبعًا للترتيب الأبجدي، بحيث تُضاف الإعدادات الموجودة ضمن هذه الملفات إلى الضبط الداخلي وتُكتب القيم الجديدة للخصائص على تلك الموصوفة في ملف<span style="font-family:courier new,courier,monospace;"> jail.conf</span>. <br>يبحث <span style="font-family:courier new,courier,monospace;">fail2ban</span> بعد ذلك عن ملف <span style="font-family:courier new,courier,monospace;">jail.local</span> ويكرّر ذلك مُتكيفًا مع القيم الجديدة التي تحملها. أخيرًا فإنه يبحث في الدليل <span style="font-family:courier new,courier,monospace;">jail.d</span> مرةً أخرى لقراءة الملفات ذات اللاحقة <span style="font-family:courier new,courier,monospace;">local.</span> حسب الترتيب الأبجدي. <br>وبهذه الطريقة نرى أن <span style="font-family:courier new,courier,monospace;">fail2ban</span> يملك عددًا كبيرًا من الملفات التي يمكن استخدامها للتحكّم بالسلوك النهائي للبرنامج. وفي حالتنا هذه نحن نملك الملفين <span style="font-family:courier new,courier,monospace;">jail.conf</span> و <span style="font-family:courier new,courier,monospace;">jail.local </span>فقط، حيث وضعنا في الملف<span style="font-family:courier new,courier,monospace;"> jail.local</span> القيم التي نحتاج فقط لأن تكون مغايرة عن تلك الموجودة في <span style="font-family:courier new,courier,monospace;">jail.conf</span>. <br>في المحصلة يملك <span style="font-family:courier new,courier,monospace;">fail2ban</span> الآن مجموعة من التعليمات التي يمكن تحميلها إلى الذاكرة وتُمثّل مزيجًا مُركبًا من جميع الملفات التي تمكّن من العثور عليها. <br>يفحص البرنامج بعد ذلك كل قسم باحثًا عن عبارة<span style="font-family:courier new,courier,monospace;"> enabled = true</span>، فإذا وجدها في قسمٍ ما فإنّه يقرأ المُعاملات المكتوبة فيه لبناء خطّة عمله وتحديد ما يلزم من الإجراءات، بينما تُستخدم المُعاملات الموجودة في المقطع الافتراضي<span style="font-family:courier new,courier,monospace;"> [DEFAULT]</span> لتلك التي لا تملك تعريفًا خاصًا في أقسام الخدمات.</p></div><div id="wmd-preview-section-27"><h2 id="تحليل-ملفات-الإجراء-لتحديد-إجراءات-البداية">تحليل ملفات الإجراء لتحديد إجراءات البداية</h2><p>يبحث <span style="font-family:courier new,courier,monospace;">fail2ban</span> عن action موجِّه لمعرفة سيناريو العمل بهدف تنفيذ سياسات الحظر أو رفعه. فإذا لم يجد واحدًا فإنه يعود إلى الإجراء الافتراضي الموضّح أعلاه. <br>يتكّون الإجراء الموجّه من اسم ملف(ات) الإجراء التي ستُقرأ، فضلًا عن قاموس قيم المفاتيح key-value التي تُمرّر المُعاملات اللازمة لتلك الملفات، وغالبًا ما تأخذ هذه القيم شكل مُعاملات الاستبدال عن طريق الرجوع إلى الإعدادات المضبوطة في قسم الخدمة. ويُمرّر مفتاح name قيمة المتغيّر<span style="font-family:courier new,courier,monospace;"> __name__</span> التي ستُعيّن كقيمة لترويسة القسم. <br>بعد ذلك يستخدم <span style="font-family:courier new,courier,monospace;">fail2ban</span> هذه المعلومات للعثور على الملفات المرتبطة بها في الدليل <span style="font-family:courier new,courier,monospace;">action.d</span>، حيث يبحث في المقام الأوّل عن الملفات ذات اللاحقة <span style="font-family:courier new,courier,monospace;">conf.</span> ثم يُعدّل المعلومات الموجودة فيها مع الإعدادات المُضمّنة في الملفات ذات اللاحقة <span style="font-family:courier new,courier,monospace;">local.</span> والموجودة أيضًا في الدليل نفسه.<br>تُحلّل تلك الملفات لتحديد الإجراءات الواجب تنفيذها، حيث تُقرأ قيمة <span style="font-family:courier new,courier,monospace;">actionstart</span> لمعرفة الإجراءات التي يجب اتخاذها لإعداد بيئة العمل، والتي غالبًا ما تشمل على إنشاء صيغة لجدار الحماية بهدف استيعاب قواعد الحظر. <br>تستخدم الإجراءات المُعرّفة في هذا الملف المُعاملات التي تُمرّر إليها من قبل الإجراء المُوجّه، إذ تُستخدم هذه القيم لإنشاء القواعد المناسبة بشكلٍ حيويّ. وإذا لم يتم تعريف متغيّر ما فإنه يمكن النظر إلى القيم الافتراضية في ملف الإجراء حينها.</p></div><div id="wmd-preview-section-28"><h2 id="تحليل-ملفات-المرشح-لتحديد-قواعد-التصفية">تحليل ملفات المرشح لتحديد قواعد التصفية</h2><p>تشمل مُعاملات الخدمة الموجودة في ملفات <span style="font-family:courier new,courier,monospace;">jail.*</span> مسار ملف السجل، إضافةً إلى آلية الانتخاب التي يجب استخدامها لفحص الملف (والتي تُعرّف بواسطة الخيار backend)، كما تضم المُرشّح filter الذي يجب استعماله لتحديد الأسطر المُمثّلة لحالات فشل المصادقة. <br>يبحث <span style="font-family:courier new,courier,monospace;">fail2ban</span> في الدليل<span style="font-family:courier new,courier,monospace;"> filter.d</span> عن ملف المُرشّح ذو اللاحقة <span style="font-family:courier new,courier,monospace;">conf.</span>. يُقرأ هذا الملف لتعريف الأنماط التي يمكن استخدامها لمطابقة الأسطر المُسيئة، ثم يقوم البرنامج بالبحث عن ملف المرشح ذو اللاحقة <span style="font-family:courier new,courier,monospace;">local.</span> لمعرفة فيما إذا كان أيٍ من المُعاملات الافتراضية قد حصل على قيمة أخرى، تُستخدم في هذه الملفات التعابير النمطيّة المعرّفة. <br>يقوم <span style="font-family:courier new,courier,monospace;">fail2ban</span> بقراءة ملف سجل الخدمة. حيث يحاول كل سطر <span style="font-family:courier new,courier,monospace;">failregex</span> مُعرّف في ملفات<span style="font-family:courier new,courier,monospace;"> filter.d</span> مقابلة كل سطر جديد يكتب إلى ملف سجل الخدمة. <br>إذا ضُبط عنوان IP مُسيء عن طريق إرجاع التعبير النمطي لمطابقة فإنّه يتحقق أولًا من مطابقته كذلك مع التعبير النمطي المُعرّف بواسطة <span style="font-family:courier new,courier,monospace;">ignoreregex</span>، فإذا تمت المطابقة معه أيضًا يتجاهل <span style="font-family:courier new,courier,monospace;">fail2ban</span> الأمر، وإلا يزداد العداد الداخلي للعميل الذي تسبّب بالمطابقة ويتم إنشاء طابع زمني مرتبط بهذا الحدث. <br>عندما يبلغ الإطار الزمني المُحدد بواسطة المُعامل <span style="font-family:courier new,courier,monospace;">findtime</span> في ملفات<span style="font-family:courier new,courier,monospace;"> jail.*</span> نهايته (على النحو الذي يُحدّده الطابع الزمني للحدث)، يتم إهمال العدّاد الداخلي مجددًا، ولا يُعتبر هذا الحدث ذو صلة بسياسة الحظر. <br>أما إذا وقعت محاولة ولوج فاشلة إضافية خلال الوقت المُحدّد يزداد العداد الداخلي مرة أخرى، فإذا ما وصل العداد إلى عتبة الفشل المُحدّدة من قبل الخيار <span style="font-family:courier new,courier,monospace;">maxretry</span> ضمن الإطار الزمني المضبوط يُنفّذ <span style="font-family:courier new,courier,monospace;">fail2ban</span> خطّة الحظر عبر استدعاء الإجراء <span style="font-family:courier new,courier,monospace;">actioncheck</span> للخدمة المُعرّفة في ملفات <span style="font-family:courier new,courier,monospace;">action.d/</span>، وهذا يُحدّد فيما إذا كان إجراء <span style="font-family:courier new,courier,monospace;">actionstart</span> أعدّ الصيغة اللازمة. وبعد ذلك يُدعى الإجراء <span style="font-family:courier new,courier,monospace;">actionban</span> لحظر العميل المُسيء مُحدّدا الطابع الزمني لهذا الحدث كذلك. <br>بعد انقضاء الوقت المُحدّد من قبل المُعامل <span style="font-family:courier new,courier,monospace;">bantime</span>؛ يرفع <span style="font-family:courier new,courier,monospace;">fail2ban</span> الحظر عن العميل عبر استدعاء الإجراء <span style="font-family:courier new,courier,monospace;">actionunban</span>. <br>عندما تتوقف خدمة <span style="font-family:courier new,courier,monospace;">fail2ban</span> فإنها تحذف قواعد جدار الحماية التي تمّ إنشائها من قبل الإجراء <span style="font-family:courier new,courier,monospace;">actionstop</span>، الأمر الذي يحذف السلسلة الحاوية على قواعد <span style="font-family:courier new,courier,monospace;">fail2ban</span> ويحذف القواعد من سلسلة INPUT والتي كانت تنقل حركة مرور البيانات إلى تلك السلسلة.</p></div><div id="wmd-preview-section-29"><h2 id="خاتمة">خاتمة</h2><p>هكذا نأمل أن تكون قد امتلكت فهمًا عميقًا لآلية عمل <span style="font-family:courier new,courier,monospace;">fail2ban</span>، وفي العموم فإن التعامل مع هذه الخدمة ليس بالأمر الصعب بالنسبة لأغلب المستخدمين؛ فمعظم مهمات الضبط تكون مُعدّة بشكل مسبق، ومع هذا فإذا أردت التعديل على إعدادات الضبط الافتراضية فسيكون من المفيد لك أن تتعرف على كيفية عمل <span style="font-family:courier new,courier,monospace;">fail2ban</span> لتسهيل التعديل بما يتلاءم مع احتياجاتك.</p><p>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server">How the Fail2ban Service Processes Configuration Files to Implement Bans</a> لصاحبه Justin Ellingwood.</p></div>
]]></description><guid isPermaLink="false">89</guid><pubDate>Thu, 30 Jul 2015 09:14:37 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x64A;&#x639;&#x645;&#x644; Fail2ban &#x639;&#x644;&#x649; &#x632;&#x64A;&#x627;&#x62F;&#x629; &#x62D;&#x645;&#x627;&#x64A;&#x629; &#x62E;&#x627;&#x62F;&#x648;&#x645;&#x643;</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-fail2ban-%D8%B9%D9%84%D9%89-%D8%B2%D9%8A%D8%A7%D8%AF%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r88/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/fail2ban-intro.png.8d473422384d038c3486fd35a2f5b25f.png" /></p>

<div id="wmd-preview-section-16"><p>تتعرّض جميع الخدمات التي يتم تقديمها عبر الإنترنت لمختلف أنواع الهجمات من قبل أطرافٍ مُسيئة. فإذا كانت الخدمة تتطلب تسجيل دخول (أو ما يُعرف بالتوثيق أو المُصادقة)؛ فسيحاول بعض المستخدمين غير الشرعيين أو برمجيات bot الخبيثة الولوج إلى الخدمة من خلال تكرار محاولات المُصادقة بتجريب بيانات تسجيلٍ مختلفة في كلّ مرة. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/fail2ban-intro.png.61f353b2c0e7aca1c7e27f93f460cdc2.png"><img data-fileid="3516" class="ipsImage ipsImage_thumbnailed" alt="fail2ban-intro.thumb.png.8c5620311d1eb9b" src="https://academy.hsoub.com/uploads/monthly_2015_08/fail2ban-intro.thumb.png.8c5620311d1eb9b23929dedc8cf8c737.png"></a></p><p>من الأمثلة الشائعة على ذلك الهجمات التي تتعرض لها خدمة SSH من قبل شبكة الروبوت Botnet لتجريب أسماء حسابات شائعة بشكل آلي بهدف اختراق الخدمة، إلا أنّه لحسن الحظّ فقد تمّ إنشاء عدّة خدمات مثل <span style="font-family:courier new,courier,monospace;">fail2ban</span> لمساعدتنا على التخفيف من هذه الهجمات. <br>يعمل <span style="font-family:courier new,courier,monospace;">fail2ban</span> عن طريق تعديل قواعد جدار النار بشكل حيوي لحظر العناوين التي تحاول تسجيل الدخول بعد عددٍ مُحدّدٍ من المرات الفاشلة. <br>في هذا الدرس سنُناقش بمزيدٍ من التعمق كيفيّة عمل الأداة <span style="font-family:courier new,courier,monospace;">fail2ban</span> وكيف يمكننا تعديل سلوكها لتتوافق مع متطلباتنا.</p></div><div id="wmd-preview-section-17"><h2 id="المفهوم-الأساسي">المفهوم الأساسي</h2><p>الفكرة الأساسية في عمل <span style="font-family:courier new,courier,monospace;">fail2ban</span> هي مراقبة سجلات logs الخدمات الشائعة لرصد محاولات تسجيل الدخول الفاشلة. <br>عندما يُضبط <span style="font-family:courier new,courier,monospace;">fail2ban</span> لمراقبة سجل خدمة ما، فإنه يبحث في مُرشّح filter مُخصّص لهذه الخدمة. يتم تصميم المُرشِّح لتعريف حالة "فشل المُصادقة" لهذه الخدمة باستخدام تعابير نمطيّة مُعقّدة Regular Rxpressions تُعرّف متغيرًا يُدعى <span style="font-family:courier new,courier,monospace;">failregex</span>. <br>لحُسن الحظ يأتي <span style="font-family:courier new,courier,monospace;">fail2ban</span> مع مجموعة مُرشحات جاهزة للخدمات الأكثر شيوعًا. عندما يطابق سطر ما من سجل الخدمة المُراقبة المُتغيّر <span style="font-family:courier new,courier,monospace;">failregex</span> من المُرشّح؛ يتم تنفيذ الإجراءات المُحدّدة لهذه الخدمة، والتي يمكن ضبطها للقيام بأشياء مختلفة اعتمادًا على ما يفضّله مُدير الخادوم. <br>الإجراء الافتراضي الذي يتمّ تنفيذه عادةً هو حظر عنوان الـ IP المُسيء عن طريق تعديل قواعد <span style="font-family:courier new,courier,monospace;">iptables</span> لجدار الحماية. يمكنك أيضًا توسيع هذا الإجراء لإرسال بريد إلكتروني إلى مدير الخادوم مع تقرير <span style="font-family:courier new,courier,monospace;">whois</span> عن المهاجم، أو إرفاق الأسطر التي أدّت إلى إطلاق إجراءات الحماية من سجل الخدمة. <br>يمكن كذلك تعديل إجراءات الحماية لتنفيذ أوامر مختلفة عن سلوك <span style="font-family:courier new,courier,monospace;">iptables</span> المُعتاد، إذ يمكنك اختيار أوامر أكثر تعقيدًا أو أبسط كما تريد، بالإضافة إلى ملفات الضبط الخاصة بجدار الحماية، وخيارات التنبيه المتاحة. <br>بشكل افتراضي يتم تنفيذ إجراءات الحماية عند الكشف على ثلاث محاولات تسجيل دخول فاشلة خلال عشرة دقائق، ويكون وقت الحظر الافتراضي هو عشرة دقائق أيضًا. العدد الافتراضي لمحاولات المُصادقة الفاشلة ضروريّ لتفعيل الحظر على جانب SSH إلا أنّه يمكن تعديل ملف الضبط من قبل مدير الخادوم ورفع عدد المحاولات اللازمة لتشغيل إجراءات الحماية إلى ست مرات مثلًا. <br>عند استخدام أسلوب <span style="font-family:courier new,courier,monospace;">iptables</span> الافتراضي لحماية حركة SSH، تُنشئ الأداة <span style="font-family:courier new,courier,monospace;">fail2ban</span> سلسلة جديدة عند بدء الخدمة، مُضيفةً قاعدة جديدة إلى سلسلة الإدخال <span style="font-family:courier new,courier,monospace;">INPUT chain </span>والتي تُرسل حركة مرور البيانات TCP الموجّهة عند المنفذ 22 إلى السلسلة الجديدة. في السلسلة الجديدة تُضاف قاعدة مُفردة مُعيدةً الحركة إلى سلسلة الإدخال <span style="font-family:courier new,courier,monospace;">INPUT chain.</span> <br>هذا ما يجعل حركة البيانات تقفز إلى السلسلة الجديدة أولًا ومن ثم تقفز عائدةً، ورغم أن ذلك لا يؤثر على حركة مرور البيانات بدايةً إلا أنه مع تكرار عنوان IP ما لعملية المُصادقة عدّة مرات ووصوله إلى عتبة "فشل المصادقة"؛ تُضاف قاعدة إلى بداية السلسلة الجديدة لمنع حركة المرور الصادرة من عنوان IP المُسيء، والذي يؤدي إلى حظره فورًا. بعد انتهاء فترة الحظر تُحذف القاعدة من <span style="font-family:courier new,courier,monospace;">iptables</span>، ويتم إزالة السلسلة والقواعد المرتبطة بها عند انتهاء خدمة fail2ban.</p></div><div id="wmd-preview-section-18"><h2 id="استعراض-إعدادات-خدمة-fail2ban">استعراض إعدادات خدمة Fail2ban</h2><p>يتم ضبط <span style="font-family:courier new,courier,monospace;">fail2ban</span> من خلال مجموعة متنوعة من الملفات الموجودة ضمن الدليل<span style="font-family:courier new,courier,monospace;"> /etc/fail2ban/</span> والمرتبة بشكلٍ هرمي. <br>فعلى سبيل المثال يضبط الملف<span style="font-family:courier new,courier,monospace;"> fail2ban.conf</span> بعض إعدادات التشغيل الأساسية مثل طريقة daemon في تسجيل المعلومات وكيفيّة استخدام المقابس socket وملفات pid. بكل الأحوال فإن الإعدادات الرئيسية تُحفظ في ملفات تُدعى "jails". <br>بشكل افتراضي يأتي <span style="font-family:courier new,courier,monospace;">fail2ban</span> مع الملف <span style="font-family:courier new,courier,monospace;">jail.conf</span> والذي يُستبدل عادةً مع كلّ تحديث، لذا يُنصح المستخدمون بنسخ هذا الملف تحت اسم <span style="font-family:courier new,courier,monospace;">jail.local</span> وإجراء التعديلات هناك. <br>إذا كنت تملك بالفعل الملف <span style="font-family:courier new,courier,monospace;">jail.local</span> افتحه على الفور باستخدام محرّر نصيّ: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/fail2ban/jail.local </pre><p>أما إذا لم يكن الملف موجودًا بالفعل أو كان فارغًا بعد فتحه؛ انسخه من جديد باسم <span style="font-family:courier new,courier,monospace;">jail.local</span> ثم افتحه بمحرّر نصيّ: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local 
sudo nano /etc/fail2ban/jail.local </pre><p>لنُلقي نظرة على الخيارات المتاحة هنا ونرى كيف يتفاعل هذا الملف مع ملفات الضبط الأخرى ضمن النظام.</p></div><div id="wmd-preview-section-19"><h2 id="القسم-الافتراضي">القسم الافتراضي</h2><p>يُعرّف الجزء الأول من الملف القيم الافتراضية لآلية عمل <span style="font-family:courier new,courier,monospace;">fail2ban</span>. يمكن تجاوز هذه الخيارات من قبل مقاطع الضبط اللاحقة والخاصة بكل خدمة على حدا. <br>بإهمال التعليقات سيبدو القسم الافتراضي مشابهًا لهذا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[DEFAULT]

ignoreip = 127.0.0.1/8 
bantime = 600 
findtime = 600 
maxretry = 3 
backend = auto 
usedns = warn 
destemail = root@localhost 
sendername = Fail2Ban 
banaction = iptables-multiport 
mta = sendmail 
protocol = tcp 
chain = INPUT 
action_ = %(banaction)s[name=%(name)s, port=”%(port)s”, protocol=”%(protocol)s”, chain=”%(chain)s”] 
action_mw = %(banaction)s[name=%(name)s, port=”%(port)s”, protocol=”%(protocol)s”, chain=”%(chain)s”] 
%(mta)s-whois[name=%(name)s, dest=”%(destemail)s”, protocol=”%(protocol)s”, chain=”%(chain)s”, sendername=”%(sendername)s”] 
action_mwl = %(banaction)s[name=%(name)s, port=”%(port)s”, protocol=”%(protocol)s”, chain=”%(chain)s”] 
%(mta)s-whois-lines[name=%(name)s, dest=”%(destemail)s”, logpath=%(logpath)s, chain=”%(chain)s”, sendername=”%(sendername)s”] 
action = %(action_)s 
</pre><p>دعونا نشرح ماذا يعني ذلك في الواقع: </p><ul><li><strong>ignoreip</strong>: يُعرّف هذا الخيار مجموعة عناوين IP كقائمة بيضاء يتمّ تجاهلها من قبل نظام الحظر. افتراضيًا يتم تعيين هذا الخيار لتجاهل حركة المرور القادمة من قبل الجهاز نفسه فقط، ومن الجيد أن نُبقي على ذلك. </li><li><strong>bantime</strong>: يُحدّد هذا الخيار طول مدّة الحظر بالثواني، وبشكل افتراضي يأخذ القيمة 600 ثانية (أي عشرة دقائق). </li><li><strong>findtime</strong>: يُحدّد الفترة الزمنية التي ستتم مراقبتها للنظر في تكرار محاولات تسجيل الدخول الفاشلة. القيمة الافتراضية هي 600 ثانية (أي عشرة دقائق أيضًا)، والذي يعني أن <span style="font-family:courier new,courier,monospace;">fail2ban</span> سيحسب عدد محاولات الولوج الفاشلة في آخر عشرة دقائق. </li><li><strong>maxretry</strong>: يُحدّد عدد محاولات تسجيل الدخول الفاشلة التي سيُحظر بعدها عنوان IP مباشرةً من قبل <span style="font-family:courier new,courier,monospace;">fail2ban</span> وذلك ضمن الإطار الزمني المُحدّد من قبل <span style="font-family:courier new,courier,monospace;">findtime</span>. </li><li><strong>backend</strong>: يُحدّد هذا الخيار كيف يراقب <span style="font-family:courier new,courier,monospace;">fail2ban</span> ملفات السجل، فالقيمة auto تعني أن <span style="font-family:courier new,courier,monospace;">fail2ban</span> سيجرّب أسلوب pyinotify ثم gamin وبعدها يختار خوارزمية بناءً على ما هو متاح. </li><li><strong>usedns</strong>: يُحدّد خوادم DNS التي سوف تُستخدم للمساعدة في تنفيذ الحظر. فالقيمة "no" تعني استخدام عناوين IP نفسها في الحظر بدلًا من استعمال اسم المضيف hostnames. بينما تسعى القيمة "warn" إلى الاستفادة من أدلة DNS للبحث عن اسم المضيف وحظره مع تسجيل النشاط للمراجعة. </li><li><strong>destemail</strong>: يُوضع هنا عنوان البريد الإلكتروني الذي ستُرسل إشعارات التنبيه إليه (فيما إذا كانت ميزة الإشعارات مُفعّلة). </li><li><strong>sendername</strong>: يُحدّد محتوى الحقل "from" في رسائل الإشعارات المولّدة من الخيار السابق. </li><li><strong>banaction</strong>: يُعيّن هذا الخيار العمل الذي سيتم تنفيذه حال الوصول إلى عتبه "فشل المُصادقة"، وفي الواقع هناك ملف ضمن الدليل <span style="font-family:courier new,courier,monospace;">/etc/fail2ban/action.d/</span> باسم <span style="font-family:courier new,courier,monospace;">iptables-multiport.conf</span> يُعالج مهمة <span style="font-family:courier new,courier,monospace;">iptables</span> لحجب عناوين IP، وهو ما سنتطرق إليه لاحقًا. </li><li><strong>mta</strong>: وكيل نقل البريد المُستخدم لإرسال التنبيهات البريدية. </li><li><strong>protocol</strong>: يُحدّد نوع حركة مرور البيانات التي سيتم إسقاطها عند تنفيذ حظر IP، وكذلك نوع حركة المرور التي سيتم إرسالها إلى سلسلة <span style="font-family:courier new,courier,monospace;">iptables</span> جديدة. </li><li><strong>chain</strong>: وهي السلسلة التي سيتم ضبطها مع قاعدة قفز jump rule لإرسال حركة المرور إلى <span style="font-family:courier new,courier,monospace;">fail2ban</span>. </li></ul><p>باقي المُعاملات تُعرِّف إجراءات مختلفة يمكن تخصيصها. تُمرّر هذه الإجراءات في بعض المُعاملات السابقة من خلال سلسلة استيفاء string interpolation على النحو التالي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">%(var_name)s </pre><p>في السطر أعلاه يُستبدل محتوى var_name. باتباع هذه الطريقة يتم إسناد المتغيّر action إلى المُعرّف action_ بشكلٍ افتراضي (ما يؤدي إلى تنفيذ الحظر دون إرسال إشعار عبر البريد)، وهذا بدوره يُضبط عبر استدعاء الإجراء iptables-multiport مع قائمة من المُعاملات (مثل اسم الخدمة، المنفذ، البروتوكول، والسلسلة) اللازمة لتنفيذ الحظر. يتم استبدال name مع اسم الخدمة كما هو مُحدّد بواسطة ترويسات الأقسام في الأسفل.</p></div><div id="wmd-preview-section-20"><h2 id="أقسام-الخدمات-الخاصة">أقسام الخدمات الخاصة</h2><p>أسفل القسم الافتراضي هناك أقسام مُخصّصة لكل خدمة على حدا والتي يمكن استخدامها لتجاوز الإعدادات الافتراضية، وهذا يتبع للخيارات التي يمكن لها أن تأخذ قيمًا مُختلفة عن القيم العادية. <br>تُحدّد ترويسة كل مقطع كما يلي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[service_name] </pre><p>أي مقطع يحتوي على هذا السطر سيُقرأ ويٌفعّل: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">enabled = true </pre><p>تُضبط المُعاملات ضمن كل قسم بما في ذلك ملف المُرشّح والذي يجب استخدامه لتحليل السجلات ومواقع ملفات السجلات نفسها. <br>خذ بعين الاعتبار أن المقطع الذي يُحدِّد إجراءات الحماية لخدمة SSH يبدو مثل هذا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[SSH]

enabled = true 
port = ssh 
filter = sshd 
logpath = /var/log/auth.log 
maxretry = 6 
</pre><p>يُفعّل السطر الأول <span style="font-family:courier new,courier,monospace;">enabled= true</span> القسم الخاص بخدمة SSH ويُعيّن المنفذ إلى منفذ SSH (بالرقم 22) مُخبرًا <span style="font-family:courier new,courier,monospace;">fail2ban</span> بالنظر إلى السجل <span style="font-family:courier new,courier,monospace;">var/log/auth.log/ </span>وتحليله باستخدام آليات الترشيح المُحدّدة ضمن الدليل<span style="font-family:courier new,courier,monospace;"> /etc/fail2ban/filters.d/</span> في الملف المُسمى<span style="font-family:courier new,courier,monospace;"> sshd.conf</span>. <br>تؤخذ جميع أجزاء المعلومات اللازمة من المُعاملات المُعرّفة ضمن القسم <span style="font-family:courier new,courier,monospace;">[DEFAULT] </span>. فعلى سبيل المثال يتم تعيين إجراء تنفيذ الخيار action_ والذي يحظر عنوان IP المُسيء باستخدام iptables-multiport والذي يشير إلى الملف <span style="font-family:courier new,courier,monospace;">iptables-multiport.conf</span> ضمن المسار<span style="font-family:courier new,courier,monospace;"> /etc/fail2ban/action.d/</span>. <br>وكما ترى يجب أن تكون الإجراءات ضمن المقطع <span style="font-family:courier new,courier,monospace;">[DEFAULT]</span> عامة ومرنة. الاستخدام المُكثّف لمُعاملات الاستبدال جنبًا إلى جنب مع المُعاملات المزودة بقيم افتراضية معقولة يجعل التعريفات سهلة التجاوز عند الضرورة.</p></div><div id="wmd-preview-section-21"><h2 id="شرح-ملف-الترشيح">شرح ملف الترشيح</h2><p>من أجل فهم ما يجري في إعدادات الضبط الخاصة بنا، نحن بحاجة إلى فهم كلًا من ملف المُرشّح filter file وملف الإجراء action file، والتي تُشكّل الجزء الأكبر من العمل. <br>يُحدّد ملف المُرشّح الأسطر التي يبحث عنها <span style="font-family:courier new,courier,monospace;">fail2ban</span> في ملفات السجل لتحديد خصائص المُسيء. بينما يُزوّد ملف الإجراء بجميع الإجراءات المطلوبة، من بناء صيغة لجدار الحماية firewall structure عند بدء تشغيل الخدمة، وحتى إضافة وحذف القواعد، علاوةً على إلغاء صيغة جدار الحماية عند توقّف الخدمة. <br>دعونا ننظر في ملف المُرشّح المدعو بواسطة خدمة SSH لدينا من الإعدادات أعلاه: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/fail2ban/filter.d/sshd.conf </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[INCLUDES]

before = common.conf

[Definition]

_daemon = sshd 
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from ( via \S+)?\s*^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from \s* 
^%(__prefix_line)sFailed \S+ for .? from (?: port \d)?(?: ssh\d*)?(: (ruser .|(\S+ ID \S+ (serial \d+) CA )?\S+ %(__md5hex)s(, client user “.“, client host “.“)?))?\s^%(__prefix_line)sROOT LOGIN REFUSED.* FROM \s* 
^%(__prefix_line)siI user .* from \s*^%(__prefix_line)sUser .+ from  not allowed because not listed in AllowUsers\s* 
^%(__prefix_line)sUser .+ from not allowed because listed in DenyUsers\s*^%(__prefix_line)sUser .+ from  not allowed because not in any group\s* 
^%(__prefix_line)srefused connect from \S+ ()\s*^%(__prefix_line)sUser .+ from  not allowed because a group is listed in DenyGroups\s* 
^%(__prefix_line)sUser .+ from not allowed because none of user’s groups are listed in AllowGroups\s*$ 
ignoreregex = </pre><p>يبدو هذا مُعقّدًا للغاية، لنبسطّه قليلًا فيما يلي. <br>يُحدّد المقطع <span style="font-family:courier new,courier,monospace;">[INCLUDES]</span> الملفات الأخرى التي ستتم قراءتها قبل أو بعد الملف، في مثالنا هذا يُقرأ الملف <span style="font-family:courier new,courier,monospace;">common.conf</span> وتُوضع محتوياته أمام الأسطر الأخرى من الأصل، وهذا ما يُضيف بعض المعاملات اللازمة لضبط الإعدادات لدينا. <br>بعد ذلك لدينا المقطع<span style="font-family:courier new,courier,monospace;"> [Definition]</span> والذي يُحدّد القواعد الفعلية لمطابقات المرشّح. بدايةً نُحدّد اسم خدمة daemon المراقبة بواسطة المعامل _daemon. <br>ومن ثمّ يأتي تعريف المتغيّر <span style="font-family:courier new,courier,monospace;">failregex</span> المُحدّد بواسطة أنماط تبحث عن أية أسطر مطابقة في ملفات السجل، وهي عبارة عن تعابير نمطيّة Regular Expressions تتطابق مع مختلف الأخطاء والإخفاقات التي يمكن أن تحدث عندما لا تتم مصادقة تسجيل الدخول بشكل صحيح. <br>فعلى سبيل المثال يُستبدل الجزء <span style="font-family:courier new,courier,monospace;">prefix_line)s__)%</span> من التعريف السابق مع قيمة معاملات الإعداد من ملف <span style="font-family:courier new,courier,monospace;">common.conf</span>.  يُستخدم هذا التعبير لمطابقة المعلومات التي تكتبها أنظمة التشغيل إلى ملفات السجل عندما تستخدم الأساليب القياسية. فعلى سبيل المثال بعض الأسطر من السجل <span style="font-family:courier new,courier,monospace;">var/log/auth.log/</span> قد تبدو مثل هذا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">May 6 18:18:52 localhost sshd[3534]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.79.130.213 
May 6 18:18:54 localhost sshd[3534]: Failed password for invalid user phil from 101.79.130.213 port 38354 ssh2 
May 6 18:18:54 localhost sshd[3534]: Received disconnect from 101.79.130.213: 11: Bye Bye [preauth] 
</pre><p>الجزء الملّون بالأحمر يُمثّل نمطًا قياسيًا standard pattern مُدرجًا من قبل نظام التشغيل لدعم السياق context. بعد ذلك هناك عدد غير قليل من الطرق المختلفة التي يمكن لخدمة iptables كتابة محاولات الفشل وفقها إلى السجل. <br>يحتوي ملف السجل السابق على محاولتي تسجيل دخول فاشلتين في السطرين الأوّل والثاني (إحداهما خطأ مصادقة من نوع PAM والأخرى خطأ كلمة مرور)، يتم تعريف التعابير النمطية في المرشّح لمطابقة أي سطر يحمل رسالة فشل في المصادقة، لا ينبغي عليك أن تعدّل أيٍ من هذه الأسطر، لكنك يجب أن تكون مدركًا لأهمية العثور على جميع مُدخلات السجل الدالة على وقوع خطأ استخدام غير مُصرّح به للتطبيق الذي تعمل على حمايته؛ فيما لو رغبت بتصميم مرشّح خاص بشكل يدوي. <br>في الجزء السفليّ من الملف يمكنك أن ترى المعامل ignoreregex فارغ حاليًا، والذي يمكن استخدامه لاستبعاد أنماط أكثر تحديدًا تطابق عادةً حالات فشل مصادقة لا ترغب لـ <span style="font-family:courier new,courier,monospace;">fail2ban</span> بنفيها لاحتمالات مختلفة. لن نُعدّل شيئًا هنا. <br>احفظ الملف وأغلقه بعد الانتهاء من دراسته.</p></div><div id="wmd-preview-section-22"><h2 id="شرح-ملف-الإجراء">شرح ملف الإجراء</h2><p>دعونا الآن نلقي نظرة على ملف الإجراء action file المسؤول عن إعداد جدار الحماية وفق صيغة تُسهّل التعديلات لحظر المُضيفين المُسيئين malicious hosts إضافةً إلى ضمهم أو حذفهم عند الضرورة. <br>وكما تذكرون يُدعى الإجراء الخاص باستدعاء خدمة SSH لدينا بـ iptables-multiport، لنفتح الآن الملف المرتبط بها: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/fail2ban/action.d/iptables-multiport.conf </pre><p>بحذف التعليقات يبدو الملف مشابهًا لهذا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[INCLUDES] 
before = iptables-blocktype.conf

[Definition] 
actionstart = iptables -N fail2ban- 
iptables -A fail2ban- -j RETURN 
iptables -I -p -m multiport –dports -j fail2ban-

actionstop = iptables -D -p -m multiport –dports -j fail2ban-

actioncheck = iptables -n -L | grep -a ‘fail2ban-[ \t]’

actionban = iptables -I fail2ban- 1 -s -j

actionunban = iptables -D fail2ban- -s -j

[Init] 
name = default 
port = ssh 
protocol = tcp 
chain = INPUT 
</pre><p>يبدأ الملف بتضمين محتوى ملف إجراء آخر يُدعى i <span style="font-family:courier new,courier,monospace;">iptables-blocktype.conf</span>والذي يُعرّف ببساطة المُعامل <span style="font-family:courier new,courier,monospace;">blocktype</span> المسؤول عن ضبط القيود التي سيتم فرضها على العميل المحظور. <br>بشكلٍ افتراضي يتم تعيين <span style="font-family:courier new,courier,monospace;">blocktype</span> لرفض الحزم packets الواردة من قبل العميل المحظور وإعادتها مع رسالة تفيد بأنّ المنفذ المطلوب غير قابل للوصول حاليًا، وهذا ما سوف نستخدمه في قواعد الحظر تاليًا. <br>بعد ذلك تأتي تعريفات القواعد نفسها حيث معظم الإجراءات واضحة إلى حدٍ ما، فالإجراء <span style="font-family:courier new,courier,monospace;">actionstart</span> يقوم بإعداد جدار الحماية <span style="font-family:courier new,courier,monospace;">iptables</span> عند بدء تشغيل خدمة <span style="font-family:courier new,courier,monospace;">fail2ban</span>، إذ يُنشئ سلسلة جديدة مُضيفًا إليها قاعدة للعودة إلى سلسلة الدعوة calling chain، ثم يدرج قاعدة في بداية سلسلة INPUT والتي تقوم بتمرير حركة البيانات المُطابقة للبروتوكول والمنفذ الصحيحين المتجهين إلى السلسلة الجديدة. <br>يتم ذلك باستخدام القيم التي قمنا بتمريرها مع الإجراء المُعرّف في ملف <span style="font-family:courier new,courier,monospace;">jail.local</span> الخاص بنا. كما تؤخذ قيمة الخانة name من ترويسة المقطع المرتبط بكلّ خدمة، بينما تؤخذ قيم chain،protocol وport من سطر action نفسه من الملف. <br>ولعلكم تذكرون أن هذه أيضًا - بدورها- أضيفت إلى سطر الإجراء عبر إدخال مُعاملات أخرى مُحددة في أماكن أخرى من هذا الملف. إلى الآن فإن <span style="font-family:courier new,courier,monospace;">fail2ban</span> قد مرّر وحوّل العديد من المُعاملات بين الأجزاء المختلفة من ملفات الضبط الخاصة به. <br>جميع المُعاملات التي تم تعيينها من قبل ملف آخر يُشار إليها عبر تضمين اسم المُعامل بقوسي زاوية: <br><br>عندما ننتقل إلى الأسفل نحو تعريف الإجراء <span style="font-family:courier new,courier,monospace;">actionstop</span> نرى بأن أوامر جدار الحماية تُنفّذ ببساطة عكس أوامر الإجراء <span style="font-family:courier new,courier,monospace;">actionstart</span>؛ حيث نُنهي صيغة جدار الحماية المُنشأة عندما نوقف خدمة <span style="font-family:courier new,courier,monospace;">fail2ban</span>. <br>يتأكّد الإجراء <span style="font-family:courier new,courier,monospace;">actioncheck</span> من إنشاء السلسة المناسبة قبل محاولة إضافة قواعد الحظر. <br>بعد ذلك نصل إلى قاعدة الحظر الفعلية <span style="font-family:courier new,courier,monospace;">actionban</span> والتي تعمل عن طريق إضافة قاعدة جديدة إلى السلسلة المُنشأة، تطابق هذه القاعدة عنوان IP المصدر للعميل المُسيء (يُقرأ هذا المُعامل من قبل سجلات التصريح authorization logs عندما تُبلغ العتبة maxretry) ويتم تأسيس الحظر بتعريف المُعامل <span style="font-family:courier new,courier,monospace;">blocktype</span> الموجود في المقطع <span style="font-family:courier new,courier,monospace;">[INCLUDE]</span> في الجزء العلوي من الملف. <br>تزيل <span style="font-family:courier new,courier,monospace;">actionunban</span> ببساطة القاعدة المُنشأة ويتم ذلك تلقائيًا بواسطة <span style="font-family:courier new,courier,monospace;">fail2ban</span> بعد انقضاء وقت الحظر. <br>أخيرًا نصل إلى القسم <span style="font-family:courier new,courier,monospace;">[Init]</span> والذي يقتصر دوره على تزويد بعض الافتراضات في حال استدعاء ملف الإجراء من دون تمرير جميع القيم اللازمة.</p><p>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server">How Fail2ban Works to Protect Services on a Linux Server</a> لصاحبه Justin Ellingwood.</p></div>
]]></description><guid isPermaLink="false">88</guid><pubDate>Thu, 30 Jul 2015 09:04:21 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x62C;&#x62F;&#x627;&#x631; &#x646;&#x627;&#x631;&#x64A; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; IPTables &#x639;&#x644;&#x649; Ubuntu 14.04</title><link>https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AC%D8%AF%D8%A7%D8%B1-%D9%86%D8%A7%D8%B1%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D8%B9%D9%84%D9%89-ubuntu-1404-r38/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/iptables.png.226ef950f748ed63de7a08a8b0d39f53.png" /></p>

<p>
	إعداد جدارٍ ناريّ قوي هو خطوةٌ أساسية يجب فعلها بهدف تأمين أيّ نظام تشغيلٍ حديث. تأتي معظم توزيعات لينكس بأدواتٍ مختلفة يمكننا استخدامها لضبط جداراتنا الناريّة. في هذا الدرس، سنتحدّث عن جدار iptables الناريّ.
</p>

<p>
	Iptables هو عبارة عن جدارٍ ناريّ عادي موجود في معظم توزيعات لينكس افتراضيًا (برنامجٌ آخر يدعى nftables سيبدأ قريبًا باستبداله). هو في الواقع عبارة عن واجهةٍ أمامية لخطّافات netfilter على مستوى النواة (kernel-level netfilter hooks) يمكنه التعامل مع مكدّس شبكة لينكس (Linux network stack). يعمل iptables عن طريق مطابقة كلّ حزمة (packet) تمرّ عبر الشبكة بمجموعة من القواعد (rules) التي تجعله يقرر ما يجب فعله.
</p>

<p>
	<strong>ملاحظة:</strong> يغطّي هذا الدرس أساسيات الحماية لـIPv4. في نظام لينكس، هناك فرق بين طرق الحماية لـIPv4 و IPv6. كمثال فإنّ iptables يقوم فقط بالتحكّم في قواعد جدار الحماية لعناوين IPv4 إلّا أنّه يمتلك برنامجًا خارجيًا يدعى ip6tables يمكن استخدامه للتحكّم في قواعد جدار الحماية لعناوين IPv6.
</p>

<p>
	إذا كان خادومك الافتراضي الخاصّ مُعدًّا ليستخدم IPv6، فرجاءً تذكّر حماية كلّ من واجهتيّ الشبكة IPv4 و IPv6 باستخدام الأدوات المناسبة. للمزيد من المعلومات عن أدوات IPv6، راجع هذا الدرس: <a href="https://www.digitalocean.com/community/tutorials/how-to-configure-tools-to-use-ipv6-on-a-linux-vps" rel="external nofollow">كيفية ضبط بعض الأدوات لاستخدام </a><a href="https://www.digitalocean.com/community/tutorials/how-to-configure-tools-to-use-ipv6-on-a-linux-vps" rel="external nofollow">IPv6 </a><a href="https://www.digitalocean.com/community/tutorials/how-to-configure-tools-to-use-ipv6-on-a-linux-vps" rel="external nofollow">على نظام لينكس</a>.
</p>

<h2>
	أوامر iptables الأساسية
</h2>

<p>
	الآن وبعد أن صار لديك المفاهيم الأساسية حول iptables، فإنّه يجب علينا تغطية الأوامر الأساسية التي سيتم استعمالها لتشكيل مجموعات قواعد iptables أكبر بالإضافة إلى إدارة واجهة iptables بشكلٍ عام.
</p>

<p>
	أولًا، يجب عليك أن تنتبه إلى أنّ أوامر iptables يجب أن يتم تشغيلها بصلاحيات الجذر (root privileges). هذا يعني أنّه يجب عليك الولوج إلى النظام باسم المستخدم root، استخدم su أو sudo -i للولوج إلى صدفة المستخدم الجذر، أو يمكنك ببساطة وضع sudo قبل جميع الأوامر التي ستطبّقها. سنستخدم sudo في هذا الدرس بما أنّها طريقة شائعة الاستخدام على نظام Ubuntu.
</p>

<p>
	نقطة جيدة للبداية بها هي كيفية سرد قواعد iptables المُستخدمة حاليًا. يمكنك فعل هذا باستخدام الخيار -L :
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
Chain FORWARD (policy ACCEPT)
target prot opt source destination 
Chain OUTPUT (policy ACCEPT)
target prot opt source destination</pre>

<p>
	كما يمكنك أن ترى، لدينا ثلاث سلاسل (chains) هنا. يمكننا أيضًا أن نرى السياسة المتّبعة في كلّ سلسلة (كل سلسلة افتراضيًا تمتلك سياسة ACCEPT للاتصالات المارّة منها). يمكننا أيضًا رؤية بعض ترويسات العواميد في ناتج الأمر السابق، إلّا أنّنا فعليًا لا نرى أيّ قواعد مطبّقة. هذا بسبب أنّ Ubuntu لا تأتي مع مجموعةٍ افتراضية من قواعد iptables.
</p>

<p>
	يمكننا رؤية الخرج بصيغةٍ تعكس الأوامر الضرورية لتفعيل كلّ قاعدة وسياستها عبر استخدام الخيار -S :
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT</pre>

<p>
	لإعادة إنتاج الإعدادات وتطبيقها من جديد، سيجب علينا فقط كتابة الأمر sudo iptables متبوعًا بكلّ واحدٍ من السطور الظاهرة في الخرج. (اعتمادًا على الإعدادات، قد يكون الأمر أكثر تعقيدًا في حال كنّا متّصلين عن بعد إلى الخادوم حيث أننا لا نريد إضافة قواعد iptables معيّنة تمنع جميع الاتصالات الواردة إليها مثلًا دون استثناء اتّصالنا الحالي لكي لا ينقطع فجأة ولكي يبقى متّصلًا).
</p>

<p>
	إذا كان لديك قواعد بالفعل لديك في iptables وكنتَ ترغب بإتلافها والبدء من جديد، فيمكنك فعل ذلك عبر تطبيق:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -F</pre>

<p>
	مرةً أخرى، سياسة قبول الاتصالات أو رفضها مهمّة هنا، لأنّه وبينما يتم حذف جميع القواعد الأخرى من السلاسل الخاصّة بك، فإنّ السياسة الافتراضية لن تتغيّر باستخدام هذا الأمر. هذا يعني أنّه في حال كنت متّصلًا عن بعد بخادومك، فإنّه يجب عليك التأكّد من أنّ السياسة الافتراضية لسلسلتيّ INPUT و OUTPUT هي ACCEPT بالتزامن مع قيامك بإتلاف قواعدك السابقة. يمكنك فعل ذلك عبر تطبيق الأوامر التاليّة:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables -F</pre>

<p>
	يمكنك تغيير سياسة الحظر أو الترك (drop) مجددًا إلى DROP بعد أن تقوم بإعداد القواعد التي تسمح ببقاء اتّصالك الحالي. سنفصّل كيفيّة ذلك بعد قليل.
</p>

<h2>
	إنشاء قاعدتك الأولى
</h2>

<p>
	سنبدأ ببناء سياسة جدار الحماية الخاصّ بن حول قبول أو رفض الاتصالات. كما قلنا أعلاه، فإنّنا سنعمل مع سلسلة INPUT بما أنّها المصدر الرئيسي لتدفّق الزوار القادم إلى خادومنا. سنبدأ مع القاعدة التي تحدّثنا عنها مسبقًا من قبل بالأعلى: القاعدة التي تسمح لنا بشكل خاص بمتابعة اتّصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> الحالي.
</p>

<p>
	القاعدة الكاملة التي نحتاج إليها هي هذه:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT</pre>

<p>
	قد يبدو هذا معقّدا للغاية لك في الوهلة الأولى، إلّا أنّ معظم مكوّنات الأمر السابق ستكون ذات معنى بالنسبة لك عندما تفهمها:
</p>

<ul>
<li>
		<p>
			-A INPUT: يقوم الخيار -A بإضافة قاعدةٍ ما إلى نهاية السلسلة المطلوبة. هذا هو الجزء الذي يقوم بإخبار iptables بأنّنا نريد إضافة قاعدةٍ جديدة إلى سلسلة معيّنة، والسلسلة التي نريدها في مثالنا حاليًا هي سلسلة INPUT.
		</p>
	</li>
	<li>
		<p>
			-m conntrack: يمتلك iptables عدّة وظائف داخليّة، ولكنّه أيضًا يمتلك مجموعةً من الامتدادات والوحدات التي تقوم بتوفير مزايا إضافيّة. إنّنا نقوم في هذا الجزء من الأمر بإخبار iptables بأنّنا نريد الحصول على إذن بالوصول إلى الوظيفة التي يتم توفيرها عبر الوحدة المسماة "conntrack”. تعطينا هذه الوحدة وصولًا إلى الأوامر التي يمكن أن يتم استخدامها بناءً على علاقة حزمة البيانات الداخلة بالاتّصال السابق.
		</p>
	</li>
	<li>
		<p>
			--ctstate: هذا واحدٌ من الأوامر التي أصبحت متوفّرة بعد أن تم استدعاء وحدة "conntrack”. يسمح لنا هذا الأمر بمطابقة حزم البيانات بناءً على ماهيّة ارتباطها بحزم البيانات التي رأيناها من قبل. إننا نقوم بتمرير قيمة ESTABLISHED للسماح بمرور حزم البيانات الداخلة التي هي جزء من اتّصالٍ عاملٍ حاليًا فقط. ونقوم بتمرير قيمة RELATED للسماح بمرور حزم البيانات المرتبطة باتّصالٍ مُنشَئٍ بالفعل. هذا الجزء من القاعدة هو الجزء الذي يتطابق مع جلسة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> الحالية الخاصّة بنا.
		</p>
	</li>
	<li>
		<p>
			-j ACCEPT: يقوم هذا الخيار بتحديد هدف مطابقة حزم البيانات. هنا، نقوم بإخبار iptables أنّ حزم البيانات التي تطابق القاعدة السابقة يجب أن يتم السماح لها بالمرور.
		</p>
	</li>
</ul>
<p>
	قمنا بوضع هذه القاعدة في البداية لأننا أردنا أن نتأكّد أنّ اتصالنا الحالي مطابق، مقبول وخارج إطار السلسلة قبل تنفيذ أيّ قواعد DROP.
</p>

<p>
	يمكننا الآن رؤية حالة التغييرات التي قمنا بها عن طريق:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -L

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination</pre>

<p>
	الآن وبعد أن صرتَ تعرف الصياغة العامّة لقواعد iptables، فلنتابع عبر استعراض المزيد من الحالات التي سنحتاج فيها إلى قبول الاتّصالات.
</p>

<h2>
	قبول الاتّصالات المهمّة الأخرى
</h2>

<p>
	أخبرنا iptables أن يبقي أيّ اتصالاتٍ مفتوحة على وضعها الحالي بالإضافة إلى السماح بالاتصالات الجديدة المرتبطة بتلك الاتصالات. على كلّ حال، نحتاج إلى إنشاء بعض القواعد الضرورية لتحديد متى نريد قبول اتّصالاتٍ جديدة لا تطابق هذه المعايير التي طبّقناها.
</p>

<p>
	نريد إبقاء منفذين اثنين مفتوحين بالتحديد. نريد إبقاء منفذ اتّصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> الخاصّ بنا مفتوحًا (سنفترض في هذا الدرس أنّ المنفذ الافتراضي له هو المنفذ 22. إذا كنتَ غيّرت هذا المنفذ على خادومك من إعدادات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> فقم بتعديل قيمته هنا). سنقوم أيضًا بافتراض أنّ هذا الحاسوب يقوم أيضًا بتشغيل خادوم ويب يعمل على المنفذ 80. إذا لم يكن هذا هو نفس الوضع بالنسبة لك فلن تحتاج تطبيق القاعدة التالية.
</p>

<p>
	السطران اللذان سنستعملهما لتطبيق هذه القواعد هما:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT</pre>

<p>
	كما يمكنك أن ترى، هذه القواعد مشابهة جدًا لقاعدتنا الأولى التي كتبناها، ولكنها ربما تكون أكثر بساطةً. الخيارات الجديدة هي:
</p>

<ul>
<li>
		<p>
			-p tcp: يقوم هذا الخيار بمطابقة حزم البيانات في حال كان البروتوكول المستخدم هو TCP. هذا البروتوكول هو بروتوكولٌ مستخدم بواسطة معظم التطبيقات لأنّه يسمح بتواصلٌ مرن وقوي بين المستخدم والتطبيق.
		</p>
	</li>
	<li>
		<p>
			--dport: يكون هذا الخيار متوفّرًا للاستخدام فقط في حال كان الخيار -p tcp موجودًا في الأمر. إنّه يقوم أيضًا بتحديد رقم المنفذ الذي يجب مطابقة حزم البيانات عبره. تقوم القاعدة الأولى بمطابقة حزم البيانات المارّة عبر بروتوكول TCP بالمنفذ 22، بينما تقوم الثانية بمطابقتها عبر المنفذ 80.
		</p>
	</li>
</ul>
<p>
	هناك قاعدة ACCEPT أخرى يجب علينا التأكّد من أنّ خادومنا يقبلها بشكل صحيح. غالبًا، تتواصل الخدمات (services) مع بعضها البعض على الحاسوب عبر إرسال حزم بياناتٍ فيما بينها، وهي تقوم بذلك عبر الاستفادة من واجهة شبكةٍ زائفة تدعى loopback device ، والتي تقوم بتوجيه التدفّق إلى نفسها عوضًا عن الأجهزة الأخرى.
</p>

<p>
	لذا إذا كانت واحدة من الخدمات تريد التواصل مع خدمةٍ أخرى تستمع إلى المنفذ 4555، فإنّه بمقدورها إرسال حزمة بيانات إلى المنفذ 4555 على الشبكة الزائفة loopback device. نريد أن يتم السماح بهذا النوع من السلوك بين الخدمات لأنّه ضروري للعديد من برامج نظام التشغيل.
</p>

<p>
	القاعدة التي نحتاج تطبيقها هي هذه:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -I INPUT 1 -i lo -j ACCEPT</pre>

<p>
	يبدو هذا الأمر مختلفًا قليلًا عن الأوامر السابقة. فلنشرح ما يفعله:
</p>

<ul>
<li>
		<p>
			-I INPUT 1: يقوم الخيار -I بإخبار iptables بإدراج قاعدةٍ جديدة. هذا الخيار مختلف عن الخيار -A والذي يقوم بإضافة القاعدة الجديدة إلى نهاية قواعد iptables. يحتاج الخيار -I إلى اسم السلسلة والمكان الذي تريد إدراج القاعدة الجديدة فيه.
		</p>
	</li>
</ul>
<p>
	في حالتنا، فإننا نقوم بإضافة هذه القاعدة كأول قاعدة في سلسلة INPUT. هذا سيدفع بقية القواعد إلى الأسفل بدرجةٍ واحدة تلقائيًا. نحتاج لهذه القاعدة أن تكون بالأعلى لأنّها أساسية ولا يجب أن يتم التأثير عليها عبر قواعد فرعيّة أخرى.
</p>

<ul>
<li>
		<p>
			-i lo: يقوم هذا المكوّن من القاعدة بمطابقة ما إذا كانت الواجهة التي تستخدمها حزمة البيانات هي واجهة "lo”. واجهة "lo” هي عبارة عن اسمٍ آخر لـloopback device. هذا يعني أنّ أيّ حزمةِ بياناتٍ تستعمل تلك الواجهة الشبكيّة للتواصل (حزم البيانات الناتجة في خادومنا، إلى خادومنا) يجب أن يتم قبولها من طرف iptables.
		</p>
	</li>
</ul>
<p>
	لرؤية قواعدنا الحاليّة، يجب أن نستخدم الخيار -a . هذا بسبب أنّ الخيار -L لا يتضمّن بعض المعلومات، مثل اسم الواجهة المرتبطة بالقواعد، والذي يعتبر جزءًا مهمًّا في القاعدة التي قمنا بإضافتها:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT</pre>

<h2>
	تضمين قاعدة حظر (Drop)
</h2>

<p>
	نمتلك الآن 4 قواعد منفصلة تقبل الاتصالات بناءً على معايير معيّنة. وبالرغم من ذلك، فإنّا خادومنا حاليًا لا يحظر وصول أيّ شيء إليه.
</p>

<p>
	إذا دخلت حزمة بياناتٍ إلى سلسلة INPUT ولم تكن مطابقة لأيٍّ من القواعد الأربعة التي أدخلناها، فإنّه سيتم تحويلها إلى السياسة الافتراضية للتعامل مع حزم البيانات، والتي هي حاليًا "قبول حزم البيانات جميعها"، ونحتاج لتغيير هذا الأمر.
</p>

<p>
	هناك طريقتان يمكننا فعل ذلك بهما، مع بعض الاختلافات الجوهرية.
</p>

<p>
	الطريقة الأولى التي يمكننا من خلالها القيام بهذا هي عن طريق تعديل السياسة الافتراضية لسلسلة INPUT. يمكننا القيام بذلك عبر كتابة:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -P INPUT DROP</pre>

<p>
	ستقوم القاعدة السابقة بالتقاط أيّ حزم بياناتٍ تفشل بالمرور عبر سلسلة INPUT الخاصّة بنا ويمنع وصولها إلى الخادوم. هذا ما ندعوه بسياسة المنع الافتراضيّة (default drop policy)، من مساوئ هذه الطريقة هي أنّ قاعدة الـDROP هذه يتم إلغاؤها في حال تم مسح قواعد iptables (حيث أنّها قاعدة هي الأخرى وبالتالي سيتم مسحها معها).
</p>

<p>
	قد تكون هذه الطريقة أكثر أمنًا، ولكنك قد تواجه عواقب وخيمة في حال لم يكن لديك طريقةٌ أخرى للوصول إلى خادومك. في DigitalOcean، يمكنك الولوج عبر لوحة التحكّم إلى خادومك والوصول إلى طرفيّة ويب تمكّنك من التحكّم به إذا حصل هذا. طرفيّة الويب هذه تعرّف نفسها على أنّها اتصال وهمي محلّي ولذلك فإنّ قواعد iptables لا تؤثّر عليها.
</p>

<p>
	قد تودّ لخادومك أن يقوم بحظر جميع الاتصالات في حال مسح جميع القواعد. قد يمنع هذا من ترك خادومك مفتوحًا للجميع. وهذا يعني أيضًا أنّه بمقدورك بسهولة إضافة القواعد إلى نهاية أيّ سلسلة تريدها بينما تحظر حزم البيانات التي لا تريدها بسهولة.
</p>

<p>
	إذا قمتَ بتغيير السياسة الافتراضيّة لسلسلة INPUT، فإنّه يمكنك إرجاعها عبر تطبيق:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -P INPUT ACCEPT</pre>

<p>
	الآن، يمكنك إضافة قاعدة إلى نهاية السلسلة والتي ستقوم بحظر أيّ حزم بياناتٍ متبقية:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -A INPUT -j DROP</pre>

<p>
	النتائج تحت شروطٍ تشغيلية عادية ستكون بالضبط هي نفس سياسة الحظر الافتراضيّة. تعمل هذه القاعدة عبر مطابقة كلّ حزمة بياناتٍ متبقية تصل إليها. يمنع هذا حزمةَ البيانات من الوصول إلى الخادوم في حال فشلت بتجاوز القواعد السابقة التي قمنا بإنشائها.
</p>

<p>
	بشكلٍ عام، يتم استخدام هذه القاعدة لجعل السياسة الافتراضيّة في التعامل مع الاتصالات تقبل التدفّق الواصل إليها. بهذه الطريقة، في حال كان هناك أيّ مشاكل وتم مسح جميع القواعد، فإنّك ستبقى قادرًا على الوصول إلى الآلة عبر الشبكة.
</p>

<p>
	بالطبع، هذا يعني أيضًا أنّ أيّ قاعدةٍ إضافية تودّ إضافتها إلى نهاية السلسلة يجب أن تكون قبل قاعدة الحظر أو الـdrop. يمكنك فعل هذا عبر حذف قاعدة الحظر مؤقتًا عبر:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -D INPUT -j DROP
$ sudo iptables -A INPUT new_rule_here
$ sudo iptables -A INPUT -j DROP</pre>

<p>
	أو، يمكنك إدراج القواعد التي تحتاجها في نهاية السلسلة (ولكن قبل قاعدة الـdrop) عبر تحديد رقم السطر. لإدراج قاعدةٍ في السطر رقم 4، يمكنك كتابة:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -I INPUT 4 new_rule_here</pre>

<p>
	إذا كنتَ تواجه مشاكل في معرفة إلى أيّ سطرٍ تنتمي أيّ قاعدة، فيمكنك إخبار iptables بأن يقوم بسرد السطور المتوفّرة عبر:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo iptables -L –line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
3 ACCEPT tcp -- anywhere anywhere tcp dpt:<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>
4 ACCEPT tcp -- anywhere anywhere tcp dpt:http

Chain FORWARD (policy ACCEPT)
num target prot opt source destination

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination</pre>

<p>
	يمكن لهذا أن يكون مفيدًا للتأكّد من أنّك تضيف القاعدة إلى مكانها الصحيح.
</p>

<h2>
	حفظ إعدادات iptables الخاصّة بك
</h2>

<p>
	افتراضيًا، تكون القواعد التي تضيفها إلى iptables غير دائمة. هذا يعني أنّك عندما تقوم بإعادة تشغيل خادومك، فإنّ جميع قواعد iptables ستختفي.
</p>

<p>
	هذه المشكلة في الواقع هي ميّزة لبعض المستخدمين لأنّها تعطيهم فرصةً للعودة إلى التحكّم بالخادوم في حال قاموا بحبس أنفسهم خارجها عن طريق الخطأ في تطبيق القواعد. وعلى كلّ حال، معظم المستخدمين سيودّون أن يكون هناك طريقة تلقائية لحفظ القواعد التي أنشؤوها وتحميلها تلقائيًا عند إقلاع الخادوم.
</p>

<p>
	هناك عدّة طرق لفعل هذا، لكنّ أسهلها هو باستخدام حزمة iptables-presistent، يمكنك تحميل هذه الحزمة من مستودعات Ubuntu الافتراضيّة:
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
$ sudo apt-get update
$ sudo apt-get install iptables-persistent</pre>

<p>
	أثناء التثبيت، سيتم سؤالك عمّا إذا كنتَ تحبّ حفظ قواعد iptables الحاليّة ليتم تحميلها تلقائيًا. إذا كنتَ مسرورًا مع إعداداتك الحاليّة (واختبرت قدرتك على الوصول إلى اتصالات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> جديدة مستقلة) فإنّه يمكنك الموافقة على ذلك.
</p>

<p>
	سيتم سؤالك أيضًا عمّا إذا كنتَ تريد حفظ قواعد IPv6 التي قمتَ بإعدادها، يتم إعداد هذه القواعد عبر أداة منفصلة تدعى ip6tables والتي تتحكم بحزم بيانات IPv6 بنفس الطريقة.
</p>

<p>
	بمجرّد اكتمال التثبيت، ستتوفر خدمة جديدة لديك تدعى iptables-presistent وهي مُعدّة ليتم تشغيلها عند الإقلاع. ستقوم هذه الخدمة بتحميل قواعد iptables الحاليّة وتطبيقها من جديد في كلّ مرّة يتم إعادة تشغيل النظام فيها.
</p>

<h2>
	الخاتمة
</h2>

<p>
	يجب أن تكون الآن قد امتلكت نقطة بداية جيّدة للبدء في تطوير جدارٍ ناري يلبي احتياجاتك. هناك العديد من أدوات الجدران الناريّة الأخرى التي يمكنك استخدامها والتي قد تكون أسهل، ولكن iptables أداةٌ جيّدة لتعلّمها، ذلك لأنّها توفّر بنية netfilter تحتية جيّدة للاستعمال ولأنّها متوفّرة افتراضيًا في العديد من أنظمة التشغيل.
</p>

<p>
	ترجمة -وبتصرّف- للمقال: <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04" rel="external nofollow">How To Set Up a Firewall Using IPTables on Ubuntu 14.04</a>.
</p>
]]></description><guid isPermaLink="false">38</guid><pubDate>Thu, 30 Apr 2015 18:38:00 +0000</pubDate></item></channel></rss>
