היכן נכנס NAT של VPN ל-before.rules של UFW ואיך לבדוק אותו
שורת NAT ב-before.rules חייבת לעמוד בתוך מקטע טבלה תקף עם COMMIT. נתחו את המועמד עם iptables-restore --test לפני טעינה מחדש של UFW.
כלל NAT שעובד כשמקלידים אותו ב-shell נכשל כשמדביקים אותו ב-before.rules, מפני שהקובץ הזה אינו סקריפט. זהו מסמך בפורמט שחזור עם מקטעי טבלה, הצהרות שרשרת וסמן COMMIT לכל טבלה. שורה במקום הלא נכון או מפסיקה את כל השחזור או משליכה בשקט כללים שחשבתם שקיימים. הנהלים שלהלן מציבים את הקטע במקום שהמסגרת מצפה לו ומוכיחים את התוצאה לפני הטעינה הבאה.
פקודת shell אינה קובץ שחזור
שורה שמתחילה ב-iptables -t nat היא הוראה לבינרי iptables, ואילו הקובץ ש-UFW קורא הוא תיאור של מערך כללים שלם. ההבדל אינו קוסמטי: פורמט השחזור חייב לדעת באיזו טבלה הוא נמצא, אילו שרשראות קיימות והיכן הטבלה מסתיימת. פקודה שמודבקת למסמך הזה היא או שגיאת תחביר או, גרוע מכך, כלל שמצורף לטבלה הלא נכונה. המסגרת טוענת את הקבצים האלה דרך כלי שחזור דווקא מפני שהם הצהרתיים ולא סדרתיים.
המסמך נטען גם כשלם, ולכן מקטע פגום אחד יכול לעצור את החלת שאר הקובץ. כך שגיאה קטנה בקטע NAT גוררת איתה גם את כללי הסינון, וכך שינוי בחומת אש הופך להשבתה.
הציבו את הקטע בתוך מקטע הטבלה הקיים
לקטע NAT יש צורה, והצורה חשובה יותר מטקסט הכלל שבתוכו. כותרת הטבלה פותחת את המקטע, הצהרות השרשרת קובעות את המונים, הכללים באים אחריהן, ו-COMMIT סוגר את המקטע.
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.55.0.0/24 -o ens3 -j MASQUERADE
COMMIT
המאגר והממשק שלמעלה הם מצייני מקום לשלכם; המבנה הוא החלק ששווה להעתיק. אם הקובץ כבר מכיל מקטע *nat, הוסיפו את הכלל בתוך אותו מקטע במקום לפתוח מקטע שני, כי הפורמט מצפה ל-COMMIT אחד לכל טבלה ושני מקטעים לאותה טבלה הם תיקון שממתין לקרות. שמרו על הגדרות השרשרת של ההפצה בשלמותן, כולל אלה שהספק הוסיף לאינטגרציה שלו. מדריך מסגרת UFW מתעד את הקבצים before, user ו-after יחד עם הדרישה ל-COMMIT תואם.
אם הקובץ מתברר כריק, אל תמלאו אותו מתוך מדריך. ודאו איזה חבילה מחזיקה בו ומהי המדיניות החיה בפועל, כי קובץ מתמיד ריק אינו מוכיח שלגרעין אין כללים, ומערך כללים טעון אינו מוכיח שהטעינה הבאה תמצא קובץ שלם לקרוא. שחזרו תחילה את קו הבסיס הנתמך, ואז החילו מחדש את שינויי האתר על גביו.
בדקו את המועמד בלי להחיל אותו
כלי השחזור יכול לנתח ולבנות מערך כללים בלי להחיל אותו, וזו הבדיקה הזולה ביותר הזמינה. הריצו אותו על עותק מוגן ולא על הקובץ החי, וקראו את טקסט השגיאה ולא רק את סטטוס היציאה. כשל ניתוח מציין שורה ובדרך כלל טבלה, וזה יותר ממה שטעינה מחדש שנכשלה תספר לכם.
sudo cp /etc/ufw/before.rules /root/before.rules.bak
sudo iptables-restore --test < /root/before.rules.bak
echo "exit: 0"
מעבר הבדיקה הזו מוכיח שהמסמך מנותח ותו לא. הוא אינו מוכיח שהמועמד עדיין מכיל כל שרשרת ש-UFW תלוי בה, שהוא מתיר רק את המקורות שהתכוונתם אליהם, או שהניהול מרחוק נשאר נגיש. אלה סקירות נפרדות, והאחרונה ראויה לסשן שני שנפתח לפני שמתחילים.
בחרו בכלי שמתאים ל-backend המותקן ולמשפחת הכתובות. מארח שמריץ את ה-backend של nft דרך שכבת התאימות צריך את הפקודה המתאימה, וכללי IPv6 חיים בקובץ אחר לגמרי.
הפרידו בין העברה קדימה, NAT ומדיניות גישה
תרגום מקור פותר בעיית כתובות ואינו מעניק דבר. העברה קדימה היא הרשאה נפרדת שנשלטת על ידי sysctl ועל ידי טבלת הסינון, והיא זו שאנשים שוכחים כאשר מנהרה מנתבת אך אינה מעבירה תעבורה. מדיניות גישה היא החלטה שלישית לגבי אילו מקורות רשאים להגיע לאילו שירותים, ואף כלל NAT אינו מבטא אותה. דווקא הפרדת השלושה היא שהופכת כשל לניתן לאבחון במקום לתסמין מעורפל אחד.
sysctl net.ipv4.ip_forward
sudo iptables -t nat -S POSTROUTING
sudo iptables -S FORWARD
קראו את שלושת הפלטים יחד ולא אחד בכל פעם. כלל masquerade עם העברה קדימה מושבת יוצר לקוח שמתחבר ולא מגיע לשום מקום, מה שמצד הלקוח נראה בדיוק כמו תקלת ניתוב ומפנה אנשים לקובץ הלא נכון. טבלת הסינון היא גם המקום שבו מסתתר accept רחב מדי, אז בדקו את מדיניות ברירת המחדל שלה בזמן שאתם שם.
ודאו טעינה מחדש, דחייה ואובדן VPN
שלוש תצפיות יוצרות בדיקת קבלה מלאה: הטעינה מחדש מצליחה, פעולת לקוח מורשית עובדת, ובקשה שאמורה להידחות אכן נדחית. השלישית היא זו שמדלגים עליה, והיא ההוכחה היחידה שהמדיניות עושה משהו בכלל.
sudo ufw reload
sudo ufw status verbose
sudo iptables -t nat -L POSTROUTING -n -v
לאחר מכן בדקו את הכשל שעבורו תכננתם. הפילו את המנהרה וראו מה המארח עושה, כי מדיניות שעובדת רק כאשר VPN פעיל היא מדיניות עם תלות לא מוצהרת. טענו שוב פעם אחת אחר כך כדי להוכיח שהקובץ, ולא מצב ריצה שנותר, הוא שמפיק את התוצאה העובדת.
NAT של IPv4 אינו אומר דבר על IPv6, לכן ציינו את הכיסוי המיועד לשתי המשפחות באותה הערה כמו הכלל. המטרה היא מדיניות מנוהלת קוהרנטית, וקטע שבמקרה עבר ניתוח אינו הוכחה לכך.