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

นี่คือการเปลี่ยนแปลงบนบริการที่กำลังทำงาน จึงควรถือเป็นงานปฏิบัติการ คือทำบัญชีก่อน นำไปใช้ผ่านวงจรชีวิตปกติ ตรวจสอบด้วยไคลเอนต์ใหม่ และเตรียมการย้อนกลับไว้

เริ่มจากซับเน็ตที่คุณมีอยู่แล้ว

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

grep -nE '^(topology|server|ifconfig-pool|max-clients|client-config-dir)' /etc/openvpn/server/lab.conf
ip -4 addr show tun0

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

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

เพิ่ม nopool และประกาศช่วง

คีย์เวิร์ดตัวช่วยยอมรับ nopool ซึ่งเก็บการกำหนดค่าซับเน็ตไว้และปิดพูลไดนามิกอัตโนมัติ ตามที่ คู่มือ OpenVPN 2.6 อธิบาย จากนั้นบรรทัด ifconfig-pool ที่ชัดเจนจะให้ช่วงแบบรวมปลายที่คุณต้องการ และเน็ตมาสก์ของมันตรงกับซับเน็ต ทั้งสองบรรทัดอยู่ในบล็อกเซิร์ฟเวอร์เดียวกัน เพราะพูลที่ไม่มีซับเน็ตของมันไม่มีความหมาย ลำดับระหว่างสองบรรทัดสำคัญเพียงเพื่อการอ่าน เพราะตัวช่วยจะขยายคู่นี้เมื่อบริการเริ่มทำงาน

topology subnet
server 10.70.0.0 255.255.255.0 nopool
ifconfig-pool 10.70.0.50 10.70.0.120 255.255.255.0

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

ขนาดของช่วงและภาวะพร้อมกันเป็นข้อจำกัดที่แยกจากกัน หนึ่งร้อยแอดเดรสไม่ได้หมายถึงหนึ่งร้อยไคลเอนต์พร้อมกันหาก max-clients บอกเป็นอย่างอื่น และพูลที่ใหญ่กว่าขีดจำกัดภาวะพร้อมกันเป็นเรื่องปกติไม่ใช่การสิ้นเปลือง สิ่งสำคัญคือข้อจำกัดทั้งสองถูกเลือกอย่างตั้งใจ ไม่ใช่สืบทอดมาจากค่าเริ่มต้น

เก็บการกำหนดแบบตายตัวไว้นอกช่วงไดนามิก

ifconfig-push ที่เฉพาะเจาะจงไคลเอนต์เป็นกลไกที่ต่างจากการจัดสรรจากพูล และต้องใช้พารามิเตอร์ที่เหมาะกับโทโพโลยีที่ใช้งาน ในโหมดซับเน็ตมันคือแอดเดรสเดียวและเน็ตมาสก์ การยกคู่ net30 มาใช้เพราะมันปรากฏในตัวอย่างเก่าเป็นข้อผิดพลาดที่พบบ่อย

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

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

นำไปใช้ผ่านวงจรชีวิตแล้วตรวจสอบ

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

systemctl restart openvpn-server@lab
journalctl -u openvpn-server@lab -n 30 --no-pager
# on a fresh client
ip -4 addr show tun0

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

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

การย้อนกลับการเปลี่ยนแปลงช่วง

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

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

การเปลี่ยนแปลงพูลเสร็จสิ้นเมื่อไคลเอนต์ใหม่ได้รับแอดเดรสในช่วง ไม่มีการแจกแอดเดรสที่สงวนไว้เลย และเส้นทางกับกฎที่ใช้แอดเดรสเหล่านั้นยังทำงานตามที่ตั้งใจ สิ่งใดที่น้อยกว่านั้นย่อมปล่อยให้คนถัดไปต้องค้นหาว่าข้อใดในสามข้อไม่เป็นความจริง

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