การคืนที่อยู่จากสคริปต์ client-connect ดูเหมือนควรจะตั้งค่า IP ของไคลเอนต์ แต่กลับไม่ใช่ ช่องทางเดียวของฮุกไปยังเซิร์ฟเวอร์คือไฟล์ชั่วคราวที่เส้นทางมาถึงเป็นอาร์กิวเมนต์สุดท้ายของสคริปต์ และที่อยู่ต้องเขียนลงไปที่นั่นด้วยไวยากรณ์ ifconfig-push สคริปต์ที่พิมพ์ที่อยู่หรือจบด้วยศูนย์โดยไม่เขียนอะไรเลยจะสร้างไคลเอนต์ที่เชื่อมต่อแล้วพร้อมที่อยู่จากพูล และบันทึกของเซิร์ฟเวอร์ดูสมบูรณ์ดี

ความสับสนนั้นสมเหตุสมผล เพราะฮุกอื่นหลายตัวตอบกลับผ่านรหัสออกหรือตัวแปรสภาพแวดล้อมจริง ๆ ฮุกนี้มีสัญญาของตัวเอง และสัญญาเริ่มต้นด้วยชื่อไฟล์

ฮุกเขียนไฟล์ ไม่ใช่ค่าที่ส่งคืน

การประกาศมีสองบรรทัด: script-security 2 เพื่ออนุญาตการเรียก จากนั้น client-connect /etc/openvpn/server/assign-address.sh เมื่อไคลเอนต์พิสูจน์ตัวตน เซิร์ฟเวอร์จะรันสคริปต์นั้นโดยเพิ่มเส้นทางไฟล์ที่สร้างขึ้นเป็นอาร์กิวเมนต์สุดท้าย ซึ่งจะเป็น $1 ก็ต่อเมื่อการประกาศไม่ส่งอาร์กิวเมนต์เพิ่มเติมของตัวเอง ทุกสิ่งที่จะนำไปใช้กับไคลเอนต์นั้นจะถูกเขียนลงในไฟล์นั้นเป็นคำสั่งธรรมดา บรรทัดละหนึ่งรายการ เหมือนกับที่จะปรากฏในคอนฟิกูเรชันทุกประการ รหัสห่อที่เพิ่มพารามิเตอร์ของตัวเองจะเลื่อนตำแหน่ง และอาการคลาสสิกคือสคริปต์ที่เขียนไปยังเส้นทางที่ดูเหมือน --verbose

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

คำสั่งสองอย่างควรค่าแก่ความสนใจเพราะมันมีปฏิสัมพันธ์กับทุกอย่างอื่น ifconfig-push กำหนดที่อยู่ ส่วน route ที่ส่งไปจะบอกไคลเอนต์ว่าอะไรเข้าถึงได้ผ่านอุโมงค์ คืนอันแรกแล้วลืมอันที่สองคุณจะได้ ไคลเอนต์ที่มีที่อยู่แต่ไม่มีที่ไป ลำดับภายในไฟล์ไม่สำคัญ แต่ความครบถ้วนสำคัญ ฮุกที่ส่งเส้นทางสำหรับคำนำหน้าที่ไม่มีเพื่อนใดเข้าถึงได้คือข้อผิดพลาดเดียวกันเมื่อมองจากอีกด้าน

อินพุตมาผ่านตัวแปรสภาพแวดล้อม: common_name, trusted_ip, ifconfig_pool_remote_ip และอื่น ๆ ปฏิบัติกับทั้งหมดเป็นสตริงจากภายนอกเซิร์ฟเวอร์ ไม่ใช่ชิ้นส่วนของเชลล์

การแมปที่อยู่เป็นนโยบาย ไม่ใช่เลขคณิต

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

ใครควบคุมชื่อก็ควบคุมที่อยู่ ดังนั้นตัดสินใจว่า common_name แทนอะไรจริง ๆ ในการติดตั้งนี้ เมื่อเปิด username-as-common-name ตัวตนคือการเข้าสู่ระบบไม่ใช่หัวเรื่องของใบรับรอง อย่าส่งค่านั้นไปยังการประเมินเชลล์ และอย่าให้ไคลเอนต์มีอิทธิพลต่อเส้นทางไฟล์

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

โทโพโลยีกำหนดว่า ifconfig-push หมายถึงอะไร

ด้วย topology subnet บน 10.77.0.0/24 ifconfig-push 10.77.0.20 255.255.255.0 คือที่อยู่บวกเน็ตมาสก์ของมัน ภายใต้ topology net30 อาร์กิวเมนต์ที่สองไม่ใช่มาสก์เลยแต่เป็นที่อยู่ของเพื่อน ดังนั้นการคัดลอกรูปแบบซับเน็ตไปยังเซิร์ฟเวอร์ net30 จะให้ไคลเอนต์ที่เชื่อมต่อได้แต่ส่งผ่านทราฟฟิกไม่ได้ เปลี่ยนโทโพโลยีอย่างตั้งใจ ไม่ใช่เพื่อให้ตัวอย่างดูสอดคล้อง เซิร์ฟเวอร์ที่รัน net30 อยู่แล้วมีไคลเอนต์ที่ใช้งานอยู่บนการกำหนดที่อยู่แบบเก่า ดังนั้นการสลับคือการย้ายระบบที่มีหน้าต่างบำรุงรักษา ไม่ใช่การแก้ไขบรรทัดเดียว

ที่อยู่แบบคงที่ต้องอยู่นอกพูลแบบไดนามิกและนอกการกำหนดแบบคงที่อื่นทั้งหมด รวมถึงที่แจกโดยไฟล์ client-config-dir ธรรมดา หากกลไกสองอย่างสามารถสร้างที่อยู่เดียวกันให้ไคลเอนต์ต่างกันได้ ในที่สุดหนึ่งในนั้นจะทำเช่นนั้น

ทดสอบสี่กรณีก่อนจะเชื่อถือ

รันการตรวจเดียวกันกับตัวตนที่แมปแล้ว ตัวตนที่ไม่ได้แมป การเชื่อมต่อใหม่ และความล้มเหลวของรีจิสทรีที่จำลองขึ้น openvpn --config client.ovpn --verb 4 แสดงที่อยู่ที่จัดสรรในการตอบกลับ push และบนเซิร์ฟเวอร์ grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log ยืนยันว่าสิ่งใดถูกส่งจริง สำหรับตัวตนที่ไม่ได้แมปผลลัพธ์ที่คาดหวังคือการเชื่อมต่อที่ถูกปฏิเสธ ไม่ใช่ที่อยู่จากพูล

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

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

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