חקירה עמוקה לארכיטקטורת Iptables ו-Netfilter

הקדמה

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

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

מהם IPTables ו-Netfilter?

במשך שנים רבות, התוכנה לסנן חומה הנפוצה ביותר ב-Linux נקראה iptables. בקצת הפצות, הוחלפה בכלי חדש בשם nftables, אך תחביר ה-iptables עדיין נהוג כנקוביות. סנן החומה iptables פועל על ידי אינטראקציה עם ה-"hooks" לסינון חבילות בגרסת ה-Linux networking stack. נקרא ל-"hooks" אלו גם מסגרת ה-netfilter.

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

ה-"Netfilter Hooks"

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

ה-"hooks" הבאים מייצגים את נקודות המפתח המוגדרות היטב במחסנית הרשת:

  • NF_IP_PRE_ROUTING: הגיג יפעל על ידי כל תעבורה נכנסת בזמן קרוב לאחר שנכנסת למסגרת הרשת. הגיג זה נעבר לפני שינוע החלטות בנוגע לכתובת לשליחת החבילה.
  • NF_IP_LOCAL_IN: הגיג זה נפעל לאחר שחבילה נכנסת כבר הורוטתה אם החבילה מיועדת למערכת המקומית.
  • NF_IP_FORWARD: הגיג זה נפעל לאחר שחבילה נכנסת הורוטתה אם החבילה צפה להיעבר למחשב אחר.
  • NF_IP_LOCAL_OUT: הגיג זה יפעל על ידי כל תעבורה יוצאת מקומית מיד לאחר שהיא מתקעה במסגרת הרשת.
  • NF_IP_POST_ROUTING: הגיג זה יפעל על ידי כל תעבורה יוצאת או מועברת לאחר שנעשתה הכוונה וממש לפני שנשלחת לפיווים.

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

טבלאות ושרשרות של IPTables

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

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

שמות השרשרות המובנות משקפות את שמות ה-netfilter השמות איתם הן משוייכות:

  • PREROUTING: מופעל על ידי פסקות ה-NF_IP_PRE_ROUTING.
  • INPUT: מופעל על ידי פסקות ה-NF_IP_LOCAL_IN.
  • FORWARD: מופעל על ידי פסקות ה-NF_IP_FORWARD.
  • OUTPUT: מופעל על ידי פסקות ה-NF_IP_LOCAL_OUT.
  • POSTROUTING: מופעל על ידי פסקות ה-NF_IP_POST_ROUTING.

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

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

אילו טבלאות זמינות?

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

טבלת הסינון

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

הטבלה NAT

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

הטבלה Mangle

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

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

הטבלה גלואית

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

הטבלה raw יש תפקיד מוגבל מאוד. המטרה היחידה שלה היא לספק מנגנון לסימון חבילות כדי לבחור ממעקב אחר חיבור.

טבלת האבטחה

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

יחסים בין שרשראות לטבלאות

אם שלוש טבלאות מכילות שרשרת PREROUTING, באיזה סדר הן מוערכות?

על הטבלה הבאה לציין את השרשרות הזמינות בתוך כל טבלת \texttt{iptables} כאשר נקראת משמאל לימין. לדוגמה, ניתן לראות שבטבלה של \texttt{raw} יש שתי שרשרות – \texttt{PREROUTING} ו-\texttt{OUTPUT}. כאשר נקרא מלמעלה למטה, הטבלה מציגה גם את הסדר שבו יש לקרוא לכל שרשרת כאשר ה-\texttt{hook} המתאים של \texttt{netfilter} מתקבל.

A few things should be noted. In the representation below, the nat table has been split between DNAT operations (those that alter the destination address of a packet) and SNAT operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)

כשחבילת מידע מפעילה את ה-\texttt{netfilter hook}, השרשרות המתאימות יעובדו כפי שמצויין בטבלה למעלה מלמעלה למטה. ה-\texttt{hooks} (עמודות) שחבילת מידע תפעיל יתלוו לסוג החבילה – נכנסת או יוצאת, החלטות המסלול שנעשו, והאם החבילה עוברת דרכו של קריטריוני סינון.

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

סדר עבר שרשרות

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

  • חבילות נכנסות המיועדות למערכת המקומית: PREROUTING -> INPUT
  • חבילות נכנסות המיועדות למחשב אחר: PREROUTING -> FORWARD -> POSTROUTING
  • חבילות שנוצרו מקומית: OUTPUT -> POSTROUTING

אם נשלב את המידע לעיל עם הסדר המצויין בטבלה הקודמת, נראה שחבילה נכנסת המיועדת למערכת המקומית תועבר תחילה דרך שרשרת PREROUTING של טבלאות raw, mangle, ו- nat. לאחר מכן תעבור דרך שרשרת INPUT של טבלאות mangle, filter, security, ו- nat, לפני שתועבר לסוקט המקומי בסופו.

חוקי IPTables

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

התאמה

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

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

מטרות

A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:

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

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

קפיצה לשרשראות המותאמות אישית של המשתמש

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

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

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

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

IPTables ומעקב אחר חיבורים

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

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

המערכת בודקת כל חבילה נגד סט של חיבורים קיימים. היא תעדכן את מצב החיבור במאגר שלה כרצונה ותוסיף חיבורים חדשים למערכת כשצריך. חבילות שסומנו עם המטרה NOTRACK באחת השרשראות של raw יעברו את רגעי המעקב אחר החיבור.

מצבים זמינים

חיבורים שמיועדים על ידי מערכת מעקב החיבור יהיו באחד מהמצבים הבאים:

  • NEW: כאשר חבילה מגיעה שאינה מקושרת לחיבור קיים, אך אינה לא חוקית כחבילה ראשונה, חיבור חדש יתווסף למערכת עם התווית הזו. זה קורה עבור פרוטוקולים המודעים לחיבור כמו TCP וגם עבור פרוטוקולים ללא חיבור כמו UDP.
  • התקבלה: חיבור משתנה מ-חדש ל-התקבלה כאשר הוא מקבל תגובה תקפה בכיוון הנגדי. עבור חיבורי TCP, זה אומר SYN/ACK ועבור תעבורת UDP ו-ICMP, זה אומר תגובה שבה מקור ויעד של החבילה המקורית מתחלפים.
  • קשור: חבילות שאינן חלק מחיבור קיים, אך מקושרות לחיבור שכבר במערכת מסומנות כ-קשור. זה עשוי להיות משמעות לחיבור עזר, כמו במקרה של חיבורי העברת נתונים של FTP, או זה עשוי להיות תגובות ICMP לניסיונות חיבור של פרוטוקולים אחרים.
  • לא תקף: חבילות יכולות להיות מסומנות כ-לא תקף אם הן לא מקושרות לחיבור קיים ואינן מתאימות לפתיחת חיבור חדש, אם הן לא ניתנות לזיהוי, או אם הן אינן ניתנות לניתוב מסיבות אחרות.
  • לא מעוקב: חבילות יכולות להיות מסומנות כ-לא מעוקב אם הן נמצאות ברשימה של רשומות raw כדי להתעלם ממעקב.
  • SNAT: זוהי מצב וירטואלי המוגדר כאשר כתובת המקור הוחלפה על ידי פעולות NAT. זה משמש את מערכת מעקב החיבורים כך שהיא יודעת לשנות את כתובות המקור בחבילות תגובה.
  • DNAT: זוהי מצב וירטואלי המוגדר כאשר כתובת היעד הוחלפה על ידי פעולות NAT. זה משמש את מערכת מעקב החיבורים כך שהיא יודעת לשנות את כתובת היעד בחבילות תגובה בזמן הכוונה.

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

מסקנה

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

אם ברצונך לדעת יותר על איך לבחור מדיניות יעילה של iptables, תבדוק מדריך זה.

מדריכים אלו יכולים לעזור לך להתחיל ביישום של כללי החומה של iptables:

Source:
https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture