คุณเพิ่ม peer ลงใน /etc/wireguard/wg0.conf รัน systemctl restart wg-quick@wg0 แล้ว peer ก็หายไปจากไฟล์เมื่อคุณดูอีกครั้ง ไม่มีอะไรทำให้อะไรเสียหาย การรีสตาร์ทคือการหยุดตามด้วยการเริ่ม และขั้นตอนการหยุดอาจเขียนสถานะการทำงานปัจจุบันทับไฟล์ที่คุณเพิ่งแก้ไข การตั้งค่าที่รับผิดชอบอยู่ในไฟล์เดียวกับที่คุณแก้ไข และนั่นคือสิ่งที่ทำให้วงจรนี้น่าสับสนมากในครั้งแรกที่คุณเจอ

สองสถานะ ไฟล์เดียว และการบันทึกตอนปิด

สถานะการทำงานของ WireGuard กับไฟล์กำหนดค่าของ wg-quick เกี่ยวข้องกันแต่แตกต่างกัน ไฟล์คืออินพุต: wg-quick อ่านไฟล์ สร้างอินเทอร์เฟซ ตั้งค่าแอดเดรสและเส้นทาง และกำหนดค่า peer อุปกรณ์เคอร์เนลคือวัตถุที่มีชีวิต และการเปลี่ยนแปลงระดับต่ำที่ทำด้วย 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 แยก การส่งออกเราเตอร์ หรือจุดเริ่มต้นคอนเทนเนอร์โหลดการแก้ไขของคุณใหม่ เพราะตัวจัดการเหล่านั้นไม่อ่านไฟล์นี้เลย

ใช้การเปลี่ยนแปลง peer โดยไม่ฉีกอินเทอร์เฟซ

ไม่ใช่ทุกการแก้ไขต้องมีการหยุดให้บริการ การเปลี่ยนแปลงระดับ 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 และคำสั่งเส้นทางไม่ถูกส่งไปยังเครื่องมือที่ไม่เข้าใจสิ่งเหล่านั้น จากนั้นการซิงก์จะใช้ peer และกุญแจกับอุปกรณ์ที่มีชีวิตโดยไม่สร้างอินเทอร์เฟซใหม่ เซสชันและเส้นทางที่มีอยู่จึงอยู่รอด

จงแม่นยำเรื่องขีดจำกัด การซิงก์ peer ไม่เปลี่ยนแอดเดรสของอินเทอร์เฟซ เส้นทางที่ 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 และทำให้คนถัดไปสับสน ซึ่งสุดท้ายจะแก้ไขไฟล์ผิด

บทความที่เกี่ยวข้อง