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

תנו שם לתפקיד התעבורה לפני שנוגעים בבקרה

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

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

Traffic roleControl that decides itWhere it lives in the configSymptom when it is wrong
A client reaching a listener on the routerInput policy of the zone that carries the connection, or a rule for the portoption input in the zone stanza, or a named ruleThe handshake never completes and the tunnel log says nothing
A tunnel client reaching the router itselfInput policy of the tunnel zoneoption input in the VPN zoneA ping to the gateway fails
A tunnel client reaching another LAN hostForwarding from the tunnel zone to the LAN zoneconfig forwarding plus the zone assignmentThe gateway answers and the file share times out
The router's own traffic leaving the WANOutput policy, and translation if the far side needs itoption output and option masqThe tunnel never establishes, or replies vanish

מאזין על הנתב צריך כלל כניסה צר אחד

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

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

config zone
    option name 'wan'
    option input 'REJECT'
    option forward 'REJECT'
    option output 'ACCEPT'
    option masq '1'

config rule
    option name 'allow-openvpn'
    option src 'wan'
    option proto 'udp'
    option dest_port '1194'
    option target 'ACCEPT'

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

fw4 check
service firewall reload

בקשה של לקוח עוברת דרך העברה, לא דרך כניסה

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

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

הסוואת כתובות היא החלטת ניתוב, לא הרשאה

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

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

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

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

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

nft list chain inet fw4 forward_wan
logread -f | grep -i -E 'DROP|REJECT'

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

מאמרים קשורים