למה wg-quick כותב מחדש את wg0.conf כשאתם עוצרים את הממשק
SaveConfig הוא שמירה בזמן כיבוי, לא סנכרון ברקע. ערכו את הקובץ כשהמנהרה פעילה, והפעלה מחדש עשויה לכתוב את המצב הישן עליו.
אתם מוסיפים peer ל-/etc/wireguard/wg0.conf, מריצים systemctl restart wg-quick@wg0, וה-peer נעלם מהקובץ כשאתם מסתכלים שוב. שום דבר לא קלקל שום דבר. הפעלה מחדש היא עצירה שאחריה התחלה, ושלב העצירה יכול לכתוב את מצב הריצה הנוכחי על הקובץ שערכתם זה עתה. ההגדרה שאחראית לכך נמצאת באותו קובץ שערכתם, וזה מה שהופך את הלולאה לכל כך מבלבלת בפעם הראשונה שנתקלים בה.
שני מצבים, קובץ אחד ושמירה בזמן כיבוי
מצב הריצה של WireGuard וקובץ תצורה של wg-quick קשורים אך שונים. הקובץ הוא קלט: wg-quick קורא אותו, יוצר את הממשק, מגדיר כתובות ומסלולים ומגדיר peers. התקן הקרנל הוא האובייקט החי, ושינויים ברמה נמוכה שנעשים עם wg לעולם לא כותבים את עצמם חזרה.
למעט בכיוון אחד. כשמופיע SaveConfig = true בקטע הממשק, wg-quick שומר את התצורה החיה לקובץ כחלק מהורדת הממשק. המדריך של wg-quick מזהיר בדיוק מפני זה: שינויים שנעשים בקובץ כשהממשק פעיל עלולים להידרס כשהוא מוסר. זו שמירה בזמן כיבוי, לא טיימר רקע, ולכן היא פועלת רק כשמשהו עוצר את הממשק.
| Action | What it writes | When it surprises you |
|---|---|---|
wg set on a live interface | Kernel state only | After reboot, when the file was never updated |
wg-quick down with SaveConfig | Live state into the file | Right after you edited the file |
wg syncconf | Kernel state only | Never; it does not touch the file |
wg-quick up | Kernel state from the file | If 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 ומבלבל את האדם הבא, שבסופו של דבר יערוך את הלא נכון.