עמית ה-WireGuard נעלם אחרי אתחול: מצאו את התצורה האמיתית
עמית שהוספתם עם wg set עובד עד האתחול הבא, כי הממשק נבנה מחדש מקובץ או מפרופיל שלא ערכתם אף פעם. קודם כל מצאו את הבעלים.
העמית שהוספתם עם wg set עונה ל-ping כל אחר הצהריים ונעלם אחרי האתחול. שום דבר לא ניזוק: הליבה מעולם לא שמרה את העמית הזה בשום מקום מלבד הממשק החי, וכל מה שיוצר מחדש את הממשק בעת האתחול בנה אותו מקובץ שלא נגעתם בו. התיקון אינו wg set נוסף. צריך לברר איזה רכיב מחזיק בבעלות על הממשק, לערוך את המצב של אותו רכיב, ואז להוכיח שהעמית שורד בדיוק את אירוע מחזור החיים שהסיר אותו.
שחזרו את התקלה פעם אחת, בכוונה
אל תתקנו בעיית אתחול לפני שתוכלו לראות אותה קורית. עם גישה למסוף או גישה מחוץ לרשת, רשמו את רשימת העמיתים, אתחלו דרך השירות שמחזיק בממשק, והשוו. אם העמית עדיין שם, השינוי שלכם כבר הגיע למצב המתמשך ואתם מאתרים את האירוע הלא נכון.
רשמו שלוש עובדות בזמן שאתם עושים זאת: שם הממשק, היחידה או הפרופיל שהפעילו אותו, והאם מונה לחיצות הידיים של העמית ששרד אופס. מונה שאופס פירושו שהממשק נהרס ונבנה מחדש; מונה ללא שינוי עם עמית חסר פירושו שמשהו ערך את התצורה מתחת לרגליים שלכם.
מי מחזיק בבעלות על הממשק?
ל-WireGuard עצמו אין דמון ואין קובץ תצורה. משהו מעליו קורא ל-wg בעת האתחול, והמשהו הזה הוא מקור האמת. המועמדים הרגילים הם [email protected], פרופיל חיבור של NetworkManager, יחידת רשת ספציפית להפצה, או פאנל ניהול שכותב מסד נתונים משלו.
שאלו את המערכת, לא את התיעוד של ההפצה שלכם. systemctl status wg-quick@wg0 ו-nmcli connection show בדרך כלל יכריעו את העניין בפקודה אחת כל אחד. אם שניהם טוענים לבעלות על הממשק, מצאתם את הבאג לפני שערכתם משהו: שני בעלים כותבים מחדש את אותו התקן בכל הפעלה, וזה שרץ אחרון מנצח.
systemctl status wg-quick@wg0 --no-pager
grep -R "Address\|SaveConfig\|PostUp" /etc/wireguard/wg0.conf
nmcli -g NAME,TYPE connection show
wg show wg0 peersמצב ריצה ומצב אתחול אינם אותו קובץ
wg set מפעיל את ההתקן החי דרך netlink. הוא לא כותב את /etc/wireguard/wg0.conf, פרופיל NetworkManager או מסד נתונים של פאנל. wg show מוצלח לאחר מכן מוכיח שהליבה קיבלה את העמית, לא שמשהו ישחזר אותו.
יש מלכודת שנייה בכיוון ההפוך. האפשרות SaveConfig של wg-quick כותבת את מצב הממשק הנוכחי חזרה לקובץ התצורה כשהממשק מורד. כשהיא פעילה, עריכה שנעשתה בקובץ בזמן שהממשק למעלה עלולה להידרס על ידי הכיבוי שאחריה, ותשבעו שהשורה הייתה שם. אם העמית ממשיך לחזור, קראו את הקובץ אחרי עצירה, לא לפני.
NetworkManager מתנהג אחרת שוב: הוא מחזיק בבעלות על הפרופיל ומיישם אותו בהפעלה, ולכן .conf שערכתם ביד לצד חיבור NetworkManager פעיל הוא רק קישוט. בחרו בעלים אחד לממשק ותנו למנהל השני להניח לו.
גרמו לעריכה לנחות בשני המקומות
ערכו קודם את המצב המתמשך, אחר כך תנו לבעלים ליישם אותו, ואז אמתו את המצב החי. סדר כזה אומר שכשל בכל שלב מצביע על דבר אחד במקום על שלושה.
# 1. persistent state (wg-quick owner)
sudo vi /etc/wireguard/wg0.conf
# 2. apply through the owner, not by hand
sudo systemctl restart wg-quick@wg0
# 3. verify runtime matches the file
sudo wg show wg0
sudo wg showconf wg0wg showconf מדפיס את התצורה החיה באותה תחביר שבו משתמש הקובץ, מה שהופך את השניים להשוואה ישירה. התייחסו לפלט הזה כאל סוד: יש בו מפתחות פרטיים, אז אל תדביקו אותו בכרטיס או בערוץ צ'אט. השוו מפתחות ציבוריים של העמיתים וכתובות IP מותרות, ובדקו שהעמית שהסרתם בכוונה לא חזר.
הוכיחו שהוא שורד את אירוע מחזור החיים
אתחלו דרך הבעלים פעם שנייה, ואז אשרו שלושה דברים נפרדים: העמית מופיע ב-wg show, מונה לחיצות הידיים גדל אחרי תעבורה, והאפליקציה שתלויה במנהרה באמת עונה. עמית שמופיע עם לחיצת ידיים ישנה הוא בעיית ניתוב או מפתח, לא בעיית התמדה, וההבחנה הזו חוסכת עריכת תצורה מיותרת.
לבסוף, בדקו מה האתחול החזיר. אתחול שמקים לתחייה עמית שהסרתם במכוון הוא אותו באג עם סימן הפוך, ובדרך כלל משמעותו שעדיין נטען עותק ישן של התצורה ממקום כלשהו. רשמו את הבעלים, נתיב הקובץ, המפתח הציבורי של העמית ופקודות האימות לצד התצורה, כדי שהאדם הבא לא יגלה זאת מחדש באתחול של שרת ייצור.