لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 09/03/22 في كل الموقع
-
الإصدار 1.0.0
28382 تنزيل
يشرح هذا الكتاب كيفية كتابة تعليمات ووصفات يفهمها الحاسوب، ومن المعلوم أن الحواسيب شائعة ومنتشرة بحيث لا يخفى ذلك على ذي عقل وشأنها مثل شأن مفكات البراغي، غير أنها أعقد قليلًا وليس من السهل جعلها تنفذ ما تريد منها بالضبط، إلا إذا كانت المهمة التي تريد للحاسوب تنفيذها سهلة الفهم مثل عرض رسائلك البريدية أو تشغيل برنامج الحاسبة، فحينها ما عليك سوى فتح البرنامج المخصص لذلك، لكن حين تكون المهمة التي لديك فريدةً وأبعادها غير معرفة، فلن تجد تطبيقًا متاحًا لها. يأتي هنا دور البرمجة، فهي الفعل الذي يصف بناء برنامج يتكون من مجموعة أوامر محدَّدة جدًا لتخبر الحاسوب بما يجب فعله، وتُعَدّ الحواسيب بصفتها آلات غبية لا تستطيع فهم البرمجة ولا استيعابها، لكن إذا غضضت النظر عن هذا ورأيت أنه من الممتع والمسلِّي التفكير بمنطق يشبه ذاك الذي تفهمه تلك الآلات فستجد البرمجة أمرًا مسلِّيًا جدًا ونافعًا، فهي تتيح لنا اختصار زمن الأشياء التي ننفذها يدويًا وتستغرق أوقاتًا طويلةً إلى ثواني معدودة، وعليه يمكن النظر إليها على أنها طريقة تجعل حاسوبك يقوم بأمور لم يكن يستطيعها من قبل، وهي في ذاتها -أي البرمجة- بهذا الفهم تكون تدريبًا ممتازًا على التفكير النظري المجرَّد. دورة تطوير التطبيقات باستخدام لغة JavaScript تعلم البرمجة بلغة جافا سكريبت انطلاقًا من أبسط المفاهيم وحتى بناء تطبيقات حقيقية. اشترك الآن كما نوجه هذه الآلات لما نريده من خلال إعطائها أوامر محدَّدة كما ذكرنا، وتكون هذه الأوامر أو البرامج من خلال لغات خاصة بالبرمجة، وهي لغات أُنشئت عمدًا لتُستخدَم في برمجة الحواسيب، ومما يعجب المرء له أن البشر في تطويرهم للأسلوب الذي يتعاملون به مع الحاسوب لم يجدوا أفضل من الطريقة التي يتواصلون بها مع بعضهم بعضًا، فلغات البرمجة الحوسبية تشبه لغات البشر في إمكانية استخدام الكلمات والجمل في صور مختلفة لكتابة تعليمات جديدة في كل مرة تكتب برنامجًا فيها. كانت لغة بيزيك Basic ونظام دوس DOS في الثمانينيات والتسعينيات من القرن الماضي هما الطريقتان الأساسيتان في التعامل مع الحواسيب، وهما أنظمة نصية بالكامل من غير واجهة رسومية مثل التي تراها الآن أمامك على الشاشة، وقد استبدلنا الواجهات المرئية بهما منذ ذلك الحين بما أنها أسهل في التعلم للمستخدِم رغم أنها محدودة الإمكانيات موازنة بالواجهات النصية، لكن لا زالت لغات الحاسوب موجودةً، فإذا أمعنت النظر فسترى أنّ لغةً مثل جافاسكربت JavaScript موجودة في كل متصفح تستخدِمه أنت وهي في كل حاسوب تقريبًا، وإنّ مراد هذا الكتاب الذي بين يديك هو جعلك تألف التعامل مع هذه اللغة لتستخدِمها في صنع برامج نافعة لك ولعملائك. هذا الكتاب هو النسخة العربية المترجمة عن كتاب Eloquent JavaScript الشهير لصاحبه مارين هافربيك Marijn Haverbeke، ويقع في ثلاثة أجزاء، إذ يناقش أول جزء فيها لغة جافاسكربت في اثني عشر فصلًا؛ أما الفصول السبعة التالية فهي عن متصفحات الويب والأسلوب الذي تُستخدَم لغة جافاسكربت به لبرمجتها، ثم في النهاية فصلين آخرين مخصصين لبيئة أخرى لتشغيل جافاسكربت فيها وهي Node.js، كما سيكون في هذا الكتاب خمسة فصول عملية بها مشاريع تصف برامج كبيرة لتعطيك لمحةً عن البرمجة الحقيقية، وهي بناء روبوت توصيل ولغة برمجة ولعبة وبرنامج رسم بالبكسلات وموقعًا ديناميكيًا. هذا الكتاب مرخص بموجب رخصة المشاع الإبداعي Creative Commons «نسب المُصنَّف - غير تجاري - الترخيص بالمثل 4.0». يمكنك قراءة فصول الكتاب على شكل مقالات مجموعة ضمن وسم «إِلِكوَنت جافاسكريبت» وتجد روابطها تاليًا: القيم والأنواع والعوامل في جافاسكريبت (الجزء الأول: اللغة) هيكل البرنامج في جافاسكريبت الدوال في جافاسكريبت هياكل البيانات: الكائنات والمصفوفات في جافاسكريبت الدوال العليا في جافاسكريبت الحياة السرية للكائنات في جافاسكريبت مشروع تطبيقي لبناء رجل آلي (روبوت) عبر جافاسكريبت الزلات البرمجية والأخطاء في جافاسكريبت التعابير النمطية Regular Expressions في جافاسكريبت الوحدات Modules في جافاسكريبت البرمجة غير المتزامنة في جافاسكريبت مشروع بناء لغة برمجة خاصة علاقة جافاسكريبت بتطور الإنترنت والمتصفحات (الجزء الثاني: المتصفح) نموذج كائن المستند في جافاسكريبت معالجة الأحداث في جافسكربت مشروع لعبة منصة باستخدام جافاسكربت الرسم على لوحة في جافاسكربت HTTP والاستمارات في جافاسكربت إنجاز مشروع محرر رسوم نقطية باستخدام جافاسكربت بيئة Node.js: استخدام جافاسكربت خارج المتصفح (الجزء الثالث: بيئة Node) مشروع بناء موقع لمشاركة المهارات باستعمال Node.js3 نقاط -
2 نقاط
-
مرحباً وضعت رابط ضمن صفحة الويب لينتقل إلى الموضوع ضمن نفس الصفحة , عندما يضع المستخدم مؤشر الماوس فوق الرابط يظهر عنوان الصفحة أسفل الشاشة , أريد إخفاء ذلك أو عدم حدوثه . هل هناك طريقة بواسطة css ؟1 نقطة
-
كيف ارفع ملف الموقع علئ استظافه مدفوعه او مجانيه)(data php html css jquary l)1 نقطة
-
السلام عليكم. في الكود التالي let arr = ["ahmed","mohamed","mahmoud","ali","omar"] const btn = document.querySelector('button') function sayHello() { let i=0 btn.addEventListener('click', ()=>{ console.log(`Hello I'm ${arr[i]}`) i++ }) } setTimeout(sayHello,3000) عندما أضغط على الزر تظهر الرسالة مباشرة و ليس بعد 3 ثواني. الرجاء المساعدة و شكرا.1 نقطة
-
أريد تحويل كائن Date إلى نص ولكن بصيغة YYYYMMDD ، وما أقوم به هو إستخدام مجموعة من التوابع مثل getMonth و getFullYear و getDay .. إلخ. هل توجد طريقة أفضل من هذه لتحويل كائن Date إلى صيغة YYYYMMDD مباشرة بدلًا من إستعمال العديد من التوابع معًا؟1 نقطة
-
في الكود التالي قيمة b في الحالتين تساوي 0. الرجاء التوضيح. الكود: let a = true let b = 0 if (a) { b === 1 console.log(b); } console.log(b)1 نقطة
-
b في الحالتين تساوي 0 لأنك لم تغيير قيمة الـ b في أي مكان في الكود الخاص بك، والشكل الصحيح للكود الذي تحاول تطبيقه هو : let a = true let b = 0 if (a) { // b الكود التالي لا يقوم بإسناد اي قيمة للـ // b === 1 // كيفية الاسناد الصحيحة b = 1 console.log(b); // 1 } console.log(b) // 1 لأن b === 1 هي عبارة عن وظيفة تعيد true إذا كان b يساوي 1 في القيمة والنوع، وإلا فإنها تعيد false. تعرف اكثر عن المعامل "===" من موسوعة حسوب أما b = 1 فهي عبارة عن اسناد القيمة 1 للمتغير b. لاحظ الكود التالي : let a = true let b = 0 if (a) { console.log(b === 1) // false b = 1 console.log(b === 1) // true }1 نقطة
-
وضعت رابط ضمن صفحة الويب لينتقل إلى الموضوع ضمن نفس الصفحة , ولينتقل ببطء وضعت سمة scroll-behavior:smooth . هل يمكن التحكم بسرعة السكرول ليكون أبطأ مثلاً كما نتحكم ببعض الميزات بواسطة : transition أو animation ?1 نقطة
-
يمكن تنفيذ الـ scroll الذي تتحدث عنه باستخدام JS، لاحظ المثال التالي : <a href="#" id="myBtn">رابطي</a> <div style="height: 2000px">عبارة عن قسم طويل جداً</div> <div id="myTarget">العنصر المستهدف</div> <script> // اربط العنصر المستهدف بالرابط الخاص بك وحدد الزمن التي تريد ان تستغرقه العملية document.getElementById("myBtn").onclick = function (e) { e.preventDefault(); const myTarget = document.getElementById("myTarget"); scrollTo(myTarget, 10000); // ستحتاج 10 ثواني للوصول إلى العنصر المستهدف }; function scrollTo(element, duration) { var e = document.documentElement; if (e.scrollTop === 0) { var t = e.scrollTop; ++e.scrollTop; e = t + 1 === e.scrollTop-- ? e : document.body; } scrollToC(e, e.scrollTop, element, duration); } function scrollToC(element, from, to, duration) { if (duration <= 0) return; if (typeof from === "object") from = from.offsetTop; if (typeof to === "object") to = to.offsetTop; scrollToX(element, from, to, 0, 1 / duration, 20, easeOutCuaic); } function scrollToX(element, xFrom, xTo, t01, speed, step, motion) { if (t01 < 0 || t01 > 1 || speed <= 0) { element.scrollTop = xTo; return; } element.scrollTop = xFrom - (xFrom - xTo) * motion(t01); t01 += speed * step; debugger; setTimeout(function () { scrollToX(element, xFrom, xTo, t01, speed, step, motion); }, step); } function easeOutCuaic(t) { t--; return t * t * t + 1; } </script> كما يمكنك تنفيذ الوظيفة نفسها باستخدام الوظيفة animate في jQuery.1 نقطة
-
هناك طريقة و هي القيام بجعل الصفحة أبعد و بالتالي يبدو ال scroll أبطئ، كمثال على ذلك من الواقع فإنك ترى الطائرة في السماء و كأنها بطيئة و تشعر بأن سيارة قربك أسرع منها و لكن ذلك نتيجة وهم المسافة. و بالتالي يمكن القيام بنفس الأمر مع الموقع عن طريق دفعه إلى الخلف باستعمال الخاصية transform و طبعا سنضطر إلى القيام ب scale للموقع ﻷنه سيبدو أصغر. يمكن القيام بذلك بالشكل التالي: <body> <div class="scroll"> <div class="scroll2"> ... </div> </div> </body> body { padding: 0; overflow: hidden; } .scroll { width: 100vw; height: 100vh; overflow-y: auto; overflow-x: hidden; perspective: 1px; transform-style: preserve-3d } .scroll2 { transform: translateZ(-1px) scale(2); }1 نقطة
-
لا يمكن إخفاء الاقتراح الذي يظهر اسفل الشاشة عند الإشارة إلى رابط معين باستخدام CSS. ولكن يمكنك فعل ذلك باستخدام JS بعدم وضع href للعنصر a أو جعلها مساوية للـ # href = '#' وإضافة وظيفة onClick للعنصر a الخاص بك تقوم بعملية الانتقال إلى الجزء الذي تريده من الصفحة. <a href="#" onclick="window.location.href='#someWher'">رابطي</a> <!-- أو يمكنك استخدام الشكل التالي --> <a href="#" style="cursor: pointer" onclick="window.location.href='#someWher'">رابطي</a>1 نقطة
-
كيف يمكنني الحصول على عارض شرائح شكله مطابق تماما للصورة 1 وكيف اضع خلفية المربع للصورة المعروضة .. هل يوجد طريقة سريعة لانه يسكون هناك الكثير من عارض الشرائح بشكل مكرر في صفحتين من الموقع سيكون هناك العشرات من عارض الشرائح والكثير من الصور ملاحظة اعمل على مشروع حقيقي غير تدريبي واقتربت من انهائه كلياً ، بعد البحث الطويل على النت لم اصل الى النتيجة المطلوبة ،يمكنك رؤية الشكل الذي وصلت اليه في الصورة 2 .....باستخدام bootstrap5 ارجو المساعدة شكرا جزيلا1 نقطة
-
أحاول إستعمال مكتبة React-router لإضافة ميزة التنقل بين الصفحات في أحد مشاريع React.js ولكن عندما قمت بإنشاء بعض المسارات Routes ظهر لي الخطأ التالي: Error: A Route is only ever to be used as the child of element, never rendered directly. Please wrap your Route in a Routes. لم أفهم سبب الخطأ، وما معني "wrap your Route in a Routes" هنا الكود الخاص بي: import { Route } from "react-router-dom"; function App() { return ( <div> <Route path = "/"> <div>Home Page</div> </Route> <Route path = "/about"> <div>About Us Page</div> </Route> </div> ); } export default App; وقمت بالتأكد من إضافة BrowserRouter إلى المشروع: import ReactDOM from 'react-dom'; import { BrowserRouter } from 'react-router-dom'; import App from "./App"; ReactDOM.render( <BrowserRouter> <App /> </BrowserRouter>, document.getElementById('root') );1 نقطة
-
1 نقطة
-
1 نقطة
-
بحسب الصورة التي أرفقتها فأظن انك تريد موقع يقدم أيقونات ملونة وبجودة عالية، و يوجد العديد من مواقع التي تقدم هذه الايقونات ومن اشهرها : svgrepo freesvg flaticon icons8 iconfinder1 نقطة
-
قمت بتعديل محال عد القيم بحيث يتوقف عن الخلية الحالية =IF(COUNTIFS($A$1:$A1,$A1,$B$1:$B1,$B1)>1,"","تم") وأصبحت النتيجة أفضل كما ترغب1 نقطة
-
إن بعض خواص جافاسكربت تختلف بين بيئة المتصفح و بيئة Node مثلا document و prompet تتواجد فقط في المتصفح، ولن تعمل من خلال Node.JS. إما تكتب جافاسكربت في المتصفح في console في أدوات المطورين التي تفتح من خلال F12 أو ربط ملف جافاسكربت مع ملف HTML وفتح الأخير في المتصفح.1 نقطة
-
1 نقطة
-
إن طريقة عمل Google Sheet هي كذلك، يقوم بتحديث كامل الجدول و إعادة تنفيذ الدوال بذلك، حسب طلبك (( عند إضافة حقل مكرر)) سوف لن يكتب بجانبه "تم" أي فقط ستظهر للحقول غير المكررة1 نقطة
-
1 نقطة
-
أريد أن أعمل خيارين فقط في parametrs لأحد url ، مثلا exemple.com/fr , exemple.com/ar فقط بمعنى اريد ان اعمل url ب regex بحيث يحقق فقط ar و fr1 نقطة
-
بما أنك تريد القيام بذلك من أجل اللغة فهناك طريقة أفضل من استعمال ال regex لذلك، و هو استعمال ال i18_patterns بحيث تقوم بإحاطة ال urls التي تريد أن يكون خيار اللغة مفعل من أجلهم و سيقوم الدجانغو تلقائياً بأخذ الخيارات التي قمت بإتاحتها عن طريق ال settings من أجل اللغة. كمثال على ذلك: from django.urls import path, include from pages.views import HomeView from django.conf.urls.i18n import i18n_patterns urlpatterns = i18n_patterns( path('admin/', admin.site.urls), path('products/', include('products.urls')), path('accounts/', include('allauth.urls')), path('reviews/', include('reviews.urls')), path('language-preference/', include('pages.urls')), path('shopping_cart/', include('shopping_cart.urls')), path('', HomeView.as_view(), name='home'), ) و في ملف ال settings يجب عليك وضع ما يلي: LANGUAGES = ( ('ar', gettext('Arabic')), ('fr', gettext('French')), ) USE_I18N = True و بالتالي هنا لن يأخذ غير الخيارين الذي يعبران عن اللغات التي قمت بتحديدها. هذه الطريقة أفضل ﻷنها تلقائياً سوف تقوم بوضع اللغة على اللغة المحلية للمستخدم، بالطبع يجب عليك توفير زر يقوم بعملية التحويل (لن يقوم المستخدم بكتابة اللغة في الرابط)، و لكن حتى بدون زر التحويل هذا سوف يقوم بأخذ اللغة الافتراضية لجهاز المستخدم. هناك طريقة أخرى تعتمد على ال regex و لكنها ليست مستحبة، أما إذا كنت تريد أن يقوم المستخدم بإدخال متحول و له شروط معينة يمكنك القيام بتعديل ذلك في ال view بحيث تقوم بإرجاع 404 في حال لم تكن قيمة المتحول ما تريده. و إذا كنت مصراً على استعمال ال regex فيمكنك استعمال re_path و الذي هو يمثال ال path و لكن يقبل ب regex و بالتالي يمكنك ضمنه وضع خيار ar|fr بحيث سيأخذ فقط أحدهما.1 نقطة
-
نلاحظ أن الجزء الأول مشترك بين المسارين، ثم يأتي قيمتين اختياريتين exemple.com/fr , exemple.com/ar urlpatterns = [ url(r'^exemple.com/(ar|fr)', admin.site.urls), ] أول جزء يكوت ثابت، ثم نضع بين قوسين القيمتين الاختياريتين و بينهم | الذي يعني أو - or - ( عربي أو فرنسي )1 نقطة
-
مرحبا عبد الرحمن، يمكننا تطبيق الفكرة من خلال الدالة count if التي تقوم بعد عدد العناصر لمجال معين =IF(COUNTIFS($A$1:$A,$A1,$B$1:$B,$B1)>1,"","تم") ^^^^^^^ ^^^ ^^^^^^^ ^^^ 1 2 3 4 مجال أول عمود أول قيمة في العمود الأول مجال ثاني عمود أول قيمة في العمود الثاني طالما أن القيمة جديدة سيكتب تم وإلا سيحذفها من الحقول المكررة1 نقطة
-
يمكننا استخدام الصنف المساعد Array الدالة sort int[] numbers = { 40, 5, 3, 22, 1, 18 }; Array.Sort(numbers); foreach(int i in numbers) { Console.Write(i + " "); } يمكنك استعامل هذه الطريقة مع أي نوع من المصفوفات رقمية أو نصية1 نقطة
-
نعم يوجد api خاص بإضافة المنتجات والعناصر في الصفحات التجارية على الفيسبوك إضافة منتج إلى FACEBOOK SHOP : لإرسال منتج أو تحديثه أو حتى حذفه نستعمل نقطة النهاية : /{catalog_id}/items_batch https://graph.facebook.com/<API_VERSION>/<CATALOG_ID>/items_batch?requests=<REQUESTS> مثال على request curl \ -d @body.json \ -H "Content-Type: application/json" { "access_token": "<ACCESS_TOKEN>", "item_type": "PRODUCT_ITEM", "requests": [ { "method": "DELETE", // ممكن تكون CREATE UPDATE DELETE "data": { "id": "معرف المنتج" } }, { "method": "CREATE", "data": { "id": "retailer-2", "availability": "المخزون", "brand": "Nike", "google_product_category": "فئة المنتج", "description": "وصف المنتج", "image_link": "http://www.images.example.com/t-shirts/1.png", "title": "اسم المنتج", "price": "سعر المنتج + عملة المنتج بمعايير iso ", "condition": "حالة المنتج ", "link":"رابط المنتج", "item_group_id": "معرف مجموعة المنتج" } }, { "method": "UPDATE", "data": { "availability": "خارج المخزون", "id": "retailer-3", } } ] }1 نقطة
-
المصفوفات ليست من أنواع البيانات Data Types الأساسية في جافاسكربت، بل تعتبر من نوع كائن Object كغيرها من الأصناف، لذا للتحقق من أن قيمة ما هي من نوع مصفوفة يمكن استخدام الكلمة المحجوزة instanceof والتحقق ما إذا كانت القيمة نسخة من نوع Array كالتالي: [] instanceof Array // true 5 instanceof Array // false {} instanceof Array // false "Emad" instanceof Array // false أو لجعل الشيفرة أكثر وضوحًا يمكن الاستعانة بالتابع الثابت static ضمن الصنف Array نفسه بالاسم isArray، حيث يعيد قيمة منطقية تدل فيما إذا كانت القيمة الممررة له هي مصفوفة كالتالي: Array.isArray([]) // true Array.isArray(5) // false Array.isArray({}) // false Array.isArray("Emad") // false1 نقطة
-
1 نقطة
-
JSON أو JavaScript Object Symation هي صيغة بسيطة وقابلة للقراءة بسهولة من قبل الإنسان ويتم استخدامها لتمثيل البيانات و تبادلها بين الأنظمة البرمجية المختلفة وهي ليست لغة برمجية إنما هي طريقة متفق عليها بين لغات البرمجة المختلفة لتمثيل البيانات بهدف سهولة تبادل البيانات بين هذه اللغات , يتم تمثيلها عن طريق نص ، والبنية لهذا النص تشبه الكائن أو Object في لغة البرمجة جافا سكربت, وهذه الصيغة مدعومة من لغات البرمجة الأساسية الأخرى وتستخدم هذه الصيغة بشكل كبير لتبادل البيانات بين الخادم والعميل Client-Server. يتم تمثيل البيانات في json من خلال المفاتيح Keys والقيم Values وهما الجزءان الأساسيان اللذان يشكلان JSON : المفتاح Key : يمثل اسم مميز وفريد لقيمة البيانات ويتم وضعه عادة بين علامات التنصيص القيمة Value : تمثل البيانات ويمكن أن تمثل اكثر من نوع بيانات مثل النصوص والأرقام والمصفوفات قيم true أو false. يشكل Key / Value سطر في صيغة جيسون حيث يتم استخدام علامة , كفاصل بين السطور. {"menu": { "id": "file", "value": "File" } } أنواع البيانات للقيم في JSON Array المصفوفة: مجموعة من القيم المترابطة على سبيل المثال: {family : [{ "name" : "Jason", "age" : "24", "gender" : "male" }, { "name" : "Kyle", "age" : "21", "gender" : "male" }], } Boolean قيمة منطقية: ولها احتمالان True او False. Number رقم: تكون القيمة عبارة عدد صحيحا أو حقيقيا أو فواصل عشرية. String السلسلة النصية: مجموعة من الأحرف النصية العادية تشكل عادة كلمة.1 نقطة
-
خدمة اسم النطاق (Domain Name Service) هي خدمة إنترنت تربط بين عناوين IP وأسماء النطاق الكاملة (fully qualified domain names [FQDN])؛ وفي هذه الطريقة، تخفف خدمة DNS من حاجة تذكر عناوين IP. تسمى الحواسيب التي تشغّل خدمة DNS «خواديم الأسماء»، ويأتي أوبنتو مع BIND (Brekley Internet Naming Daemon)، وهو أشهر خدمة لإعداد خادوم أسماء في لينُكس. التثبيتأدخِل الأمر الآتي في مِحَث الطرفية لتثبيت خادوم dns: sudo apt-get install bind9حزمة dnsutils مفيدةٌ جدًا في اختبار واستكشاف أخطاء DNS؛ قد تكون هذه الأدوات مثبتةً مسبقًا على نظامك؛ لكن للتأكد من وجودها أو تثبيتها، أدخِل الأمر الآتي: sudo apt-get install dnsutils الضبطهنالك العديد من الطرق لضبط BIND9؛ لكن بعض أشهر هذه الإعدادات هي خادوم تخزين أسماء (caching nameserver)، الرئيس الأولي (primary master)، والرئيس الثانوي (secondary master). عند ضبطه كخادوم تخزين أسماء، فسيجد BIND9 جوابًا عن استعلامات الأسماء وسيتذكر الجواب عندما يُطلَب النطاق مرةً أخرى.عندما يُضبَط كخادوم رئيس أولي، فسيقرأ BIND9 البيانات لنطاق (Zone) في ملف في المضيف ويستوثق لهذا النطاق.عندما يُضبَط كخادوم رئيس ثانوي؛ فسيحصل BIND9 على بيانات النطاق من خادوم أسماء آخر ويستوثق للنطاق.لمحةتُخزَّن ملفات ضبط DNS في المجلد /etc/bind، ملف الضبط الرئيسي هو /etc/bind/named.conf. يُحدِّد سطر include اسمَ الملف الذي يحتوي على خيارات DNS؛ سطر directory في ملف /etc/bind/named.conf.options يخبر DNS أين سيبحث عن الملفات، جميع الملفات التي يستخدمها BIND ستتعلق بهذا المجلد. يصف ملف /etc/bind/db.root خواديم الأسماء الرئيسية في العالم؛ تتغير هذه الخواديم مع مرور الوقت، لذلك يجب أن يُحدَّث ملف /etc/bind/db.root بين الحين والآخر؛ وذلك يتم عادةً في تحديثات حزمة bind9؛ يُعرِّف القسم zone خادومًا رئيسيًا (master server)، وهو مخزن في ملف مذكور في خيار file. من الممكن ضبط نفس الخادوم ليكون خادوم تخزين أسماء، ورئيس أولي، ورئيس ثانوي؛ ويمكن أن يكون الخادوم «بداية السلطة» (Start of Authority [SOA]) لنطاق واحد، بينما يوفر خدمة ثانوية لنطاق آخر؛ ومع كل هذا فهو يوفر خدمات التخزين للمضيفين على الشبكة المحلية LAN. خادوم تخزين الأسماءالضبط الافتراضي هو العمل كخادوم تخزين؛ كل ما هو مطلوب هو ببساطة إضافة عناوين IP لخواديم DNS التي وفرها لك مزود الخدمة ISP؛ ببساطة، أزل التعليقات عن الأسطر الآتية وعدلها في ملف /etc/bind /named.conf.options: forwarders { 1.2.3.4; 5.6.7.8; };ملاحظة: استبدل 1.2.3.4 و 5.6.7.8 بعناوين IP لخواديم الأسماء لديك. أعد الآن تشغيل خادوم DNS لتفعيل الضبط الجديد، وذلك بتنفيذ الأمر الآتي من مِحَث الطرفية: sudo service bind9 restartراجع القسم «dig» لمزيدٍ من المعلومات حول اختبار خادوم تخزين DNS. الرئيس الأوليسنضبط في هذا القسم BIND9 كخادوم رئيس أولي للنطاق example.com؛ استبدل example.com باسم نطاقك الكامل. ملف تمرير المنطقةلإضافة منطقة DNS إلى BIND9، مما يحول BIND9 إلى خادوم رئيس أولي، فإنَّ أول خطوة هي تعديل ملف /etc/bind/named.conf.local: zone "example.com" { type master; file "/etc/bind/db.example.com"; };ملاحظة: إذا كان سيستقبل bind تحديثاتٍ تلقائيةً عبر DDNS، فعليك استخدام الملف /var/lib/bind /db.example.com بدلًا من /etc/bind/db.example.com سواءً في الملف السابق أو في أمر النسخ الآتي. استخدم الآن ملف نطاق موجود مسبقًا كقالب لإنشاء ملف /etc/bind/db.example.com: sudo cp /etc/bind/db.local /etc/bind/db.example.comعدِّل ملف النطاق الجديد /etc/bind/db.example.com مغيّرًا localhost إلى FQDN لخادومك، واترك النقطة الإضافية في النهاية؛ وغيّر 127.0.0.1 إلى عنوان IP لخادوم الأسماء و root.localhost إلى عنوان بريد صالح، لكن باستخدام "." بدلًا من رمز "@" واترك أيضًا النقطة الإضافية في النهاية؛ عدِّل التعليق لكي يبيّن النطاق الخاص بهذا الملف. أنشئ «سجلًا» (record) للنطاق الأساسي، example.com، وأيضًا أنشِئ سجلًا لخادوم الأسماء، الذي هو في هذا المثال ns.example.com: ; ; BIND data file for example.com ; $TTL 604800 @ IN SOA example.com. root.example.com. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL IN A 192.168.1.10 ; @ IN NS ns.example.com. @ IN A 192.168.1.10 @ IN AAAA ::1 ns IN A 192.168.1.10يجب أن تزيد الرقم التسلسلي (Serial Number) في كل مرة تعدِّل فيها على ملف النطاق؛ إذا عدَّلت عدة تغيرات قبل إعادة تشغيل BIND9، فَزِد الرقم التسلسلي مرةً واحدةً فقط. تستطيع الآن إضافة سجلات DNS في نهاية ملف المنطقة، راجع القسم «أنواع السجلات الشائعة» للتفاصيل. ملاحظة: يحب العديد من مدراء الأنظمة استخدام تاريخ آخر تعديل كرقم تسلسلي للمنطقة؛ مثل 2012010100 الذي هو yyyymmddss (حيث ss هو الرقم التسلسلي). بعد أن أجريت تعديلاتك في ملف النطاق؛ فيجب إعادة تشغيل BIND9 لكي تأخذ التعديلات مجراها. sudo service bind9 restartملف النطاق المعكوسبعد أن ضبطت النطاق لحل الأسماء إلى عناوين IP، فمن المطلوب أيضًا «نطاق معكوس» (Reverse zone)؛ يسمح النطاق المعكوس لخدمة DNS بحل العناوين إلى أسماء. عدِّل ملف /etc/bind/named.conf.local، وأضف ما يلي: zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192"; };ملاحظة: استبدل 1.168.192 بأول ثلاث خانات تستخدمها شبكتك؛ وسَمِّ ملف النطاق /etc/bind/db.192 تسميةً ملائمةً، حيث يجب أن يُطابِق أول خانة من خانات عنوان الشبكة. أنشِئ الآن ملف /etc/bind/db.192: sudo cp /etc/bind/db.127 /etc/bind/db.192ثم غيِّر ملف /etc/bind/db.192 معدِّلًا نفس الخيارات في /etc/bind/db.example.com: ; ; BIND reverse data file for local 192.168.1.XXX net ; $TTL 604800 @ IN SOA ns.example.com. root.example.com. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns. 10 IN PTR ns.example.com.يجب أن يُزاد الرقم التسلسلي في النطاق المعكوس في كل مرة يُعدَّل فيها الملف. فلكل سجل A تضبطه في /etc/bind/db.example.com لعنوان مختلف، يجب عليك أن تنشِئ سجل PTR في /etc/bind/db.192. أعد تشغيل BIND9 بعد إنشاء ملف النطاق المعكوس. sudo service bind9 restartالرئيس الثانويبعد أن يُضبَط الرئيس الأولي فسنحتاج إلى رئيس ثانوي لكي نحافظ على بقاء النطاق في حال لم يكن الرئيس الأولي متوفرًا. في البداية، يجب أن يُسمَح بنقل النطاق في الخادوم الرئيس الأولي؛ أضف الخيار allow-transfer إلى قسم النطاق والنطاق المعكوس في ملف /etc/bind/named.conf.local: zone "example.com" { type master; file "/etc/bind/db.example.com"; allow-transfer { 192.168.1.11; }; }; zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192"; allow-transfer { 192.168.1.11; }; };ملاحظة: استبدل 192.168.1.11 بعنوان IP لخادوم الأسماء الثانوي. أعد تشغيل خدمة BIND9 في الرئيس الأولي: sudo service bind9 restartالآن ثبِّت على الرئيس الثانوي الحزمة bind9 بنفس الطريقة التي ثبتتها على الأولي؛ ثم عدِّل ملف /etc/bind/named.conf.local وأضف التعاريف الآتية لنطاقَيّ التمرير والعكس: zone "example.com" { type slave; file "db.example.com"; masters { 192.168.1.10; }; }; zone "1.168.192.in-addr.arpa" { type slave; file "db.192"; masters { 192.168.1.10; }; };ملاحظة: استبدل 192.168.1.10 بعنوان IP لخادوم الأسماء الأولي. أعد تشغيل خدمة BIND9 على الخادوم الثانوي: sudo service bind9 restartيجب أن تشاهد في سجل /var/log/syslog شيئًا شبيهًا بما يلي (قُسِّمَت بعض الأسطر لكي تتسع في عرض الصفحة): client 192.168.1.10#39448: received notify for zone '1.168.192.in-addr.arpa' zone 1.168.192.in-addr.arpa/IN: Transfer started. transfer of '100.18.172.in-addr.arpa/IN' from 192.168.1.10#53: connected using 192.168.1.11#37531 zone 1.168.192.in-addr.arpa/IN: transferred serial 5 transfer of '100.18.172.in-addr.arpa/IN' from 192.168.1.10#53: Transfer completed: 1 messages, 6 records, 212 bytes, 0.002 secs (106000 bytes/sec) zone 1.168.192.in-addr.arpa/IN: sending notifies (serial 5) client 192.168.1.10#20329: received notify for zone 'example.com' zone example.com/IN: Transfer started. transfer of 'example.com/IN' from 192.168.1.10#53: connected using 192.168.1.11#38577 zone example.com/IN: transferred serial 5 transfer of 'example.com/IN' from 192.168.1.10#53: Transfer completed: 1 messages, 8 records, 225 bytes, 0.002 secs (112500 bytes/sec)ملاحظة: تُنقَل المنطقة فقط إذا كان الرقم التسلسلي على الأولي أكبر منه على الثانوي؛ وإذا أردت أن يعلم الرئيس الأولي بتعديلات النطاقات في خواديم DNS الثانوية، فعليك إضافة الخيار ;{ also-notify { ipaddress في ملف /etc/bind/named.conf.local كما هو موضح في المثال الآتي: zone "example.com" { type master; file "/etc/bind/db.example.com"; allow-transfer { 192.168.1.11; }; also-notify { 192.168.1.11; }; }; zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192"; allow-transfer { 192.168.1.11; }; also-notify { 192.168.1.11; }; };ملاحظة: المجلد الافتراضي للنطاقات غير الموثوق منها هو /var/cache/bind؛ يُضبَط هذا المجلد أيضًا في AppArmor ليسمح للعفريت named بالكتابة إليه؛ المزيد من المعلومات حول AppArmor ستتوفر في الدرس القادم. استكشاف الأخطاء وإصلاحهايشرح هذا القسم الطرق التي تستخدم للمساعدة في تحديد المسبب عندما تحدث المشاكل مع DNS و BIND9. الاختبارملف resolv.confأول خطوة في اختبار BIND9 هي إضافة عنوان IP لخادوم الأسماء للذي يستبين أسماء المضيفين؛ يجب أن يُضبَّط خادوم الأسماء أيضًا لمضيف آخر للتأكد مرةً أخرى؛ تحقق إن كان الملف /etc/resolv.conf يحتوي على الأسطر الآتية: nameserver 192.168.1.10 nameserver 192.168.1.11خواديم الأسماء التي تستمع على 127.* مسؤولة عن إضافة عناوين IP الخاصة بهم إلى ملف resolv.conf (باستخدام resolveconf)؛ وهذا يتم عبر الملف /etc/default/bind9 بتغيير السطر: RESOLVECONF=no إلى: RESOLVECONF=yes.ملاحظة: يجب إضافة عنوان IP لخادوم الأسماء الثانوي في حال لم يكن الخادوم الأولي متوفرًا. أداة البحث digإذا ثبتت حزمة dnsutils فيمكنك اختبار إعداداتك باستخدام أداة البحث في DNS المسماة dig: بعد تثبيت BIND9، فاستخدم dig مع بطاقة loopback (أي localhost) للتأكد أنها تستمع على المنفذ 53؛ أدخِل الأمر الآتي في مِحَث الطرفية: dig -x 127.0.0.1يجب أن تُشاهِد أسطرًا شبيهة بالآتي في ناتج الأمر: ;; Query time: 1 msec ;; SERVER: 192.168.1.10#53(192.168.1.10)إذا ضَبطَت BIND9 كخادوم تخزين الأسماء، فابحث (dig) عن نطاق خارجي للتحقق من زمن الطلبية: dig ubuntu.comلاحظ وقت الطلبية في نهاية ناتج الأمر السابق: ;; Query time: 49 msecبعد استخدام dig مرةً أخرى، يجب أن يتحسن الرقم السابق: ;; Query time: 1 msecأداة pingلشرح كيف تَستخدم التطبيقات DNS لكي يستبين اسم المضيف؛ فسنستخدم الأداة ping لإرسال طلب ICMP echo؛ وذلك بإدخال الأمر الآتي في الطرفية: ping example.comما سبق سيختبر إن استطاع خادوم الأسماء استبيان الاسم ns.example.com وتحويله إلى عنوان IP؛ يجب أن تشابه مخرجات الأمر السابق ما يلي: PING ns.example.com (192.168.1.10) 56(84) bytes of data. 64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.800 ms 64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.813 ms named-checkzoneطريقة رائعة لاختبار ملفات النطاقات لديك هي استخدام الأداة المثبتة مع حزمة bind9؛ تسمح هذه الأداة لك بالتأكد من أن الضبط صحيح قبل إعادة تشغيل BIND9 وجعل التغيرات حيةً. أدخِل الأمر الآتي في الطرفية لاختبار ملف النطاق في مثالنا: named-checkzone example.com /etc/bind/db.example.comإذا كان كل شيءٍ مضبوطًا ضبطًا سليمًا، فستشاهد مخرجاتٍ شبيهةٍ بما يلي: zone example.com/IN: loaded serial 6 OK وبشكل مشابه، أدخل ما يلي لاختبار ملف النطاق العكسي: named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192يجب أن تكون المخرجات شبيهةً بما يلي: zone 1.168.192.in-addr.arpa/IN: loaded serial 3 OKملاحظة: سيكون الرقم التسلسلي لملف النطاق عندك مختلفًا عادةً. التسجيللدى BIND9 خيارات كثيرة لضبط التسجيل (logging)؛ هنالك خياران رئيسيان هما الخيار channel الذي يضبط أين سيذهب السجل، والخيار category الذي يحدد ما هي المعلومات التي ستُسجَّل. إذا لم يُحدَّد ضبطٌ للتسجيل، فالضبط الافتراضي هو: logging { category default { default_syslog; default_debug; }; category unmatched { null; }; };يشرح هذا القسم ضبط BIND9 لإرسال رسائل debug متعلقة بطلبيات DNS إلى ملفٍ منفصل. سنحتاج أولًا إلى ضبط «قناة» (channel) لتحديد الملف الذي ستُرسَل إليه الرسائل، عدل ملف /etc/bind/named.conf.local، وأضف ما يلي: logging { channel query.log { file "/var/log/query.log"; severity debug 3; }; };اضبط الآن تصنيفًا لإرسال جميع طلبيات DNS إلى ملف query: logging { channel query.log { file "/var/log/query.log"; severity debug 3; }; category queries { query.log; }; };ملاحظة: لاحظ أن الخيار debug يمكن أن يُضبَط من المرحلة 1 إلى 3؛ وستستخدم المرحلة 1 إذا لم تُحدَّد مرحلة. ولما كان عفريت named يعمل كمستخدم bind، فيجب إنشاء الملف /var/log/query.log وتغيير ملكيته: sudo touch /var/log/query.log sudo chown bind /var/log/query.logقبل أن يتمكن العفريت named من الكتابة إلى ملف السجل الجديد، فيجب أن يُحدَّث ضبط AppArmor؛ أولًا، عدِّل ملف /etc/apparmor.d/usr.sbin.named وأضف: /var/log/query.log w,ثم أعد تحميل ملف ضبطه: cat /etc/apparmor.d/usr.sbin.named | sudo apparmor_parser -rأعد الآن تشغيل BIND9 لكي تأخذ التغييرات مفعولها: sudo service bind9 restartيجب أن ترى الملف /var/log/query.log ممتلئًا بمعلومات الطلبيات؛ هذا مثال بسيط عن ضبط تسجيل BIND9؛ راجع القسم «المزيد من المعلومات» للمزيد من الخيارات المتقدمة. المراجع أنواع السجلات الشائعةيغطي هذا القسم بعض أنواع سجلات DNS الشائعة. سجل A: يربط هذا السجل عنوان IP إلى اسم مضيف. www IN A 192.168.1.12سجل CNAME: يُستخدَم لإنشاء اسم بديل لسجل موجود مسبقًا، لا يمكنك استخدام سجل CNAME للإشارة إلى سجل CNAME آخر. web IN CNAME wwwسجل MX: يُستخدَم لتعريف أين يجب أن يُرسَل البريد؛ يجب أن يشير إلى سجل A، وليس سجل CNAME. IN MX 1 mail.example.com. mail IN A 192.168.1.13سجل NS: يُستخدَم لتعريف أيّة خواديم تُخَدِّم نسخًا من المنطقة؛ يجب أن يشير إلى سجل A، وليس إلى CNAME؛ هذا مكان تعريف الخادومين الأولى والثانوي. IN NS ns.example.com. IN NS ns2.example.com. ns IN A 192.168.1.10 ns2 IN A 192.168.1.11 المزيد من المعلوماتدليل «DNS HOWTO» يشرح الخيارات المتقدمة لضبط BIND9.انظر إلى bind9.net للحصول على شرح معمّق لعمل DNS و BIND9.كتاب «DNS and BIND» هو كتابٌ شائع أصبح في إصداره الخامس؛ وهنالك أيضًا كتاب «DNS and BIND on IPv6».مكان رائع لطلب المساعدة في BIND9 والتعاون مع مجتمع خادوم أوبنتو هو قناة IRC على خادوم Freenode «#ubuntu-server».أيضًا، راجع «BIND9 Server HOWTO» في ويكي أوبنتو.ترجمة -وبتصرف- للمقال: Ubuntu Server Guide: Domain Name Service DNS.1 نقطة
-
سنقدم في هذا الدرس من دليل إدارة خواديم أوبنتو مجموعة أدوات فعّالة للتحكم البعيد ونقل الملفات بين الحواسيب المتصلة بالشبكة تسمى «OpenSSH»، سنتعلم أيضًا مجموعةً من إعدادات الضبط الممكنة مع خادوم OpenSSH ونتعلم كيف نغيرها في نظام أوبنتو الخاص بك. إن OpenSSH هو إصدار مجاني وحر من مجموعة أدوات بروتوكول «الصدفة الآمنة» (Secure Shell [SSH]) للتحكم البعيد أو نقل الملفات بين الحواسيب؛ الأدوات التقليدية التي كانت مستخدمةً لإنجاز هذه المهام -مثل telnet أو rcp- لم تكن آمنةً حيث كانت تنقل كلمة مرور المستخدم بنصٍ واضح عند استخدامها؛ أما OpenSSH، فيُوفِّر عفريتًا وأدوات للعميل لإنشاء عمليات تحكم عن بعد أو نقل الملفات آمنة ومشفرة؛ ويستبدل الأدوات القديمة استبدالًا فعالًا. مكونة خادوم OpenSSH المسماة sshd «تستمع» (listens) باستمرار لاتصالات العميل، وعندما يحدث طلب اتصال، فإن sshd ينُشِئ نوع الاتصال الصحيح اعتمادًا على نوع أداة العميل التي تجري الاتصال؛ على سبيل المثال، لو أن الحاسوب البعيد يتصل باستخدام برمجية عميل ssh، فإن خادوم OpenSSH يهيّء جلسة تحكم عن بُعد بَعد الاستيثاق؛ وإذا اتصل المستخدم البعيد مع خادوم OpenSSH باستخدام scp، فسيُهيّء عفريت خادوم OpenSSH نقلًا آمنًا للملفات بين الخادوم والعميل بعد الاستيثاق؛ ويمكن أن يَستخدِم OpenSSH عدَّة طرق للاستيثاق، منها كلمة المرور العادية، والمفتاح العمومي (public key)، وبطاقات Kerberos للدخول. التثبيتإن عملية تثبيت خادوم وعميل OpenSSH هي عمليةٌ بسيطة؛ استخدم هذا الأمر من مِحَث الطرفية لتثبيت عميل OpenSSH على نظام أوبنتو: sudo apt-get install openssh-clientاستخدم هذا الأمر في سطر الأوامر لتثبيت خادوم OpenSSH، وملفات الدعم المتعلقة به: sudo apt-get install openssh-serverيمكن أيضًا تحديد حزمة openssh-server للتثبيت أثناء عملية تثبيت نسخة الخادوم من أوبنتو. الضبطيمكنك ضبط السلوك الافتراضي لتطبيق خادوم OpenSSH (sshd) بتعديل الملف /etc/ssh/sshd_config، للمزيد من المعلومات حول الضبط المستخدم في هذا الملف، تستطيع مراجعة صفحة الدليل الملائمة بإدخال الأمر الآتي في الطرفية: man sshd_configهنالك تعليمات كثيرة في ملف ضبط sshd تتحكم بأشياء مثل إعدادات الاتصالات وأنماط الاستيثاق؛ يمكن أن تُعدَّل ما سنشرحه من تعليمات الضبط بتعديل ملف /etc/ssh/sshd_config. تنويه: قبل تعديل ملف الضبط، عليك أخذ نسخة من الملف الأصلي وحفظها من الكتابة عليها لكي تحصل على نسخة من الضبط الافتراضي كمرجع، ولإعادة استخدامها وقت الحاجة. انسخ ملف /etc/ssh/sshd_config واحمهِ من الكتابة باستخدام الأوامر الآتية: sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original sudo chmod a-w /etc/ssh/sshd_config.originalما يلي هو أمثلة عن تعليمات الضبط التي قد ترغب في تعديلها: لضبط OpenSSH لكي يستمع على منفذ TCP ذي الرقم 2222 بدلًا من منفذ TCP الافتراضي 22، فغيِّر تعليمة المنفذ كما يلي: Port 2222لكي تجعل sshd يسمح باستخدام الاستيثاق المبني على المفتاح العمومي، فأضف أو عدِّل السطر: PubkeyAuthentication yesإذا كان السطر موجودًا مسبقًا، فتأكد من عدم وجود رمز التعليق قبله. لجعل خادوم OpenSSH يعرض محتويات ملف /etc/issue.net كلافتة قبل تسجيل الدخول، فأضف أو عدِّل السطر الآتي: Banner /etc/issue.netفي ملف ./etc/ssh/sshd_config بعد إجراء التعديلات على ملف /etc/ssh/sshd_config، فاحفظ الملف ثم أعد تشغيل خادوم sshd لتأخذ التغيرات مفعولها، وذلك بإدخال الأمر الآتي في مِحَث الطرفية: sudo service ssh restartتحذير: تتوفر المزيد من تعليمات الضبط لخادوم sshd لتعديل سلوك الخادوم لكي يلائم احتياجاتك، لكن يجب التنويه أنه إذا كانت الطريقة الوحيدة للوصول إلى الخادوم هي ssh، وارتكبت خطأً في ضبط sshd عبر ملف /etc/ssh/sshd_config، فستجد نفسك غير قادرٍ على الوصول إلى الخادوم بعد إعادة تشغيل خدمة sshd؛ بالإضافة إلى أنك إذا وضعت تعليمة ضبط خاطئة، فسيرفض خادوم sshd أن يعمل؛ لذلك كن حذرًا جدًا عند تعديل هذا الملف على خادوم بعيد. مفاتيح SSHتسمح مفاتيح SSH بالاستيثاق بين جهازين دون الحاجة إلى كلمة مرور، يَستخدم الاستيثاق بواسطة مفتاح SSH مفتاحين: مفتاح خاص (private) ومفتاح عام (public). أدخِل الأمر الآتي في الطرفية لتوليد المفاتيح: ssh-keygen -t dsaسيولد الأمر السابق المفاتيح باستخدام خوارزمية التوقيع الرقمية (Digital Signature Algorithm [DSA])، ستُطلَب منك كلمة المرور أثناء العملية، بعد ذلك اضغط ببساطة على Enter لإنشاء المفتاح. افتراضيًا، يُحفَظ المفتاح العام في الملف ~/.ssh/id_dsa.pub، بينما يكون ملف ~/.ssh/id_dsa هو المفتاح الخاص، انسخ ملف id_dsa.pub إلى المضيف البعيد، ثم أضفه إلى نهاية ملف ~/.ssh/authorized_keys باستخدام الأمر: ssh-copy-id username@remotehostفي النهاية، تأكد من الأذونات على ملف authorized_keys، حيث يجب أن يملك المستخدم الموثوق فقط إذن القراءة والكتابة؛ إذا لم تكون الأذونات صحيحة، فعدلها بالأمر: chmod 600 .ssh/authorized_keysيجب أن تصبح الآن قادرًا على الدخول إلى SSH على المضيف البعيد دون طلب كلمة المرور. مصادرصفحة ويكي أوبنتو «SSH».موقع «OpenSSH».صفحة الويكي «Advanced OpenSSH».ترجمة -وبتصرف- للمقال Ubuntu Server Guide: OpenSSH Server.1 نقطة
-
تتكون الشبكات من جهازين أو أكثر، كأنظمة الحواسيب والطابعات وغيرها من المعدات المتعلقة بها والتي يمكن أن تتصل إما باستخدام كبل فيزيائي أو بالروابط اللاسلكية؛ وذلك لمشاركة وتوزيع المعلومات بين الأجهزة المتصلة. يوفر هذا الدرس معلوماتٍ عامة وأخرى متخصصة تتعلق بالشبكات، وتتضمن لمحةً عن مفاهيم الشبكة، ونقاشًا مفصَّلًا عن بروتوكولات الشبكة الشائعة. تأتي أوبنتو مع عدد من الأدوات الرسومية لضبط أجهزة الشبكة، هذه السلسلة موجَّهة لمدراء الخواديم، وستركِّز على إدارة الشبكة من سطر الأوامر. بطاقات إيثرنتتُعرَّف بطاقات إيثرنت (Ethernet interfaces) في النظام باستخدام الاسم الاصطلاحي ethX، حيث تمثل X قيمةً رقميةً، وتُعرَّف أول بطاقة إيثرنت بالاسم eth0، والثانية بالاسم eth1، وهَلُّمَ جرًا للبقية، حيث تُرتَّب ترتيبًا رقميًا. التعرف على بطاقات إيثرنتيمكنك استخدام الأمر ifconfig كما يلي للتعرف على جميع بطاقات إيثرنت بسرعة: ifconfig -a | grep eth eth0 Link encap:Ethernet HWaddr 00:15:c5:4a:16:5aبرمجيةٌ أخرى تساعدك في التعرف على جميع بطاقات الشبكة المتوفرة في نظامك هي الأمر lshw؛ يُظهِر الأمر lshw في المثال الآتي بطاقة إيثرنت واحدة باسمها المنطقي eth0، مع معلومات الناقل (bus) وتفاصيل التعريف وكل الإمكانيات المدعومة: sudo lshw -class network *-network description: Ethernet interface product: BCM4401-B0 100Base-TX vendor: Broadcom Corporation physical id: 0 bus info: pci@0000:03:00.0 logical name: eth0 version: 02 serial: 00:15:c5:4a:16:5a size: 10MB/s capacity: 100MB/s width: 32 bits clock: 33MHz capabilities: (snipped for brevity) configuration: (snipped for brevity) resources: irq:17 memory:ef9fe000-ef9fffffالأسماء المنطقية لبطاقات إيثرنتتُعرَّف الأسماء المنطقية للبطاقات في الملف /etc/udev/rules.d/70-persistent-net.rules، إذا أردت التحكم في بطاقة التي ستحصل على اسم منطقي معين، فابحث عن السطر الذي يطابق عنوان MAC الفيزيائي للبطاقة، وعدِّل قيمة NAME=ethX إلى الاسم المنطقي المطلوب؛ أعد إقلاع النظام لتطبيق التغيرات التي أجريتها. إعدادات بطاقة إيثرنتإن ethtool هو برنامج يُظهِر ويعدِّل إعدادات بطاقة إيثرنت كالمفاوضة التلقائية (auto-negotiation)، وسرعة المنفذ، ونمط duplex (اتصال باتجاه وحيد، أم باتجاهين)، وخاصية الاستيقاظ عند وصول إشارة معينة من شبكة WoL (Wake-on-LAN)؛ هذا البرنامج غير مثبَّت افتراضيًا، لكنه متوفر في المستودعات للتثبيت: sudo apt-get install ethtoolما يلي مثالٌ عن عرض الميزات المدعومة، وضبط إعدادات بطاقة إيثرنت: sudo ethtool eth0 Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on Supports Wake-on: g Wake-on: d Current message level: 0x000000ff (255) Link detected: yesالتغيرات التي أُجريت بالأداة ethtool هي تغيرات مؤقتة، وستزول بعد إعادة الإقلاع، إذا أردت الحفاظ على تلك الخيارات، فأضف أمر ethtool الذي تريده إلى عبارة pre-up (التي تُنفَّذ عند تهيئة البطاقة وقبل استخدامها)، في ملف الإعدادات /etc/network/interfaces. يوضح المثال الآتي كيف يمكن ضبط إعدادات بطاقة مُعرَّفة على أنها eth0 بسرعة منفذ تساوي 1000Mb/s وتعمل في نمط full duplex (اتصال باتجاهين): auto eth0 iface eth0 inet static pre-up /sbin/ethtool -s eth0 speed 1000 duplex fullملاحظة: على الرغم من أن المثال السابق يستخدم الطريقة «static»، إلا أنه يعمل مع الطرق الأخرى أيضًا، كاستخدام DHCP؛ فالغرض من المثال السابق هو توضيح المكان الصحيح لوضع عبارة pre-up في ملف إعدادات البطاقة وحسب. عناوين IPسيشرح القسم الآتي طريقة إعداد عناوين IP لنظامك، وضبط البوابة (gateway) الافتراضية اللازمة للتواصل على الشبكة المحلية والإنترنت. إسناد مؤقت لعنوان IPيمكن استخدام الأوامر القياسية عند الضبط المؤقت للشبكة، كالأمر ip و ifconfig و route التي يمكنك إيجادها في أغلب أنظمة تشغيل غنو/لينُكس؛ تسمح لك هذه الأوامر بضبط الإعدادات التي تأخذ حيز التنفيذ فوريًا، لكنها ليست دائمة؛ أي أنها لن تبقى مُفعَّلةً بعد إعادة التشغيل. لضبط عنوان IP مؤقتًا، استخدم الأمر ifconfig بالطريقة الآتية: لتعديل عنوان IP وقناع الشبكة الفرعية (subnet mask) لمطابقة متطلبات الشبكة: sudo ifconfig eth0 10.0.0.100 netmask 255.255.255.0للتأكد من ضبط عنوان IP للبطاقة eth0: ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:15:c5:4a:16:5a inet addr:10.0.0.100 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::215:c5ff:fe4a:165a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:466475604 errors:0 dropped:0 overruns:0 frame:0 TX packets:403172654 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2574778386 (2.5 GB) TX bytes:1618367329 (1.6 GB) Interrupt:16لضبط البوابة الافتراضية، يمكنك استخدام الأمر route بالطريقة الآتية: حيث عليك تغيير عنوان البوابة الافتراضية لمطابقة متطلبات شبكتك: sudo route add default gw 10.0.0.1 eth0يمكنك استخدام الأمر route بهذه الطريقة للتأكد من ضبط البوابة الافتراضية: route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0 0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 eth0إذا كنت تحتاج إلى DNS لإعدادات شبكتك المؤقتة، فيمكنك إضافة عناوين IP لخواديم DNS في الملف /etc/resolv.conf، لكن ليس من المستحسن عمومًا تعديل الملف /etc/resolv.conf مباشرةً، لكن هذا ضبط مؤقت وغير دائم؛ يوضح المثال الآتي طريقة إضافة عناوين خادومَي DNS إلى ملف /etc/resolv.conf؛ التي يجب أن تُبدَّل إلى الخواديم الملائمة لشبكتك؛ شرحٌ مطول عن ضبط إعدادات عميل DNS سيأتي في القسم الآتي. nameserver 8.8.8.8 nameserver 8.8.4.4إذا لم تعد بحاجة لهذا الضبط وتريد مسح كل إعدادات IP من بطاقة معينة، فعليك استخدام الأمر ip مع الخيار flush كما يلي: ip addr flush eth0ملاحظة: عملية إزالة ضبط IP باستخدام الأمر ip لا تمسح محتويات ملف /etc/resolv.conf، فعليك حذف أو تعديل محتوياته يدويًا. إسناد ديناميكي لعنوان IP (عميل DHCP)لإعداد الخادوم لكي يستخدم DHCP لإسناد العنوان ديناميكيًا، فأضف الطريقة dhcp إلى عبارة «عائلة العنوان» (address family) في inet للبطاقة المطلوبة في ملف /etc/network/interfaces، يفترض المثال الآتي أنك تُعِدّ بطاقة إيثرنت الأولى المعرَّفة باسم eth0: auto eth0 iface eth0 inet dhcpبإضافة ضبط للبطاقة كما في المثال السابق، يمكنك أن تفعِّل البطاقة باستخدام الأمر ifup الذي يهيّء DHCP باستخدام dhclient. sudo ifup eth0لتعطيل البطاقة يدويًا، يمكنك استخدام الأمر ifdown، الذي بدوره يهيّء عملية الإطلاق (release) الخاصة بنظام DHCP، ويوقف عمل البطاقة. sudo ifdown eth0إسناد عنوان IP ثابتلإعداد نظامك لاستخدام عنوان IP ثابت، فاستخدم الطريقة static في عبارة «عائلة العنوان» في inet للبطاقة المطلوبة في ملف /etc/network/interfaces، يفترض المثال الآتي أنك تُعِدّ بطاقة إيثرنت الأولى المعرَّفة باسم eth0، عدِّل العنوان (address) وقناع الشبكة (netmask) والبوابة (gateway) إلى القيم التي تتطلبها شبكتك: auto eth0 iface eth0 inet static address 10.0.0.100 netmask 255.255.255.0 gateway 10.0.0.1بعد إضافة ضبط للبطاقة كما في المثال السابق، يمكنك أن تفعِّل البطاقة باستخدام الأمر ifup: sudo ifup eth0يمكنك استخدام الأمر ifdown لتعطيل البطاقة يدويًا: sudo ifdown eth0بطاقة loopbackإن بطاقة loopback (التي هي المضيف المحلي)، معرَّفة من النظام بالاسم lo، ولها عنوان IP الافتراضي 127.0.0.1، ويمكن أن تُعرَض باستخدام الأمر ifconfig: ifconfig lo lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:2718 errors:0 dropped:0 overruns:0 frame:0 TX packets:2718 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:183308 (183.3 KB) TX bytes:183308 (183.3 KB)افتراضيًا، يجب أن يكون هنالك سطران في ملف /etc/network/interfaces مسؤولان عن ضبط بطاقة loopback تلقائيًا، ومن المستحسن أن تبقي على الإعدادات الافتراضية ما لم يكن لك غرضٌ محدد من تغييرها؛ مثال على السطرين الافتراضيين: auto lo iface lo inet loopbackاستبيان الأسماءإن استبيان الأسماء (Name resolution) الذي يتعلق بشبكات IP، هو عملية ربط عناوين IP إلى أسماء المضيفين، جاعلًا من السهل تمييز الموارد على الشبكة؛ سيشرح القسم الآتي كيف يُعَدّ النظام لاستبيان الأسماء باستخدام DNS، وسجلات أسماء المضيفين الثابتة (static hostname records). ضبط إعدادات عميل DNSتقليديًا، كان الملف /etc/resolv.conf ملف ضبطٍ ثابتٍ لا تحتاج لتعديله إلا نادرًا، أو كان يُعدَّل تلقائيًا عبر عميل DHCP؛ أما حاليًا فيمكن أن يُبدِّل الحاسوب بين شبكةٍ وأخرى من حين لآخر، وأصبح يُستخدَم إطار العمل resolvconf لتَتَبُّع هذه التغيرات وتحديث إعدادات استبيان الأسماء تلقائيًا؛ في الواقع هو وسيط بين البرامج التي توفر معلومات استبيان الأسماء، والتطبيقات التي تحتاج إلى تلك المعلومات. يُغَذَّى Resolvconf بالمعلومات عبر مجموعة من السكربتات التي تتعلق بإعدادات بطاقة الشبكة، الفرق الوحيد بالنسبة للمستخدم هي أن أيّة تعديلات حدثت على ملف /etc/resolv.conf ستُفقَد عندما تُعاد كتابته كل مرة يُشغِّل فيها حدثٌ ما resolvconf؛ فبدلًا من ذلك، يستخدم resolvconf عميل DHCP وملف /etc/network /interfaces لتوليد قائمة بخواديم الأسماء والنطاقات ليضعها في ملف /etc/resolv.conf، الذي هو الآن وصلةٌ رمزية (symlink): /etc/resolv.conf -> ../run/resolvconf/resolv.confلضبط استبيان الأسماء، أضف عناوين IP لخواديم الأسماء الملائمة لشبكتك في ملف /etc/network /interfaces، يمكنك إضافة قائمة بحث اختيارية للاحقة DNS (DNS suffix search-lists) لمطابقة أسماء نطاقات الشبكة، ولكل خيار ضبط resolv.conf صالح، يمكنك تضمين سطر واحد يبدأ باسم الخيار مع السابقة dns- مما ينتج ملفًا شبيهًا بالملف الآتي: iface eth0 inet static address 192.168.3.3 netmask 255.255.255.0 gateway 192.168.3.1 dns-search example.com dns-nameservers 192.168.3.45 192.168.8.10يمكن أن يُستخدَم الخيار search مع عدِّة أسماء نطاقات، وستُلحَق طلبيات DNS في التسلسل الذي أُدخِلَت به؛ على سبيل المثال، ربما يكون لشبكتك نطاقات فرعية يجب البحث فيها؛ نطاق رئيسي «example.com»، ونطاقين فرعيين «sales.example.com»، و «dev.example.com». إذا كنت تريد البحث في عدِّة نطاقات فرعية، فسيكون ملف الضبط كالآتي: iface eth0 inet static address 192.168.3.3 netmask 255.255.255.0 gateway 192.168.3.1 dns-search example.com sales.example.com dev.example.com dns-nameservers 192.168.3.45 192.168.8.10إذا كنت تحاول عمل ping للمضيف ذي الاسم server1، فسيطلب النظام تلقائيًا طلبية DNS لاسم النطاق الكامل (Fully Qualified Domain Name [FQDN])، في الترتيب الآتي: server1.example.comserver1.sales.example.comserver1.dev.example.comإذا لم يُعثَر على أيّة مطابقات، فسيزودنا خادوم DNS بنتيجة «notfound»، وستفشل طلبية DNS. أسماء المضيفين الثابتةيمكن تعريف أسماء ثابتة للمضيفين تربط بين اسم المضيف وعنوان IP في ملف /etc/hosts؛ المدخلات في ملف hosts ستسبق طلبيات DNS افتراضيًا، هذا يعني لو أن نظامك حاول تفسير اسم مضيف، وكان هذا الاسم يطابق مدخلةً في ملف /etc/hosts، فلن يحاول البحث في سجلات DNS؛ وفي بعض حالات الاستخدام -وخصوصًا عندما لا يُتَطَّلب الوصول إلى الإنترنت- يمكن أن تتعرف الخواديم الموصولة بعدد قليل من الموارد الشبكية على بعضها باستخدام أسماء المضيفين الثابتة بدلًا من DNS. المثال الآتي هو ملف hosts، حيث نجد عددًا من الخواديم المحلية قد عُرِّفَت بأسماء مضيفين بسيطة، وأسماءٍ بديلة، وأسماء النطاقات الكاملة المكافئة لها: 127.0.0.1 localhost 127.0.1.1 ubuntu-server 10.0.0.11 server1 vpn server1.example.com 10.0.0.12 server2 mail server2.example.com 10.0.0.13 server3 www server3.example.com 10.0.0.14 server4 file server4.example.comملاحظة: لاحظ أن كل خادوم من الخواديم في المثال السابق قد أُعطي أسماءً بديلةً بالإضافة إلى أسمائها الأساسية، وأسماء النطاقات الكاملة؛ حيت رُبِطَ server1 مع الاسم vpn، و server2 يُشار إليه بالاسم mail، و server3 بالاسم www، و server4 بالاسم file. ضبط تبديل خدمة الأسماءالترتيب الذي يتبّعه نظامك لاختيار طريقةٍ لتحويل أسماء المضيفين إلى عناوين IP مُتَحَّكَمٌ به من ملف إعدادات «مُبَدِّل خدمة الأسماء» (Name Service Switch [NSS]) الموجود في /etc/nsswitch.conf؛ وكما ذُكِرَ في القسم السابق، فإن أسماء المضيفين الثابتة المعرَّفة في ملف /etc/hosts تسبق استخدام سجلات DNS؛ المثال الآتي يحتوي على السطر المسؤول عن ترتيب البحث عن أسماء المضيفين في ملف /etc/nsswitch.conf: hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4files: المحاولة أولًا للحصول على العناوين من ملف أسماء المضيفين الثابتة في /etc/hosts.mdns4_minimal: محاولة الحصول على العناوين باستخدام Mulitcast DNS.[NOTFOUND=return]: تعني أن أي جواب يكون notfound أتى من عملية mdns4_minimal السابقة سيُعامَل بموثقية، ولن يحاول النظام الاستمرار في محاولة الحصول على جواب.dns: تمثل طلبية Unicast DNS قديمة.mdns4: تمثل طلبية Mulitcast DNS.لتعديل ترتيب طرائق استبيان الأسماء (name resolution) المذكورة آنفًا، يمكنك بكل بساطة تعديل قيمة عبارة «hosts» للقيمة التي تريدها؛ على سبيل المثال، لو كنت تفضل استخدام Unicast DNS القديم، بدلًا من Mulitcast DNS، فتستطيع تغيير تلك السلسلة النصية في ملف /etc/nsswitch.confكما يلي: hosts: files dns [NOTFOUND=return] mdns4_minimal mdns4إنشاء الجسورإنشاء جسر (bridge) بين عدة بطاقات شبكية هو ضبط متقدم جدًا، لكنه مفيد كثيرًا في حالات عديدة، أحد تلك الحالات هو إنشاء جسر بين عدة اتصالات شبكية، ثم استخدام جدار ناري لترشيح (filter) ما يمر بين قسمين من الشبكة؛ حالةٌ أخرى هي استخدام إحدى البطاقات لتمكين «الآلات الوهمية» (Virtual Machines) من الوصول إلى الشبكة الخارجية؛ يشرح المثال الآتي الحالة الأخيرة. قبل ضبط إعدادات الجسر، عليك تثبيت حزمة bridge-utils، أدخِل الأمر الآتي في الطرفية لتثبيت هذه الحزمة: sudo apt-get install bridge-utilsثم اضبط الجسر بتعديل ملف /etc/network/interfaces: auto lo iface lo inet loopback auto br0 iface br0 inet static address 192.168.0.10 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp offملاحظة: أدخِل القيم الملائمة لبطاقتك الفيزيائية، والشبكة عندك. ثم شغِّل بطاقة الجسر: sudo ifup br0يجب أن تعمل بطاقة الجسر تلقائيًا الآن، تُوفِّر الأداة brctl معلوماتٍ حول حالة الجسر، وتتحكم بالبطاقات التي تكوِّن جزءًا من الجسر؛ راجع صفحة الدليل man brctl لمزيد من المعلومات. مصادرهنالك وصلات في صفحة ويكي أوبنتو «Network» تشير إلى مقالات تشرح الضبط المتقدم جدًا للشبكة.صفحة الدليل الخاصة بالبرمجية resolvconf فيها بعض المعلومات عن resolvconf.صفحة دليل man interfaces تحتوي على تفاصيل عن خياراتٍ أخرى لملف /etc/network /interfaces.صفحة دليل man dhclient تحتوي على تفاصيل عن الخيارات الأخرى لضبط إعدادات عميل DHCP.للمزيد من المعلومات حول ضبط عميل DNS، راجع صفحة الدليل man resolver؛ راجع أيضًا الفصل السادس من الكتاب المنشور من O'Reilly: «Linux Network Administrator's Guide»؛ الذي هو مصدر جيد للمعلومات حول ضبط resolver، وخدمة الأسماء.لمزيد من المعلومات حول الجسور، راجع صفحة الدليل man brctl، وصفحة Networking-bridge في موقع مؤسسة لينُكس (Linux Foundation).ترجمة -وبتصرف- للمقال Ubuntu Server Guide: Network Configuration.1 نقطة
-
إن UFW هو أداةٌ لضبط iptables موجودٌ افتراضيًا في أوبنتو؛ يوفِّر هذا الدرس مرجعًا سريعًا لأوامر UFW التي ستُنشِئ قواعد جدار iptables الناري لحالات الاستخدام الشائعة، وهذا يتضمن أمثلةً عن استخدام UFW للسماح وحجب مختلف الخدمات عبر المنفذ، والبطاقة الشبكيّة، وعنوان IP المصدر. كيف تستخدم هذا الدرسإذا كنت قد بدأت لتوِّك باستخدام UFW لضبط جدارك الناري، فراجع الدرس تمهيد إلى UFW.تفترض أغلبية القواعد المشروحة هنا أنك تستخدم مجموعة قواعد UFW الافتراضية؛ التي تكون مضبوطةً للسماح بالاتصالات الصادرة وحجب الاتصالات الواردة، لذا عليك أن تنتقي البيانات التي تريد تمريرهااستعمل الأمثلة الموجودة في الأقسام المتتالية الملائمة لما تودّ تحقيقه؛ لا تعتمد أغلبية الأقسام في هذا الدرس على بعضها بعضًا، لذا يمكنك استخدام الأمثلة الآتية استخدامًا مستقلًاانسخ والصق الأمثلة عن الأوامر الموجودة في هذا الدرس، مستبدلًا قيمك بالقيم المُعلَّمة بالأحمرتذكر أنك تستطيع أن تتحقق من مجموعة قواعد UFW الحالية عبر الأمر sudo ufw status أو sudo ufw status verbose. حجب عنوان IPنفِّذ الأمر الآتي لحجب جميع الاتصالات الشبكية التي تُنشَأ من عنوان IP معيّن، مثلًا 15.15.15.51: sudo ufw deny from 15.15.15.51يُحدِّد التعبير from 15.15.15.51 في المثال السابق عنوان IP مصدري (source IP) هو «15.15.15.51»؛ يمكنك تحديد شبكة فرعية مثل 15.15.15.0/24 إن أردت ذلك. يمكن تحديد عنوان IP مصدري في أيّة قاعدة من قواعد الجدار الناري، بما في ذلك قاعدة allow. حجب الاتصالات إلى بطاقة شبكية معينةاستعمل هذا الأمر لحجب جميع الاتصالات من عنوان IP محدد (على سبيل المثال، 15.15.15.51) إلى بطاقة شبكيّة معيّنة، مثل eth0: sudo ufw deny in on eth0 from 15.15.15.51يشبه هذا الأمرُ الأمرَ السابق، لكن مع زيادة التعبير in on eth0. يمكن تحديد البطاقة الشبكية في أيّة قاعدة من قواعد الجدار الناري، وهذه طريقةٌ ممتازةٌ لتحديد الدور الذي تلعبه بطاقة شبكية معيّنة. خدمة SSHإذا كنتَ تستخدم خادومًا سحابيًا، فربما تريد السماح لاتصالات SSH الواردة (المنفذ 22) لذا يمكنك الاتصال وإدارة خادومك؛ يشرح هذا القسم كيف تَضبط جدارك الناري بمختلف القواعد المتعلقة بخدمة SSH. السماح لاتصالات SSHتستطيع استخدام الأمر الآتي للسماح باتصالات SSH الواردة: sudo ufw allow sshصيغةٌ بديلةٌ عن الصيغةِ السابقة هي تحديد رقم المنفذ بدلًا من اسم خدمة SSH: sudo ufw allow 22السماح لاتصالات SSH الواردة من عنوان IP معين أو شبكة فرعيةللسماح باتصالات SSH الواردة من عنوان IP معيّن أو شبكة فرعية، فعليك تحديد المصدر؛ على سبيل المثال، إذا أردت السماح لكامل الشبكة الفرعية 15.15.15.0/24، فنفِّذ هذا الأمر: sudo ufw allow from 15.15.15.0/24 to any port 22السماح لاتصالات Rsync الواردة من عنوان IP معين أو شبكة فرعيةيمكن أن يُستخدَم Rsync (الذي يعمل على المنفذ 873) لنقل الملفات من حاسوبٍ إلى آخر. للسماح باتصالات rsync الواردة من عنوان IP معيّن أو شبكة فرعية، فحدد عنوان IP المصدري والمنفذ الوجهة؛ على سبيل المثال، إذا أردت السماح لكامل الشبكة الفرعية 15.15.15.0/24 باستخدام rsync على خادومك، فنفِّذ الأمر الآتي: sudo ufw allow from 15.15.15.0/24 to any port 873خادم الويبتستمع خوادم الويب -مثل أباتشي و Nginx- للطلبيات على المنفذين 80 و 443 لاتصالات HTTP و HTTPS على التوالي وبالترتيب. إذا كانت السياسة الافتراضية للاتصالات الواردة هي الحجب أو التجاهل، فربما تريد إنشاء قواعد تسمح لخادومك بالرد على تلك الطلبيات. السماح لجميع اتصالات HTTP الواردةاستخدم الأمر الآتي للسماح لجميع اتصالات HTTP (المنفذ 80) الواردة: sudo ufw allow httpصيغةٌ بديلةٌ عن الصيغةِ السابقة هي تحديد رقم المنفذ بدلًا من اسم خدمة HTTP: sudo ufw allow 80السماح لجميع اتصالات HTTPS الواردةاستخدم الأمر الآتي للسماح لجميع اتصالات HTTPS (المنفذ 443) الواردة: sudo ufw allow httpsصيغةٌ بديلةٌ عن الصيغةِ السابقة هي تحديد رقم المنفذ بدلًا من اسم خدمة HTTPS: sudo ufw allow 443السماح لجميع اتصالات HTTP و HTTPS الواردةإذا أردت السماح لاتصالات HTTP و HTTPS معًا، فيمكنك إنشاء قاعدة وحيدة تسمح لكلي المنفذين؛ وذلك بتنفيذ الأمر الآتي: sudo ufw allow proto tcp from any to any port 80,443الحظ أنك ستحتاج إلى تحديد البروتوكول (باستخدام proto tcp) عند تحديد عدِّة منافذ. قواعد بيانات MySQLتستمع MySQL إلى اتصالات العميل على المنفذ 3306؛ إذا كان سيُستخدَم خادم قواعد بيانات MySQL من عميلٍ على خادوم بعيد؛ فتأكد أنك تسمح بمرور تلك البيانات الشبكية. السماح لاتصالات MySQL الواردة من عنوان IP معين أو شبكة فرعيةللسماح باتصالات MySQL الواردة من عنوان IP معيّن أو شبكة فرعية، فحدِّد المصدر؛ على سبيل المثال، تستطيع تنفيذ هذا الأمر إذا أردت السماح للشبكة الفرعية 15.15.15.0/24: sudo ufw allow from 15.15.15.0/24 to any port 3306السماح لاتصالات MySQL الواردة إلى بطاقة شبكية معينةاستخدم الأمر الآتي للسماح لاتصالات MySQL لبطاقة شبكيّة معيّنة -لنفترض أنّك تملك بطاقة شبكيّة خاصة باسم eth1-: sudo ufw allow in on eth1 to any port 3306قواعد بيانات PostgreSQLتستمع PostgreSQL إلى اتصالات العميل على المنفذ 5432 إذا كان سيُستخدَم خادم قواعد بيانات PostgreSQL من عميلٍ على خادوم بعيد؛ فتأكد أنك تسمح بمرور تلك البيانات الشبكية. السماح لاتصالات PostgreSQL الواردة من عنوان IP معين أو شبكة فرعيةللسماح باتصالات PostgreSQL الواردة من عنوان IP معيّن أو شبكة فرعية، فحدِّد المصدر؛ على سبيل المثال، تستطيع تنفيذ هذا الأمر إذا أردت السماح للشبكة الفرعية 15.15.15.0/24: sudo ufw allow from 15.15.15.0/24 to any port 5432السماح لاتصالات PostgreSQL الواردة إلى بطاقة شبكية معينةاستخدم الأمر الآتي للسماح لاتصالات PostgreSQL لبطاقة شبكيّة معيّنة -لنفترض أنّك تملك بطاقة شبكيّة خاصة باسم eth1-: sudo ufw allow in on eth1 to any port 5432خدمة البريدتستمع خوادم البريد مثل Sendmail و Postfix إلى تشكيلة واسعة من المنافذ بناءً على البروتوكولات المستخدمة لتوصيل البريد؛ إذا كنت تُشغِّل خادوم بريدٍ إلكتروني، فحدِّد البروتوكولات التي تستخدمها واسمح للاتصالات الموافقة لها. سنستعرض أيضًا مثالًا عن إنشاء قاعدة لحجب بريد SMTP الصادر. حجب بريد SMTP الصادرربما تريد أن تحجب بريد SMTP الصادر إذا لم يكن من المفترض لخادومك أن يُرسِل بريدًا إلكترونيًّا؛ استخدم الأمر الآتي لحجب بريد SMTP الصادر (الذي يستخدم المنفذ 25): sudo ufw deny 25يضبط الأمر السابق خادومك لتجاهل كل البيانات المُرسَلة على المنفذ 25؛ إذا أردت أن تحجب خدمةً أخرى عبر رقم منفذها، فضع رقم المنفذ الخاص بها بدلًا من 25. السماح لجميع اتصالات SMTP الواردةللسماح لخادومك بالرد على اتصالات SMTP على المنفذ 25، فعليك تنفيذ الأمر الآتي: sudo ufw allow 25ملاحظة: من الشائع لخوادم SMTP أن تستخدم المنفذ 587 للبريد الصادر. السماح لجميع اتصالات IMAP الواردةللسماح لخادومك بالرد على اتصالات IMAP على المنفذ 143، فعليك تنفيذ الأمر الآتي: sudo ufw allow 143السماح لجميع اتصالات IMAPS الواردةللسماح لخادومك بالرد على اتصالات IMAPS على المنفذ 993، فعليك تنفيذ الأمر الآتي: sudo ufw allow 993السماح لجميع اتصالات POP3 الواردةللسماح لخادومك بالرد على اتصالات POP3 على المنفذ 110، فعليك تنفيذ الأمر الآتي: sudo ufw allow 110السماح لجميع اتصالات POP3S الواردةللسماح لخادومك بالرد على اتصالات POP3S على المنفذ 995، فعليك تنفيذ الأمر الآتي: sudo ufw allow 995الخلاصةيجب أن يكون قد غطى هذا الدرس الكثير من الأوامر شائعة الاستخدام عند استعمال UFW لضبط الجدار الناري؛ وبالطبع إن UFW هو أداةٌ مرنةٌ جدًا، لذلك تستطيع دمج مختلف الخيارات مع الأوامر السابقة لملائمة متطلبات خادومك إن لم تكن تلك الأوامر مبيّنةً هنا. ترجمة -وبتصرف- للمقال: UFW Essentials: Common Firewall Rules and Commands لصاحبه: Mitchell Anicas.1 نقطة