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

למה אותה כתובת בכל צומת עובדת

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

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

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

הקצה אותה ל-loopback, לא למנהרה

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

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

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

ip address show dev lo | grep 10.250.0.1
ip address add 10.250.0.1/32 dev lo

דחוף מסלול אחד והתכוון ליעד אחד

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

בדוק מה הלקוח התקין לפני שאתה מאשים את השירות.

ip route get 10.250.0.1

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

מה הכתובת המשותפת לא יכולה לעשות

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

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

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

שמור את זהות השירות עם השם

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

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

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

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

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

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