כיצד להגדיר חומת אש Iptables כדי לאפשר גישה מרחוק לשירותים בלינוקס – חלק 8

Linux Foundation Certified Engineer – Part 8

מציג את תוכנית התעודה של קרן לינוקס

תזכור מחלק 1 – אודות Iptables של סדרת LFCE (הנדסאי מוסמך של קרן לינוקס) שנתנו תיאור בסיסי של מהו חומת אש: מנגנון לניהול חבילות הנכנסות ויוצאות מהרשת. בעצם "ניהול" אנו מתכוונים:

  1. לאפשר או למנוע חבילות מסוימות להיכנס או לצאת מהרשת שלנו.
  2. להעביר חבילות אחרות מנקודה אחת ברשת לנקודה אחרת.

על סמך קריטריונים מוגדרים מראש.

במאמר זה נדון באיך ליישם סינון חבילות בסיסי ואיך להגדיר את החומה עם iptables, ממשק קדמי ל-netfilter, שהוא מודול ליבתי נטיבי המשמש להגנת חומה.

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

ניתן לחשוב על חומת אש כשדה תעופה בינלאומי שמטוסי נוסעים מגיעים ויוצאים כמעט 24/7. בהתבסס על מספר תנאים, כגון תוקפות הדרכון של האדם, או מדינת המוצא שלו/שלה (לציין כמה דוגמאות) הוא או היא עשויים, או לא עשויים, להיכנס או לצאת ממדינה מסוימת.

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

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

  1. אנשים = חבילות
  2. גימבור = שדה תעופה
  3. מדינה מספר 1 = רשת מספר 1
  4. מדינה מספר 2 = רשת מספר 2
  5. תקנות שדה התעופה שמופעלות על ידי עובדים = כללי גימבור

Iptables – היסודות

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

הפעולה הראשונה שתבצע iptables תהיה להחליט מה לעשות עם חבילה:

  1. לקבל אותה (לאפשר לה לעבור לרשת שלנו)?
  2. לדחות אותה (למנוע ממנה לגשת לרשת שלנו)?
  3. להעביר אותה (לשרשרת אחרת)?

רק במקרה שתהוו על זה למה הכלי הזה נקרא iptables, זה משום שהשרשראות האלה מאורגנות בטבלאות, עם טבלת הסינון הידועה ביותר והטבלה שמשמשת ליישום סינון חבילות עם שלושת השרשראות המוגדרות כברירת מחדל:

1. השרשרת INPUT עוסקת בחבילות הנכנסות לרשת, שמיועדות לתוכניות מקומיות.

2.השרשרת פלט משמשת לניתוח חבילות שנוצרו ברשת המקומית וצריכות להישלח החוצה.

3.השרשרת קידום מעבדת את החבילות שצריכות להישלח ליעד אחר (כמו במקרה של נתב).

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

# iptables -L

המדיניות הזמינה היא כדלקמן:

  1. קבל → מאפשר לחבילה לעבור. כל חבילה שאינה מתאימה לאף כלל בשרשרת מותרת להיכנס לרשת.
  2. הורד → משליך את החבילה בשקט. כל חבילה שאינה מתאימה לאף כלל בשרשרת מונעת מלהיכנס לרשת.
  3. דחה → מדחה את החבילה ומחזירה הודעת מידע. מדיניות זו בפרט אינה עובדת כמדיניות ברירת מחדל. במקום זאת, היא מיועדת להשלמת כללי סינון חבילות.
Linux Iptables Policies

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

הוספת כללים

כדי להוסיף כלל לגישת האש, עליך להפעיל את הפקודה iptables כך:

# iptables -A chain_name criteria -j target

כאשר,

  1. -A מציין להוספה (להוסיף את הכלל הנוכחי לסוף השרשרת).
  2. שם_שרשרת הוא אחת מבין INPUT, OUTPUT, או FORWARD.
  3. מטרה היא הפעולה או המדיניות ליישם במקרה זה (קבל, דחה או השלך).
  4. קריטריונים הם סט התנאים שנגדם יבדקו החבילות. הם מורכבים מלפחות אחד (ואולי יותר) מהדגלים הבאים. האפשרויות בתוך סוגריים מרובעים, מופרדות בסרגל אנכי, שקולות זו לזו. השאר מייצג מתגים אופציונליים:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

סביבת הבדיקה שלנו

בואו נדביק את כל זה ב-3 דוגמאות קלאסיות באמצעות סביבת הבדיקה הבאה לשתי הראשונות:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

וזה לדוגמה האחרונה

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
דוגמה 1: ניתוח ההבדל בין מדיניות ההשלכה והדחייה

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

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Drop ICMP Ping Request

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

# iptables -F INPUT
# iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15
Reject ICMP Ping Request in Firewall
דוגמה 2: ניטרול / הפעלת כניסות ssh מ- dev2 אל dev1

נתעסק בשרשרת הפלט מאחר שאנו עוסקים בתעבורה יוצאת:

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
Block SSH Login in Firewall
דוגמה 3: מאפשר / מונע לקוחות NFS (מ- 192.168.0.0/24) לעצב חלוקות NFS4

הריצו את הפקודות הבאות בשרת / חומת האש של NFSv4 כדי לסגור את היציאות 2049 ו- 111 לסוגי תעבורה:

# iptables -F
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT
Block NFS Ports in Firewall

עכשיו בואו נפתח את היציאות האלה ונראה מה קורה.

# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT
Open NFS Ports in Firewall

כפי שאתם רואים, הצלחנו לעצב את החלוקה NFSv4 לאחר פתיחת התעבורה.

הכנסת, הוספת ומחיקת חוקים

בדוגמאות הקודמות הראינו כיצד להוסיף כללים לשרשרת INPUT ולשרשרת OUTPUT. אם נרצה להכניס אותם במקום קבוע, נשתמש במתג -I (אות ריקה באותיות גדולות).

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

נשתמש בדוגמה פשוטה כדי להדגים זאת:

Check Rules of Iptables Firewall

נשים את הכלל הבא,

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

במיקום 2) בשרשרת ה-INPUT (ולכן נזיז את המספר 2 הקודם למספר 3)

Iptables Accept Rule

באמצעות ההגדרה הנ"ל, תתבצע בדיקת תעבורה כדי לראות האם היא מופנית לפתח 80 לפני בדיקת פתח 2049.

בנוסף, ניתן למחוק כלל ולשנות את היעד של הכללים הנותרים ל-REJECT (על ידי המתג -R):

# iptables -D INPUT 1
# iptables -nL -v --line-numbers
# iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -R INPUT 1 -p tcp --dport 80 -j REJECT
Iptables Drop Rule

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

שמירת כללי הגימור:

# iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
# iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

שחזור כללים:

# iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
# iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

כאן ניתן לראות תהליך דומה (שמירה ושחזור של כללי גימור באופן ידני) באמצעות קובץ מזוייף בשם iptables.dump במקום הברירת מחדל כפי שהוצג לעיל.

# iptables-save > iptables.dump
Dump Linux Iptables

כדי לשמור על שינויים אלו עמידים באתחולים:

אובונטו: התקן את חבילת iptables-persistent, שתטען את הכללים שנשמרו בקובץ /etc/iptables/rules.v4.

# apt-get install iptables-persistent

סנטוס: הוסף את השורות הבאות לקובץ /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

אופןסוזה: רשום את הפורטים, הפרוטוקולים, הכתובות וכדומה (מופרדים בפסיקים) בקובץ /etc/sysconfig/SuSEfirewall2.

למידע נוסף יש להפנות לקובץ עצמו, שמכיל הערות רבות.

מסקנה

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

למי מכם שהם אוהבי גדר אש, יש לזכור שנחזור על נושא זה עם יישומים ספציפיים יותר ב-חלק 10 של סדרת LFCE זו.

אל תהססו ליידע אותי אם יש לכם שאלות או הערות.

Source:
https://www.tecmint.com/configure-iptables-firewall/