wg-quick इंटरफ़ेस रोकने पर wg0.conf को फिर से क्यों लिखता है
SaveConfig बंद करते समय की सेव है, बैकग्राउंड सिंक नहीं। टनल चालू रहते हुए फ़ाइल संपादित करें, और पुनः आरंभ पुरानी स्थिति उसके ऊपर लिख सकता है।
आप /etc/wireguard/wg0.conf में एक पीयर जोड़ते हैं, systemctl restart wg-quick@wg0 चलाते हैं, और दोबारा देखने पर पीयर फ़ाइल से गायब है। किसी ने कुछ खराब नहीं किया। पुनः आरंभ करना रुकने के बाद शुरू होना है, और रुकने का चरण अभी-अभी संपादित की गई फ़ाइल पर मौजूदा रनटाइम स्थिति लिख सकता है। ज़िम्मेदार सेटिंग उसी फ़ाइल में रहती है जिसे आप संपादित कर रहे थे, और यही इस लूप को पहली बार सामना करने पर इतना उलझन भरा बनाता है।
दो स्थितियाँ, एक फ़ाइल और बंद करते समय सेव
WireGuard की रनटाइम स्थिति और wg-quick कॉन्फ़िगरेशन फ़ाइल संबंधित हैं पर अलग हैं। फ़ाइल इनपुट है: wg-quick उसे पढ़ता है, इंटरफ़ेस बनाता है, पते और रूट सेट करता है और पीयर कॉन्फ़िगर करता है। कर्नेल डिवाइस जीवित ऑब्जेक्ट है, और 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 प्रोफ़ाइल, राउटर निर्यात या कंटेनर प्रवेश-बिंदु को आपके संपादन दोबारा लोड करने पर मजबूर नहीं करता, क्योंकि वे प्रबंधक इस फ़ाइल को बिल्कुल नहीं पढ़ते।
इंटरफ़ेस फाड़े बिना पीयर बदलाव लागू करें
हर संपादन के लिए रुकावट ज़रूरी नहीं है। फ़ाइल को कॉन्फ़िगरेशन में बदलकर सिंक करके चल रहे इंटरफ़ेस पर पीयर-स्तरीय बदलाव लागू किए जा सकते हैं, जो नीचे उतारने का चरण पूरी तरह बचाता है और इसलिए सेव भी बचाता है:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
sudo wg show wg0 peers
sudo wg show wg0 latest-handshakes
strip चरण मायने रखता है। यह केवल wg-quick वाली कुंजियाँ हटाकर फ़ाइल छापता है, ताकि पते, DNS और रूटिंग निर्देश ऐसे उपकरण में न जाएँ जो उन्हें नहीं समझता। फिर सिंक इंटरफ़ेस को फिर से बनाए बिना पीयर और कुंजियाँ जीवित डिवाइस पर लागू करता है, इसलिए मौजूदा सत्र और रूट बने रहते हैं।
सीमाओं के बारे में सटीक रहें। पीयर सिंक करने से इंटरफ़ेस का पता, 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
तीसरा कमांड जीवित कॉन्फ़िगरेशन को फ़ाइल जैसे ही प्रारूप में छापता है, निजी कुंजी सहित, जो तुलना के लिए उपयोगी और टिकट में खतरनाक है। चिपकाने से पहले उसे अस्पष्ट करें; सहायता थ्रेड में निजी कुंजी स्थायी समझौता है, टाइपो नहीं।
अगर सेवा इकाई निष्क्रिय है पर इंटरफ़ेस मौजूद है, तो किसी और ने उसे बनाया है और फ़ाइल आधिकारिक नहीं है। वह एक अवलोकन ऐसी फ़ाइल को संपादित करने का एक घंटा बचाता है जिसे कोई नहीं पढ़ता।
अगले पुनः आरंभ को सत्यापित करें, फिर रोलबैक रखें
जो परीक्षण वास्तव में सुधार सिद्ध करता है वह दूसरा पुनः आरंभ है, क्योंकि पहली बार वही क्रम विफल हुआ था। पुष्टि करें कि पीयर उससे बचता है और जीवित कॉन्फ़िगरेशन अभी भी डिस्क पर मौजूद से मेल खाता है:
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 के लिए हानिरहित है और अगले व्यक्ति के लिए भ्रमित करने वाला है, जो अंततः गलत को संपादित करेगा।