كما توقعنا في الدروس السابقة من هذه السلسلة LFCE (Linux Foundation Certified Engineer)، في هذا المقال سنناقش توجيه حركة الـIP بشكل ثابت وديناميكي مع تطبيقات محددة.

تقديم برنامج شهادات مؤسسة لينكس
أولاً وقبل كل شيء، دعونا نوضح بعض التعاريف:
- ببساطة، الـpacket هو الوحدة الأساسية المستخدمة لنقل المعلومات داخل الشبكة. الشبكات التي تستخدم بروتوكول TCP/IP كبروتوكول شبكة تتبع نفس القواعد لنقل البيانات: يتم تقسيم المعلومات الفعلية إلى باقات تتكون من البيانات والعنوان الذي يجب إرساله إليها.
- الـRouting هو عملية “توجيه” البيانات من المصدر إلى الوجهة داخل الشبكة.
- الـStatic routing يتطلب مجموعة من القواعد المعرفة يدويًا والتي تُحدد في جدول توجيه. هذه القواعد ثابتة وتُستخدم لتحديد الطريقة التي يجب أن تسلكها الباقة أثناء سفرها من جهاز إلى آخر.
- الـDynamic routing، أو smart routing (إذا كنت ترغب)، يعني أن النظام يمكنه تغيير المسار الذي تتبعه الباقة تلقائيًا حسب الحاجة.
تكوين IP المتقدم وأجهزة الشبكة
حزمة iproute توفر مجموعة من الأدوات لإدارة الشبكات ومراقبة حركة المرور التي سنستخدمها طوال هذا المقال حيث تمثل استبدال الأدوات التقليدية مثل ifconfig و route.
الأداة المركزية في مجموعة iproute تسمى ببساطة ip. بناء جملتها الأساسية كما يلي:
# ip object command
حيث يمكن أن يكون object واحدًا فقط من الأشياء التالية (يتم عرض الأشياء الأكثر شيوعًا فقط – يمكنك الرجوع إلى man ip للحصول على قائمة كاملة):
- link: جهاز الشبكة.
- addr: عنوان البروتوكول (IP أو IPv6) على جهاز.
- route: إدخال جدول التوجيه.
- rule: قاعدة في قاعدة بيانات سياسة التوجيه.
بينما command يمثل إجراء محدد يمكن تنفيذه على الكائن. يمكنك تشغيل الأمر التالي لعرض القائمة الكاملة للأوامر التي يمكن تطبيقها على كائن معين:
# ip object help
على سبيل المثال،
# ip link help

توضح الصورة أعلاه، على سبيل المثال، أنه يمكنك تغيير حالة واجهة الشبكة باستخدام الأمر التالي:
# ip link set interface {up | down}
لمثل هذه الأمثلة الأخرى لأمر ‘ip’، اقرأ 10 أوامر ‘ip’ مفيدة لتكوين عنوان IP
مثال 1: تعطيل وتمكين واجهة الشبكة
في هذا المثال، سنقوم بتعطيل وتمكين eth1:
# ip link show # ip link set eth1 down # ip link show

إذا كنت ترغب في إعادة تمكين eth1،
# ip link set eth1 up
بدلاً من عرض جميع واجهات الشبكة، يمكننا تحديد واحدة منها:
# ip link show eth1
الذي سيعيد جميع المعلومات لـ eth1.
مثال 2: عرض الجدول الرئيسي للتوجيه
يمكنك عرض جدول التوجيه الرئيسي الحالي الخاص بك باستخدام أي من الأوامر التالية 3:
# ip route show # route -n # netstat -rn

العمود الأول في إخراج الأوامر الثلاثة يشير إلى الشبكة المستهدفة. يعرض إخراج ip route (بعد كلمة المفتاح dev) أيضًا أجهزة الشبكة التي تعمل كبوابة فيزيائية لتلك الشبكات.
على الرغم من أن الأمر ip يُفضل حاليًا على route، يمكنك لا تزال الرجوع إلى man ip-route و man route لشرح مفصل لبقية الأعمدة.
مثال 3: استخدام خادم Linux لتوجيه الحزم بين شبكتين خاصتين
نريد توجيه حزم icmp (ping) من dev2 إلى dev4 وبالعكس أيضًا (لاحظ أن جهازي العميل على شبكات مختلفة). يتم إعطاء اسم كل NIC، جنبًا إلى جنب مع عنوانه IPv4 المقابل، داخل قوسين مربعين.
بيئة الاختبار لدينا هي كما يلي:
Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1 Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2 Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
دعنا نعرض جدول التوجيه في dev1 (جهاز CentOS):
# ip route show
ثم نعدله لاستخدام NIC enp0s3 والاتصال بـ 192.168.0.15 للوصول إلى المضيفين في شبكة 10.0.0.0/24:
# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3
الذي يقرأ بشكل أساسي، “أضف مسارًا إلى شبكة 10.0.0.0/24 من خلال واجهة الشبكة enp0s3 باستخدام 192.168.0.15 كبوابة”.

بالمثل في dev4 (جهاز openSUSE) لعمل ping للمضيفين في شبكة 192.168.0.0/24:
# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

أخيرًا، نحتاج إلى تمكين التوجيه في جهاز التوجيه Debian الخاص بنا:
# echo 1 > /proc/sys/net/ipv4/ip_forward
الآن دعنا نقوم بعمل ping:

و،

لجعل هذه الإعدادات ثابتة عبر عمليات التمهيد، قم بتحرير /etc/sysctl.conf على جهاز التوجيه وتأكد من تعيين المتغير net.ipv4.ip_forward إلى القيمة الصحيحة كما يلي:
net.ipv4.ip_forward = 1
قم بتكوين وحدات تحكم الشبكة على كلا العميلين (ابحث عن ملف التكوين ضمن /etc/sysconfig/network على openSUSE و /etc/sysconfig/network-scripts على CentOS – في كلتا الحالتين يُسمى ifcfg-enp0s3).
إليك ملف التكوين من جهاز openSUSE:
BOOTPROTO=static BROADCAST=10.0.0.255 IPADDR=10.0.0.18 NETMASK=255.255.255.0 GATEWAY=10.0.0.15 NAME=enp0s3 NETWORK=10.0.0.0 ONBOOT=yes
مثال 4: استخدام خادم Linux لتوجيه الحزم بين الشبكات الخاصة والإنترنت
سيناريو آخر حيث يمكن استخدام جهاز Linux كجهاز توجيه هو عندما تحتاج إلى مشاركة اتصالك بالإنترنت مع شبكة محلية خاصة.
Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2 Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
بالإضافة إلى إعداد توجيه الحزم وجدول التوجيه الثابت في العميل كما في المثال السابق، نحتاج إلى إضافة بعض قواعد iptables في الجهاز التوجيه:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
الأمر الأول يضيف قاعدة إلى سلسلة POSTROUTING في جدول nat (ترجمة عناوين الشبكة)، مشيرًا إلى أن وحدة تحكم الشبكة eth0 يجب استخدامها للحزم الصادرة.
MASQUERADE يشير إلى أن هذه الوحدة تحكم لديها عنوان IP ديناميكي وأنه قبل إرسال الحزمة إلى “عالم الإنترنت البري”، يجب تغيير عنوان المصدر الخاص للحزمة إلى عنوان IP العام للجهاز التوجيه.
في شبكة محلية بها العديد من الأجهزة، يتتبع الجهاز التوجيه الاتصالات المُنشأة في /proc/net/ip_conntrack حتى يعرف إلى أين يجب إعادة الاستجابة من الإنترنت.
تُظهر فقط جزء من الناتج من:
# cat /proc/net/ip_conntrack
في اللقطة الشاشة التالية.

حيث يتم تسليط الضوء على المصدر (عنوان IP الخاص لجهاز openSUSE) والوجهة (DNS لـ Google) للحزم. كان هذا نتيجة تشغيل:
# curl www.tecmint.com
على جهاز openSUSE.
كما أنا متأكد بالفعل، يستخدم الموجه 8.8.8.8 التابع لـ Google كخادم أسماء، مما يفسر لماذا تشير وجهة الحزم الصادرة إلى تلك العنوان.
ملاحظة: أن الحزم الواردة من الإنترنت لا تُقبل إلا إذا كانت جزءًا من اتصال مُنشأ بالفعل (الأمر رقم 2)، بينما تُسمح بحزم الصادر “بالخروج الحر” (الأمر رقم 3).
لا تنسى جعل قواعد iptables الخاصة بك دائمة الصلاحية باتباع الخطوات الموضحة في الجزء 8 – تكوين جدار الحماية Iptables من هذه السلسلة.
التوجيه الديناميكي باستخدام Quagga
في الوقت الحالي، الأداة الأكثر استخدامًا للتوجيه الديناميكي في Linux هي quagga. يسمح لمسؤولي النظام بتنفيذ نفس الوظيفة التي توفرها موجهات Cisco القوية (والمكلفة) باستخدام خادم Linux ذي تكلفة منخفضة نسبيًا.
الأداة نفسها لا تتعامل مع التوجيه، بل تعدل جدول توجيه النواة بما تتعلمه من أفضل طرق لمعالجة الحزم.
نظرًا لأنها فرع من zebra، برنامج توقف تطويره منذ فترة، فإنها تحتفظ لأسباب تاريخية بنفس الأوامر والهيكل مثل zebra. لهذا السبب، سترى الكثير من الإشارات إلى zebra ابتداءً من هذه النقطة.
يرجى ملاحظة أنه ليس من الممكن تغطية التوجيه الديناميكي وجميع البروتوكولات ذات الصلة في مقال واحد، ولكنني واثق من أن المحتوى الذي تم تقديمه هنا سيكون نقطة انطلاق لك للبناء عليه.
تثبيت Quagga في Linux
لتثبيت الكواجا على توزيعتك المختارة:
# aptitude update && aptitude install quagga [On Ubuntu] # yum update && yum install quagga [CentOS/RHEL] # zypper refresh && zypper install quagga [openSUSE]
سنستخدم نفس البيئة كما في المثال رقم 3، مع الاختلاف الوحيد أن eth0 متصل بجهاز توجيه رئيسي بعنوان IP 192.168.0.1.
ثم، عدل /etc/quagga/daemons بالشكل التالي،
zebra=1 ripd=1
الآن قم بإنشاء ملفات التكوين التالية.
# /etc/quagga/zebra.conf # /etc/quagga/ripd.conf
وأضف هذه الأسطر (استبدلها باسم الجهاز وكلمة المرور التي تختارها):
service quagga restart hostname dev2 password quagga
# service quagga restart

ملاحظة: أن ripd.conf هو ملف التكوين لبروتوكول معلومات التوجيه، الذي يوفر للجهاز توجيه المعلومات حول الشبكات التي يمكن الوصول إليها ومدى بعدها (من حيث عدد القفزات).
لاحظ أن هذا هو واحد فقط من البروتوكولات التي يمكن استخدامها مع الكواجا، واخترته لهذا البرنامج التعليمي بسبب سهولة الاستخدام ولأن معظم أجهزة الشبكات تدعمه، على الرغم من أنه يعاني من عيب تمرير بيانات الاعتماد على نصوص عادية. لهذا السبب، تحتاج إلى تعيين أذونات مناسبة لملف التكوين:
# chown quagga:quaggavty /etc/quagga/*.conf # chmod 640 /etc/quagga/*.conf
المثال 5: إعداد الكواجا لتوجيه حركة IP ديناميكيًا
في هذا المثال سنستخدم الإعداد التالي مع جهازي توجيه (تأكد من إنشاء ملفات التكوين لـ جهاز التوجيه #2 كما شرح سابقًا):

مهم: لا تنسى تكرار الإعداد التالي لكلا الجهازين التوجيهيين.
اتصل بـ zebra (الذي يستمع على المنفذ 2601)، وهو الوسيط المنطقي بين الجهاز التوجيهي والنواة:
# telnet localhost 2601
أدخل كلمة المرور التي تم تعيينها في ملف /etc/quagga/zebra.conf، ثم قم بتمكين التكوين:
enable configure terminal
أدخل عنوان IP وقناع الشبكة لكل واجهة شبكية:
inter eth0 ip addr 192.168.0.15 inter eth1 ip addr 10.0.0.15 exit exit write

الآن نحتاج إلى الاتصال بواجهة سطر الأوامر (RIP) (المنفذ 2602):
# telnet localhost 2602
أدخل اسم المستخدم وكلمة المرور كما تم تكوينها في ملف /etc/quagga/ripd.conf، ثم اكتب الأوامر التالية بخط عريض (تمت إضافة التعليقات لغرض التوضيح):
enable turns on privileged mode command. configure terminal changes to configuration mode. This command is the first step to configuration router rip enables RIP. network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. exit exit write writes current configuration to configuration file.

ملاحظة: أنه في كلا الحالتين يتم إلحاق التكوين بالأسطر التي أضفناها سابقًا (/etc/quagga/zebra.conf و /etc/quagga/ripd.conf).
أخيرًا، قم بالاتصال مرة أخرى بخدمة zebra على كلا الجهازين التوجيهيين ولاحظ كيف أن كل منهما “تعلم” المسار إلى الشبكة التي تكون وراء الآخر، ومن هو القفزة التالية للوصول إلى تلك الشبكة، عن طريق تشغيل الأمر show ip route:
# show ip route

إذا كنت ترغب في تجربة بروتوكولات أو إعدادات مختلفة، قد ترغب في الرجوع إلى موقع مشروع Quagga للحصول على مزيد من الوثائق.
الختام
في هذه المقالة، قمنا بشرح كيفية إعداد التوجيه الثابت والديناميكي، باستخدام جهاز توجيه Linux. لا تتردد في إضافة العديد من أجهزة التوجيه كما ترغب، وتجربة ما تشاء. لا تتردد في العودة إلينا باستخدام نموذج الاتصال أدناه إذا كان لديك أي تعليقات أو أسئلة.