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

עקבו אחרי המנות אחרי התרגום

קחו מאגר לקוחות 10.90.0.0/24 וכתובת מנהרה 10.90.0.1. שתי מכולות יושבות על גשר אחד: 192.0.2.2 מריץ את ה-VPN ו-192.0.2.3 מריץ את האפליקציה. לקוח מתחבר אל 10.90.0.1:8080, וכלל ה-DNAT במרחב השמות של מכולת ה-VPN כותב זאת מחדש לכתובת ולפורט האמיתיים של האפליקציה. משם נתיב שולח את המנות דרך הגשר. הכתובות האלה להמחשה, לא מתכון לפריסה.

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

ההרשאה שייכת לנתיב ההעברה

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

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

docker exec vpn-container ip route get 192.0.2.3
docker exec vpn-container iptables -t nat -S
docker exec vpn-container iptables -S FORWARD

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

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

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

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

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

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

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

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