كيفية تحويل خادم Linux إلى ترouter للتعامل مع المرور بشكل ثابت وديناميكي – الجزء 10

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

Linux Foundation Certified Engineer – Part 10
تقديم برنامج شهادات مؤسسة لينكس

أولاً وقبل كل شيء، دعونا نوضح بعض التعاريف:

  1. ببساطة، الـpacket هو الوحدة الأساسية المستخدمة لنقل المعلومات داخل الشبكة. الشبكات التي تستخدم بروتوكول TCP/IP كبروتوكول شبكة تتبع نفس القواعد لنقل البيانات: يتم تقسيم المعلومات الفعلية إلى باقات تتكون من البيانات والعنوان الذي يجب إرساله إليها.
  2. الـRouting هو عملية “توجيه” البيانات من المصدر إلى الوجهة داخل الشبكة.
  3. الـStatic routing يتطلب مجموعة من القواعد المعرفة يدويًا والتي تُحدد في جدول توجيه. هذه القواعد ثابتة وتُستخدم لتحديد الطريقة التي يجب أن تسلكها الباقة أثناء سفرها من جهاز إلى آخر.
  4. الـDynamic routing، أو smart routing (إذا كنت ترغب)، يعني أن النظام يمكنه تغيير المسار الذي تتبعه الباقة تلقائيًا حسب الحاجة.

تكوين IP المتقدم وأجهزة الشبكة

حزمة iproute توفر مجموعة من الأدوات لإدارة الشبكات ومراقبة حركة المرور التي سنستخدمها طوال هذا المقال حيث تمثل استبدال الأدوات التقليدية مثل ifconfig و route.

الأداة المركزية في مجموعة iproute تسمى ببساطة ip. بناء جملتها الأساسية كما يلي:

# ip object command

حيث يمكن أن يكون object واحدًا فقط من الأشياء التالية (يتم عرض الأشياء الأكثر شيوعًا فقط – يمكنك الرجوع إلى man ip للحصول على قائمة كاملة):

  1. link: جهاز الشبكة.
  2. addr: عنوان البروتوكول (IP أو IPv6) على جهاز.
  3. route: إدخال جدول التوجيه.
  4. rule: قاعدة في قاعدة بيانات سياسة التوجيه.

بينما command يمثل إجراء محدد يمكن تنفيذه على الكائن. يمكنك تشغيل الأمر التالي لعرض القائمة الكاملة للأوامر التي يمكن تطبيقها على كائن معين:

# ip object help

على سبيل المثال،

# ip link help
IP Command Help

توضح الصورة أعلاه، على سبيل المثال، أنه يمكنك تغيير حالة واجهة الشبكة باستخدام الأمر التالي:

# ip link set interface {up | down}

لمثل هذه الأمثلة الأخرى لأمر ‘ip’، اقرأ 10 أوامر ‘ip’ مفيدة لتكوين عنوان IP

مثال 1: تعطيل وتمكين واجهة الشبكة

في هذا المثال، سنقوم بتعطيل وتمكين eth1:

# ip link show
# ip link set eth1 down
# ip link show
Disable eth0 Interface

إذا كنت ترغب في إعادة تمكين eth1،

# ip link set eth1 up

بدلاً من عرض جميع واجهات الشبكة، يمكننا تحديد واحدة منها:

# ip link show eth1

الذي سيعيد جميع المعلومات لـ eth1.

مثال 2: عرض الجدول الرئيسي للتوجيه

يمكنك عرض جدول التوجيه الرئيسي الحالي الخاص بك باستخدام أي من الأوامر التالية 3:

# ip route show
# route -n
# netstat -rn
Check Linux Route Table

العمود الأول في إخراج الأوامر الثلاثة يشير إلى الشبكة المستهدفة. يعرض إخراج 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 كبوابة”.

Route Network in Linux

بالمثل في dev4 (جهاز openSUSE) لعمل ping للمضيفين في شبكة 192.168.0.0/24:

# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3
Network Routing in Linux

أخيرًا، نحتاج إلى تمكين التوجيه في جهاز التوجيه Debian الخاص بنا:

# echo 1 > /proc/sys/net/ipv4/ip_forward

الآن دعنا نقوم بعمل ping:

Check Network Routing

و،

Route Ping Status

لجعل هذه الإعدادات ثابتة عبر عمليات التمهيد، قم بتحرير /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

في اللقطة الشاشة التالية.

Route Packages in Linux

حيث يتم تسليط الضوء على المصدر (عنوان 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
Start Quagga Service

ملاحظة: أن ripd.conf هو ملف التكوين لبروتوكول معلومات التوجيه، الذي يوفر للجهاز توجيه المعلومات حول الشبكات التي يمكن الوصول إليها ومدى بعدها (من حيث عدد القفزات).

لاحظ أن هذا هو واحد فقط من البروتوكولات التي يمكن استخدامها مع الكواجا، واخترته لهذا البرنامج التعليمي بسبب سهولة الاستخدام ولأن معظم أجهزة الشبكات تدعمه، على الرغم من أنه يعاني من عيب تمرير بيانات الاعتماد على نصوص عادية. لهذا السبب، تحتاج إلى تعيين أذونات مناسبة لملف التكوين:

# chown quagga:quaggavty /etc/quagga/*.conf
# chmod 640 /etc/quagga/*.conf 
المثال 5: إعداد الكواجا لتوجيه حركة IP ديناميكيًا

في هذا المثال سنستخدم الإعداد التالي مع جهازي توجيه (تأكد من إنشاء ملفات التكوين لـ جهاز التوجيه #2 كما شرح سابقًا):

Configure Quagga

مهم: لا تنسى تكرار الإعداد التالي لكلا الجهازين التوجيهيين.

اتصل بـ 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
Configure Router

الآن نحتاج إلى الاتصال بواجهة سطر الأوامر (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.
Enable Router

ملاحظة: أنه في كلا الحالتين يتم إلحاق التكوين بالأسطر التي أضفناها سابقًا (/etc/quagga/zebra.conf و /etc/quagga/ripd.conf).

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

# show ip route
Check IP Routing

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

الختام

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

Source:
https://www.tecmint.com/setup-linux-as-router/