כיצד להפוך שרת Linux לראוטר לטיפול בתעבורה באופן סטטי ודינמי – חלק 10

כפי שצפינו בשיעורים הקודמים בסדרת LFCE (Linux Foundation Certified Engineer), במאמר זה נדון בניתוב של תעבורת IP באופן סטטי ודינמי עם יישומים ספציפיים.

Linux Foundation Certified Engineer – Part 10
מבוא לתוכנית התעודה של הקרן לינוקס

לפני כל דבר, בואו נגדיר כמה מונחים ברורים:

  1. במילים פשוטות, חבילה היא היחידה הבסיסית שמשמשת להעברת מידע בתוך רשת. רשתות שמשתמשות ב־TCP/IP כפרוטוקול רשת עוקבות אחר אותן כללים להעברת נתונים: המידע הממשי מחולק לחבילות שמורכבות גם מנתונים וגם מהכתובת לה יש לשלוח אליה.
  2. ניתוב הוא התהליך של "הדרכת" הנתונים ממקורם ליעדם בתוך רשת.
  3. ניתוב סטטי מחייב סט של כללים שמוגדרים בטבלת ניתוב באופן ידני. הכללים אלו קבועים ומשמשים להגדרת הדרך שחבילה חייבת לעבור בה כאשר היא נוסעת ממכונה אחת למכונה אחרת.
  4. ניתוב דינמי, או ניתוב חכם (אם תרצו), אומר שהמערכת יכולה לשנות באופן אוטומטי, כפי שנדרש, את המסלול שחבילה נוסעת בו.

תצורת מתקדמת של 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 show (לאחר המילת מפתח 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 מוגדר כ-true כך:

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 (Network Address Translation), המציינת שהכרטיס 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. זה מאפשר למנהלי מערכות ליישם, באמצעות שרת Linux זול ביחס, את אותה פונקציונליות שמספקים נתבי Cisco חזקים (וחמים).

הכלי עצמו אינו מטפל בניתוב, אלא משנה את טבלת הניתוב של הליבה בעודו לומד מסלולים חדשים כדי לטפל בחבילות.

מאחר שזהו גרסה משונה של zebra, תוכנית שפיתוחה נעצר לפני זמן רב, היא שומרת מסיבות היסטוריות על אותן פקודות ומבנה כמו ב-zebra. לכן תראה התייחסות רבה ל-zebra מנקודה זו ואילך.

שימו לב שאי אפשר לכסות ניתוב דינמי וכל הפרוטוקולים הקשורים במאמר יחיד, אך אני בטוח שהתוכן שמוצג כאן ישמש נקודת התחלה לבניית הבסיס שלך.

התקנת Quagga ב-Linux

כדי להתקין את quagga על ההפצה שבחרת:

# 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 הוא קובץ התצורה עבור פרוטוקול מידע הניתוב, שמספק לנתב את המידע על הרשתות שניתן להגיע אליהן וכמה רחוק (ביחס לכמות הקפיצות) הן.

שים לב כי זהו רק אחד מהפרוטוקולים שניתן להשתמש בהם יחד עם quagga, ובחרתי בו עבור המדריך הזה עקב קלות השימוש וכי רוב המכשירים ברשת תומכים בו, אף על פי שיש לו את החסרון של מעבר פרטיות בטקסט פשוט. בשל כך, עליך להקצות הרשאות נכונות לקובץ התצורה:

# chown quagga:quaggavty /etc/quagga/*.conf
# chmod 640 /etc/quagga/*.conf 
דוגמה 5: הגדרת quagga לניתוב תעבורת 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).

לבסוף, התחבר שוב לשירות הזברה בשני הראוטרים ושים לב איך כל אחד מהם "למד" את המסלול לרשת שנמצאת מאחורי השני, ומי הקפיץ הבא להגיע לרשת זו, על ידי הרצת הפקודה show ip route:

# show ip route
Check IP Routing

אם ברצונך לנסות פרוטוקולים או הגדרות שונות, עשוי להיות שתרצה להתייעץ באתר הפרויקט Quagga לתיעוד נוסף.

מסקנה

במאמר זה הסברנו כיצד להגדיר מסלולים סטטיים ודינמיים, באמצעות ראוטר(ים) בלינוקס. נשמח להוסיף כמה שרוצים ראוטרים, ולנסח את עצמנו ככל כוחנו. אל תהסס לשוב אלינו באמצעות טופס הקשר למטה אם יש לך הערות או שאלות.

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