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

הצמידו את הלקוח לפני שכותבים את הכלל

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

כדי לקשור את הכתובת לתעודה, צרו קובץ בתיקייה ש-client-config-dir מציין ותנו לקובץ בדיוק את ה-common name של התעודה. שימו בו הנחיה אחת, ifconfig-push 10.8.0.6 255.255.255.0, והלקוח הזה שומר על אותה כתובת מנהרה בין התחברויות חוזרות. שני הגדרות חייבות להתקיים כדי שזה ייכנס לתוקף: client-config-dir חייב להיות מוצהר בתצורת השרת, והכתובת שנדחפת חייבת לשבת בתת-רשת שהשרת יכול לנתב. אם אחד מהם חסר, הקובץ מתעלם בלי שגיאה, מה שהופך את בדיקת חומת האש הבאה למטעה.

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

הסדר קובע אם ההשלכה תרוץ

בשער Linux שמעביר בין המנהרה ל-LAN, מנות חוצות את שרשרת FORWARD. קראו את הפקודה שלמטה כמשפט: הכניסו בראש FORWARD, התאימו תעבורה שנכנסת מ-tun0, מאותו מארח בודד, המכוונת לתת-רשת ה-LAN, והשליכו אותה.

iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP

ה--I הוא מה שמפעיל את הכלל. כשמוסיפים אותו עם -A, הוא נוחת מתחת לכל קבלה רחבה לתת-רשת המנהרה ולא רואה מנה לעולם. אמתו את המיקום עם iptables -vnL FORWARD --line-numbers, וקראו גם את המונים: השלכה למעלה שלא סופרת דבר אומרת שהתעבורה מגיעה בנתיב אחר.

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

מה שהמסנן לא יכול לראות

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

תעבורת עמיתים לא נוגעת בחומת האש של המארח לעולם. כש-client-to-client מופעל, OpenVPN מעביר את המנות האלה בתוך הדמון, ולכן לא FORWARD ולא INPUT רואים אותן. התיקונים היחידים הם לכבות את client-to-client או לקבל שעמיתים יכולים להגיע אחד לשני; כלל iptables לא יראה את התעבורה הזו.

IPv6, קושחה והישרדות לאחר אתחול

כלל IPv4 לא אומר דבר על IPv6. אם המנהרה וה-LAN נושאים את שתי המשפחות, הכלל המקביל חייב להתקיים ב-ip6tables, או במערכת כללי ה-nftables שמחזיקה במדיניות במארח הזה. קושחת הנתב מסתירה לעיתים קרובות את netfilter מאחורי הפשטה משלה, ולכן ייתכן שתחביר ושמות טבלאות שהועתקו מפורום לא יחולו.

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

אמתו לפי נתיב, ואז חזרו אחורה נקי

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

נתיבצפוי עם הכללכשזה נכשל
לקוח חסום אל מארח LANאין תשובההכלל יושב מתחת לקבלה, או שהמקור לא מתאים
לקוח חסום אל האינטרנטעובד דרך tun0הכלל רחב מדי, בלי התאמת יעד
לקוח שני אל אותו מארח LANעובדהכלל התאים ליותר מהמארח המיועד
לקוח חסום אל כתובת ה-LAN של השערחסום רק עם כלל ה-INPUT המתאיםכלל INPUT חסר
לקוח חסום אל כתובת מנהרה של עמיתעדיין עובדclient-to-client מופעל ומחוץ לתחום חומת האש

חזרה אחורה היא מחיקה לפי מפרט, לא flush: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP מסיר בדיוק את הרשומה הזו ומשאיר את שאר השרשרת שלמה. הסירו את אותה שורה מכל קובץ שמשחזר את הכללים באתחול, טענו אותו מחדש, ואשרו שהלקוח מגיע שוב אל מארח ה-LAN. flush על FORWARD היה מבטל גם כללים שלא כתבתם, מה שהופך חזרה אחורה לתקרית שנייה.

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

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