האזהרה של OpenVPN על כמה סקריפטי --up: רק אחד פועל
סידור מחדש של שני שורות up לא יגרום לשניהם לפעול. OpenVPN שומר פקודה אחת לכל שלב, אז מצאו את שתי ההגדרות ותנו לעבודה נקודת כניסה אחת.
האזהרה על כמה סקריפטים נשמעת כמו תלונה על תזמון, ולכן התיקון המובן מאליו הוא לסדר מחדש את השורות עד שהיא תיעלם. זו אינה תלונה על תזמון. הגדרת --up מאוחרת מחליפה את הפקודה שכבר נשמרה לאותו שלב, והמנתח אומר זאת, כלומר מבין שני הסקריפטים שלכם בדיוק אחד אי פעם רץ. השני לא ממתין בתור מאחוריו; הוא נעלם.
לכן האזהרה ראויה לתשומת לב למרות שאינה קטלנית: מה שהיא חוזה הוא עדכון DNS או שינוי מסלול שהפסיק לקרות בשקט.
האזהרה אינה עוסקת בסדר
OpenVPN שומר פקודת סקריפט משתמש אחת לשלב up. כשהמנתח פוגש הגדרה אחרת, מהפרופיל, מקובץ כלול או משורת הפקודה, הוא מחליף את מה שכבר החזיק ומפיק את האזהרה. שום דבר אינו משורשר, שום דבר אינו רץ פעמיים, ושאלת סדר אינה קיימת. הפקודה ששורדת היא זו שהמנתח ראה אחרונה, ולכן העברת שורה יכולה להחליף את המנצח בעוד הסקריפט השני נשאר מת.
אותו דפוס תקף לשאר שלבי הסקריפט: פקודה אחת לכל אחד. אם שני חלקי עבודה חייבים לקרות שניהם, הם זקוקים לנקודת כניסה אחת, לא לשתי הנחיות שנראות כמו רשימה.
מצאו את שתי ההגדרות בהפעלה האמיתית
התחילו ממה שהדמון קיבל בפועל, ולא מהפרופיל שערכתם. ps -ef ו-ExecStart של היחידה מציגים את שורת הפקודה, שאליה אפשר להוסיף --up מנקודת כניסה של מכולה או מעטיפה; קובץ init של הפצה יכול לעשות אותו דבר. systemctl cat openvpn-server@server חושף מה השירות עצמו תורם, ו-grep רקורסיבי בספריית התצורה מוצא את ההגדרות ברמת הקובץ. כפילויות מגיעות בדרך כלל משכבות שונות, וזו בדיוק הסיבה שעריכת קובץ אחד לא משנה דבר.
העתקת סקריפט לספרייה אחרת או שינוי שמו גם אינה מסירה הנחיה. המנתח סופר הגדרות, לא קבצים.
תנו ל-hook אחד להחזיק בעבודה
התיקון העמיד הוא dispatcher אחד שמריץ את שתי הפעולות בסדר מכוון. סקריפט shell קצר עם set -eu שקורא לאינטגרציה הנדרשת ואז לפעולה המקומית, ומעביר את "$@" כדי שגבולות הארגומנטים ישרדו, שומר את ההתנהגות במקום אחד שניתן לבקר. העברת ארגומנטים רק משמרת אותם; היא אינה מוכיחה ששני העוזרים מצפים לאותו ממשק, אז קראו את החוזה של כל אחד. החליטו מה כשל אמור לעשות והאם שינויים חלקיים צריכים להתבטל.
אם המשגר מציע hook הרחבה נתמך, העדיפו אותו על שרשור שנבנה ביד. לתמונת מכולה או לחבילת ספק יש לעתים קרובות מקום מתועד לעבודה נוספת, והשימוש בו מונע משדרוג לדרוס את ה-dispatcher שלכם.
הניקוי שייך לשלב ה-down המתאים. פעולת up שמשכתבת DNS או מוסיפה מסלולים זקוקה לביטול מתועד, ואילו dispatcher שמטפל רק בהפעלה הוא חצי עיצוב.
אמתו את האינטגרציה, לא רק את השקט
הסרת אזהרת הכפילות היא החלק הקל; האינטגרציה עדיין חייבת לעבוד. בדקו את מצב הפותר לאחר התחברות עם resolvectl status או בקריאת /etc/resolv.conf, ואמתו מסלולים עם ip route. אחר כך התנתקו והתחברו מחדש, כי hook ששורשר בחופזה נוטה להשאיר משהו מהפעלה הקודמת. journalctl -u openvpn-server@server -b מראה אם ה-dispatcher שלכם רץ ומה הוא הדפיס.
שמרו על הרשאות ה-hook במקום שבו הן צריכות להיות. העלאת script-security או הרצת הדמון עם יותר זכויות אינה תיקון ל-hook מוחלף; היא מרחיבה מה כל סקריפט עתידי יכול לעשות, כולל כזה שתוקף יזכה לתת לו שם.
הסימן שהתיקון אמיתי אינו שקט ביומן. אלה תשובת ה-DNS, רשומת המסלול והניקוי שכולם עובדים אחרי שתי התחברויות מחדש.