การกำหนดที่อยู่ใหม่ใช้เวลาหนึ่งนาที สัปดาห์ถัดมาคือจุดที่การย้ายพัง และแทบไม่เคยเป็นจุดที่คอนโซลของผู้ให้บริการแนะนำ IP สาธารณะใหม่ถูกอ้างถึงในสี่ที่: ซ็อกเก็ตที่แดมอนฟังอยู่ สมอยึดความเชื่อถือที่ไคลเอนต์ตรวจสอบ ทุกกฎที่ระบุที่อยู่เก่า และ ระเบียน DNS ที่ผูกเข้าด้วยกัน การย้ายสองแบบดูเหมือนกันจากแผงควบคุมแต่ทำงานต่างกันโดยสิ้นเชิง: กำหนดที่อยู่ใหม่บนเครื่องที่คุณดูแล หรือตั้ง endpoint ที่สองและย้ายไคลเอนต์ไปที่นั่น การตรวจด้านล่างวางความล้มเหลวราคาถูกไว้ก่อน และแต่ละส่วนระบุว่าใช้กับการย้ายแบบใด

การสลับในที่และการตัด-over แบบขนานเป็นงานคนละอย่าง

การสลับในที่เก็บโฮสต์ กุญแจ ตารางเส้นทาง และรายชื่อผู้ใช้ไว้ มีเพียงที่อยู่ที่เปลี่ยน นั่นคือสิ่งที่การกำหนด IP ลอยใหม่ทำ และผู้ให้บริการหลายรายผู้เยี่ยมชมไม่รู้ตัวเลย เพราะการแปลเกิดขึ้นหน้าเพลตฟอร์ม การสร้างใหม่หรือการกำหนดใหม่โดยผู้ให้บริการนั้นหนักกว่า: ผู้เยี่ยมชมเห็นการเปลี่ยนแปลง และทุกอย่างที่แคชค่าเก่าไว้ก็รู้เรื่องในชั่วขณะเดียวกัน

endpoint แบบขนานคือโฮสต์ที่สองที่ทำงานเดียวกัน สร้างมัน ทดสอบด้วยโปรไฟล์เดียว และปล่อยให้ตัวเก่าตอบจนกว่าตัวใหม่จะพิสูจน์ตัวเองบนเส้นทางจริง ราคาคือสถานะ หากไม่มีรายการ peer การเพิกถอน และการบันทึกที่ใช้ร่วมกัน คุณมีสองเครือข่ายที่บังเอิญใช้ชื่อเดียวกัน

QuestionIn-place swapParallel endpoint
Rollback in one step?Only if you can get the old address backPoint DNS back; old host still up
Blast radiusEvery client at onceOnly the clients you moved
Best whenThe address is yours to reassignThe old address is gone for good

หาทุกที่ที่ที่อยู่เก่าถูกเขียนไว้

เริ่มด้วยการค้นข้อความ เพราะไฟล์คอนฟิกเป็นครึ่งที่ง่าย ค้นในคอนฟิกแดมอน ชิ้นส่วนไฟร์วอลล์ เป้าหมายการมอนิเตอร์ และบันเดิลไคลเอนต์ที่สร้างขึ้นบนดิสก์ รวมที่อยู่ IPv6 ด้วยหากคุณเผยแพร่ ที่ย้ายที่ตามเพียงระเบียน A จะทิ้งไคลเอนต์ดูอัลสแตกไว้บนเส้นทางเก่า

OLD=203.0.113.10
grep -RIn -- "$OLD" /etc /root
ss -lunpt | grep -F "$OLD"
nft list ruleset | grep -F "$OLD"
iptables-save | grep -F "$OLD"
wg show all endpoints

จากนั้นตรวจเคอร์เนล เพราะระบบที่ทำงานอยู่ถือที่อยู่ในที่ที่ไม่มีไฟล์ใดกล่าวถึง กฎ NAT ต้นทางแบบสถิต รายการ ipset ที่อยู่ bind และรายการ conntrack มีอายุยืนกว่าการแก้คอนฟิกที่ลบมันออก และบางรายการรอดการรีบูตเพราะกลับมาจากชุดกฎที่บันทึกไว้ ขึ้นไปอีกชั้น กลุ่มความปลอดภัยของผู้ให้บริการ เป้าหมายโหลดบาลานเซอร์ และการตรวจมอนิเตอร์ไม่ได้อยู่ในระบบไฟล์ของคุณเลย

เขียนบัญชีทรัพย์สินก่อนเปลี่ยนสิ่งใด เพราะยังใช้เป็นสคริปต์ย้อนกลับได้

ไคลเอนต์ที่ใช้ชื่อโฮสต์ฟื้นตัว ส่วนไคลเอนต์ที่ใช้ IP ตรงตัวเงียบไป

ถ้าไคลเอนต์เข้าถึงเซิร์ฟเวอร์ด้วยชื่อโฮสต์ การตัด-over เป็นปัญหาหลักของ DNS และ TTL ที่คุณตั้งไว้เมื่อวานเป็นตัวกำหนดว่าจะแย่แค่ไหน ตัวแก้ชื่อแคช ตัวแก้ชื่อ stub แคชอีกครั้ง และไคลเอนต์จำนวนมากค้นชื่อเฉพาะเมื่อเชื่อมต่อใหม่ อุโมงค์ที่สร้างไว้แล้วจึงคงที่อยู่เริ่มต้นไว้

ถ้า endpoint เป็นที่อยู่ตรงตัว ไม่มีอะไรแก้ใหม่และไม่มีอะไรบันทึกข้อร้องเรียน WireGuard เก็บที่อยู่ซ็อกเก็ตที่แก้แล้ว: Endpoint = vpn.example.net:51820 กลายเป็น IP ทันทีที่ wg-quick up ทำงาน และคงเป็น IP นั้นจนกว่าคุณจะเปลี่ยน OpenVPN ยืดหยุ่นกว่า: แก้ชื่อโฮสต์ remote ตอนเชื่อมต่อ และด้วย resolv-retry infinite จะลอง DNS อีกครั้งเมื่อเชื่อมต่อใหม่ เมื่อให้ IP ตรงตัว ทั้งคู่ยังคงหมุนหาเครื่องที่ไม่มีอยู่แล้ว

สิ่งที่หลอกคนคือภาพกระจก ไคลเอนต์ที่ชี้ไปที่อยู่ใหม่แล้วในขณะที่ผู้ฟังเก่ายังตอบอยู่ ผ่านทุกการทดสอบที่คุณทำจากโต๊ะของคุณเอง ผมก็เคยถูกหลอกด้วยสิ่งนี้: endpoint ใหม่ขึ้นบนโทรศัพท์ได้ในการลองครั้งแรก และไคลเอนต์ที่มีโปรไฟล์เก่าก็ปรากฏเมื่อปิดผู้ฟังเก่าไปนานมากแล้ว

ความเชื่อถือไม่ย้ายไปกับที่อยู่

WireGuard แยกอัตลักษณ์ออกจากการเข้าถึง ซึ่งทำให้การย้ายที่อยู่แทบไม่มีค่าใช้จ่าย peer ถูกระบุด้วยกุญแจสาธารณะ และ endpoint เป็นเพียงที่ที่แพ็กเก็ตไปตอนนี้ โฮสต์อัปเดต endpoint ของ peer จากที่อยู่ต้นทางของแพ็กเก็ตล่าสุดที่ตรวจสอบแล้ว peer ที่ไม่ได้ใช้งานยังต้องมีเหตุผลคุยกับที่ใหม่ และจะเรียนรู้ที่อยู่ก็ต่อเมื่อเซสชันแก่ลงและการลอง handshake ซ้ำล้มเหลวในที่ที่มองเห็นได้ คู่มือเริ่มต้นอย่างรวดเร็วของ WireGuard ครอบคลุมฟิลด์ endpoint

เซิร์ฟเวอร์ที่ใช้ TLS คือกรณีตรงข้าม ใบรับรองผูกกับชื่อ และไคลเอนต์ที่หมุนที่อยู่จะเทียบสิ่งที่หมุนกับชื่อทางเลือกของ subject เชื่อมต่อด้วย IP ไปยังใบรับรองที่มีเพียง DNS SAN และการตรวจสอบล้มเหลว: ชื่อที่ไคลเอนต์ใช้ไม่อยู่ในใบรับรอง การออกใหม่ด้วย IP SAN แก้การเชื่อมต่อนั้นและทำให้การย้ายครั้งถัดไปแย่ลง การเก็บชื่อโฮสต์ไว้ในโปรไฟล์และปล่อย verify-x509-name ไว้ที่เดิมทำให้การตรวจยังเข้มงวดในขณะที่ที่อยู่ข้างใต้เปลี่ยน

จากนั้นตรวจว่าแดมอนผูกกับอะไร ซ็อกเก็ตที่ปักไว้กับที่อยู่เก่าล้มเหลวอย่างเงียบ ๆ เซิร์ฟเวอร์ OpenVPN ที่เริ่มด้วย local 203.0.113.10 จะไม่ยอมขึ้นเมื่อที่อยู่นั้นหายไป ขณะที่ผู้ฟังบน 0.0.0.0 ตามการเปลี่ยนแปลงได้ฟรี NAT ก็แยกแบบเดียวกัน: MASQUERADE ตามที่อยู่ที่เครื่องมีตอนนี้ และ SNAT --to-source 203.0.113.10 แบบสถิตยังคงเขียนใหม่ไปยังที่อยู่ที่คุณไม่ได้เป็นเจ้าของแล้ว ปริมาณการรับส่งกลับจึงหายไป หากที่อยู่ใหม่มาพร้อมเกตเวย์ upstream ที่ต่างออกไป ตรวจ rp_filter: การกรองเส้นทางย้อนกลับทิ้งปริมาณการรับส่งกลับที่มาถึงอินเทอร์เฟซที่เคอร์เนลไม่ได้คาดไว้

ลำดับการตัด-over และหลักฐานว่ามันได้ผล

ลด TTL ล่วงหน้าหนึ่งวัน ตั้งผู้ฟังใหม่ และพิสูจน์ด้วยโปรไฟล์ที่มีเพียงคุณ การทดสอบจากภายในเครือข่ายเดียวกันแทบไม่พิสูจน์อะไรเลย จึงใช้โทรศัพท์บนเซลลูลาร์และทดสอบสิ่งที่อุโมงค์ควรลำเลียงแทนการ ping ไปที่ endpoint

เฝ้าดูทั้งสองที่อยู่ตลอดหน้าต่าง wg show all latest-handshakes บนโฮสต์ใหม่ หรือไฟล์สถานะของ OpenVPN บอกคุณว่ามีกี่ peer ที่ย้ายจริง เมื่อ endpoint ใหม่มี peer ที่คุณคาดหวังและตัวเก่าเหลือเพียงผู้ตามหลัง ให้ปลดระวางผู้ฟังเก่า ลบกฎ NAT ที่ล้าสมัย และถอดที่อยู่ออกจากไฟร์วอลล์ของผู้ให้บริการ การลบผู้ฟังเก่าคือขั้นตอนที่มักถูกข้าม และมันปิดช่องที่โปรไฟล์เก่ายังไปถึงเครือข่ายเก่า

กำหนดตัวกระตุ้นการย้อนกลับเป็นลายลักษณ์อักษรก่อนเริ่ม: หาก endpoint ใหม่ไม่มีการ handshake จากไคลเอนต์จริงแม้แต่ตัวเดียวหลังหน้าต่างที่ตกลง ให้คืนที่อยู่เก่าและหยุดแจกจ่ายโปรไฟล์ จากนั้นรันการค้นซ้ำและยืนยันว่ายังไม่มีผู้ฟังใดผูกกับที่อยู่ที่ปลดระวางแล้ว สองสิ่งจะส่งต่อไปยังการย้ายครั้งถัดไป: ชื่อโฮสต์ในโปรไฟล์ไคลเอนต์เพื่อให้การเปลี่ยนแปลงครั้งถัดไปเป็นการแก้ DNS และบัญชีทรัพย์สินที่เก็บไว้ข้างบันทึกการกู้คืนของเซิร์ฟเวอร์

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