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

מבוא לתוכנית התעודה של הקרן לינוקס
לפני כל דבר, בואו נגדיר כמה מונחים ברורים:
- במילים פשוטות, חבילה היא היחידה הבסיסית שמשמשת להעברת מידע בתוך רשת. רשתות שמשתמשות ב־TCP/IP כפרוטוקול רשת עוקבות אחר אותן כללים להעברת נתונים: המידע הממשי מחולק לחבילות שמורכבות גם מנתונים וגם מהכתובת לה יש לשלוח אליה.
- ניתוב הוא התהליך של "הדרכת" הנתונים ממקורם ליעדם בתוך רשת.
- ניתוב סטטי מחייב סט של כללים שמוגדרים בטבלת ניתוב באופן ידני. הכללים אלו קבועים ומשמשים להגדרת הדרך שחבילה חייבת לעבור בה כאשר היא נוסעת ממכונה אחת למכונה אחרת.
- ניתוב דינמי, או ניתוב חכם (אם תרצו), אומר שהמערכת יכולה לשנות באופן אוטומטי, כפי שנדרש, את המסלול שחבילה נוסעת בו.
תצורת מתקדמת של 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 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 כשער".

באופן דומה ב-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 מוגדר כ-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
מוצג בצילום המסך הבא.

המופיע בהדגמה הוא מקור (כתובת 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

הערה: כי ripd.conf הוא קובץ התצורה עבור פרוטוקול מידע הניתוב, שמספק לנתב את המידע על הרשתות שניתן להגיע אליהן וכמה רחוק (ביחס לכמות הקפיצות) הן.
שים לב כי זהו רק אחד מהפרוטוקולים שניתן להשתמש בהם יחד עם quagga, ובחרתי בו עבור המדריך הזה עקב קלות השימוש וכי רוב המכשירים ברשת תומכים בו, אף על פי שיש לו את החסרון של מעבר פרטיות בטקסט פשוט. בשל כך, עליך להקצות הרשאות נכונות לקובץ התצורה:
# chown quagga:quaggavty /etc/quagga/*.conf # chmod 640 /etc/quagga/*.conf
דוגמה 5: הגדרת quagga לניתוב תעבורת 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).
לבסוף, התחבר שוב לשירות הזברה בשני הראוטרים ושים לב איך כל אחד מהם "למד" את המסלול לרשת שנמצאת מאחורי השני, ומי הקפיץ הבא להגיע לרשת זו, על ידי הרצת הפקודה show ip route:
# show ip route

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