אתם מוסיפים peer ל-/etc/wireguard/wg0.conf, מריצים systemctl restart wg-quick@wg0, וה-peer נעלם מהקובץ כשאתם מסתכלים שוב. שום דבר לא קלקל שום דבר. הפעלה מחדש היא עצירה שאחריה התחלה, ושלב העצירה יכול לכתוב את מצב הריצה הנוכחי על הקובץ שערכתם זה עתה. ההגדרה שאחראית לכך נמצאת באותו קובץ שערכתם, וזה מה שהופך את הלולאה לכל כך מבלבלת בפעם הראשונה שנתקלים בה.

שני מצבים, קובץ אחד ושמירה בזמן כיבוי

מצב הריצה של WireGuard וקובץ תצורה של wg-quick קשורים אך שונים. הקובץ הוא קלט: wg-quick קורא אותו, יוצר את הממשק, מגדיר כתובות ומסלולים ומגדיר peers. התקן הקרנל הוא האובייקט החי, ושינויים ברמה נמוכה שנעשים עם wg לעולם לא כותבים את עצמם חזרה.

למעט בכיוון אחד. כשמופיע SaveConfig = true בקטע הממשק, wg-quick שומר את התצורה החיה לקובץ כחלק מהורדת הממשק. המדריך של wg-quick מזהיר בדיוק מפני זה: שינויים שנעשים בקובץ כשהממשק פעיל עלולים להידרס כשהוא מוסר. זו שמירה בזמן כיבוי, לא טיימר רקע, ולכן היא פועלת רק כשמשהו עוצר את הממשק.

ActionWhat it writesWhen it surprises you
wg set on a live interfaceKernel state onlyAfter reboot, when the file was never updated
wg-quick down with SaveConfigLive state into the fileRight after you edited the file
wg syncconfKernel state onlyNever; it does not touch the file
wg-quick upKernel state from the fileIf the file is stale, you get the old tunnel

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

עצרו קודם, ערכו שני, הפעילו אחרון

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

sudo cp -a /etc/wireguard/wg0.conf /root/wg0.conf.$(date +%F-%H%M)
sudo wg-quick down wg0
ls /sys/class/net/wg0 2>/dev/null || echo "interface is gone"
sudoedit /etc/wireguard/wg0.conf
sudo wg-quick up wg0

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

הגדרת SaveConfig = false לפני הורדה רגילה היא הדרך המקובלת האחרת, והיא חייבת להיעשות בקובץ ש-wg-quick באמת קורא. היא מונעת את השמירה האוטומטית האחת הזו. היא לא גורמת לפרופיל נפרד של NetworkManager, לייצוא של ראוטר או לנקודת כניסה של מכולה לטעון מחדש את העריכות שלכם, כי המנהלים האלה בכלל לא קוראים את הקובץ הזה.

החילו שינויי peers בלי לקרוע את הממשק

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

sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
sudo wg show wg0 peers
sudo wg show wg0 latest-handshakes

שלב strip חשוב. הוא מדפיס את הקובץ עם מפתחות השייכים רק ל-wg-quick מוסרים, כך שכתובות, DNS והוראות ניתוב לא נשלחות לכלי שלא מבין אותן. לאחר מכן הסנכרון מחיל peers ומפתחות על ההתקן החי בלי ליצור מחדש את הממשק, כך שסשנים ומסלולים קיימים שורדים.

היו מדויקים לגבי המגבלות. סנכרון peers לא משנה את כתובת הממשק, את המסלולים ש-wg-quick הוסיף או את תצורת הפותר, כי אף אחד מאלה לא שייך להתקן WireGuard. הוספת תת-רשת ל-AllowedIPs וציפייה שהקרנל ינתב אותה היא הקריאה השגויה הקלאסית; המסלול חייב להיווסף על ידי wg-quick בזמן ההעלאה או על ידכם.

בדקו מי הבעלים של הממשק לפני שתערכו משהו

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

systemctl status wg-quick@wg0 --no-pager
nmcli connection show | grep -i wireguard
sudo wg showconf wg0 | head -n 5

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

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

אמתו את ההפעלה מחדש הבאה, ואז שמרו שחזור

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

sudo systemctl restart wg-quick@wg0
sudo wg show wg0 latest-handshakes
sudo grep -c '^\[Peer\]' /etc/wireguard/wg0.conf

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

שמרו את הגיבוי מתחילת התהליך עד שתסיימו את ההפעלה מחדש הכפולה, ואז מחקו אותו או העבירו אותו מחוץ לתיקיית התצורה. wg0.conf.bak תועה ליד הקובץ האמיתי אינו מזיק ל-wg-quick ומבלבל את האדם הבא, שבסופו של דבר יערוך את הלא נכון.

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