Kerio บน Linux: ให้ MAC ที่เซิร์ฟเวอร์คาดหวังแก่ kvnet
kvnet ถูกสร้างใหม่ทุกการเชื่อมต่อ การเปลี่ยนที่อยู่เพียงครั้งเดียวจึงหายไป อ่านค่าที่ไคลเอนต์บันทึกไว้และนำไปใช้จากฮุกหลังการเชื่อมต่อ
มีสามสิ่งต้องตรงกันก่อนที่อุโมงค์ Kerio จะรับส่งข้อมูลได้ คือที่อยู่บนอินเทอร์เฟซ kvnet ค่าที่ไคลเอนต์บันทึกไว้ และสิ่งที่เซิร์ฟเวอร์หรือ DHCP คาดหวัง เมื่อทั้งสามไม่ตรงกัน อุโมงค์ยังคงพิสูจน์ตัวตนและยังคงขึ้นได้ ซึ่งนั่นเองทำให้ความล้มเหลวสับสน การสร้างอินเทอร์เฟซใหม่ทุกการเชื่อมต่อหมายความว่าที่อยู่ที่ตั้งด้วยมือเป็นของเซสชันนั้นเท่านั้น นี่คือรูปร่างของปัญหา และวิธีแก้คือฮุกไม่ใช่ไฟล์กำหนดค่า ส่วนที่เหลือคือจะอ่านค่าจากที่ใดและจะนำไปใช้ที่ใด
ทำไมที่อยู่จึงกลับไปทุกครั้ง
kvnet เป็นอะแดปเตอร์เสมือนที่ไคลเอนต์สร้างเมื่อเริ่มเชื่อมต่อและลบออกเมื่อสิ้นสุด ดังนั้น ip link set ที่ทำด้วยมือจะอยู่ได้นานเท่าเซสชันที่ใช้งานเท่านั้น และการเชื่อมต่อถัดไปจะเริ่มจากสิ่งที่ไคลเอนต์กำหนด บนเครื่องที่ไคลเอนต์ไม่สามารถใช้ที่อยู่ที่คาดหวังได้ การเชื่อมต่อใหม่ทุกครั้งจะนำความไม่ตรงกันเดิมกลับมาอีกครั้ง และกฎสัญญาเช่าหรือการเข้าถึงจะปฏิเสธอุปกรณ์อีกครั้ง
รูปแบบนี้เป็นการวินิจฉัยในตัวเอง อุโมงค์ที่ทำงานได้เซสชันหนึ่งแต่ล้มเหลวในเซสชันถัดไปไม่ใช่ปัญหาของข้อมูลรับรอง เพราะข้อมูลรับรองไม่เปลี่ยนระหว่างการเชื่อมต่อ
อ่านค่าจากไคลเอนต์ ไม่ใช่จากอินเทอร์เฟซ
ไคลเอนต์ Linux เขียนรายละเอียดการเจรจาลงบันทึกดีบัก และที่อยู่ที่ตั้งใจจะใช้ปรากฏที่นั่นเป็นโทเค็นรูปที่อยู่ตัวสุดท้ายในลำดับการเชื่อมต่อ เปรียบเทียบกับสิ่งที่เคอร์เนลถืออยู่จริง ซึ่งห่างออกไปหนึ่ง readlink: cat /sys/class/net/kvnet/address
ถ้าทั้งสองต่างกัน แสดงว่าไคลเอนต์รู้ค่าที่ถูกต้องแต่ใช้ไม่สำเร็จ และฮุกที่ใช้ค่านั้นหลังจากอินเทอร์เฟซมีอยู่จะปิดช่องว่างนี้ ถ้าบันทึกไม่มีที่อยู่เลย ปัญหาอยู่ก่อนหน้านั้นและเป็นของเวอร์ชันไคลเอนต์หรือโปรไฟล์เซิร์ฟเวอร์ ไม่ใช่ของสคริปต์
นำไปใช้หลังจากอินเทอร์เฟซมีอยู่
ผู้ใช้ NetworkManager สามารถวางสคริปต์ในไดเรกทอรีดิสแพตเชอร์และทำงานเฉพาะเมื่ออินเทอร์เฟซ VPN ขึ้น ส่วนไคลเอนต์ที่จัดการโดย systemd ต้องระวังมากกว่า เพราะ drop-in ที่รันตอนเริ่มบริการมักทำงานก่อนที่อะแดปเตอร์จะมีอยู่ ฮุกจึงต้องรออินเทอร์เฟซแทนที่จะถือว่ามีอยู่แล้ว ตั้งที่อยู่ตอนนั้น และถ้าเคอร์เนลปฏิเสธขณะลิงก์ขึ้นอยู่ ให้ลดลิงก์ลง ตั้งที่อยู่ แล้วยกขึ้นใหม่ อ่านโทเค็นที่แยกออกมาผ่านรูปแบบ MAC ก่อนส่งให้ ip link เพื่อไม่ให้บรรทัดบันทึกที่ไม่คาดคิดกลายเป็นอาร์กิวเมนต์
ทุกสิ่งที่รันเป็น root จากบันทึกของไคลเอนต์ สมควรได้ความเป็นเจ้าของที่แคบ คือไฟล์ที่เป็นของ root เขียนโดยผู้อื่นไม่ได้ และไม่มีการแทรกของเชลล์เกินกว่าที่อยู่ที่ตรวจสอบแล้ว เก็บการตรวจสอบรูปแบบไว้ในสคริปต์ อย่าให้เนื้อหาในบันทึกตัดสินว่าคำสั่งใดจะทำงาน
ตรวจสอบสัญญาเช่า ไม่ใช่ลิงก์
ip -4 -o addr show dev kvnet ควรแสดงที่อยู่ในช่วงที่คาดหวัง ip neigh show dev kvnet ควรแสดงเกตเวย์ และบริการหนึ่งหลังจาก VPN ควรตอบสนอง จากนั้นตัดการเชื่อมต่อและเชื่อมต่อใหม่หนึ่งครั้ง ถ้าที่อยู่กลับไป ฮุกกำลังทำงานผิดเหตุการณ์หรือไม่ทำงานเลย
อินเทอร์เฟซที่ปรากฏพร้อมที่อยู่ถูกต้องแต่ไม่เคยได้สัญญาเช่าชี้ไปที่ฝั่งเซิร์ฟเวอร์ นั่นคือการตรวจสอบอีกอย่างและมักเป็นทีมอื่น ยืนยันว่าบัญชีได้รับอนุญาตและพูลยังมีที่อยู่ก่อนแก้ไขฮุกอีกครั้ง
ทบทวนวิธีเลี่ยงหลังอัปเกรด
บิลด์ไคลเอนต์ที่ตั้งที่อยู่ถูกต้องจะทำให้ฮุกของคุณใช้ค่าเก่า ซึ่งเป็นข้อบกพร่องใหม่ที่การแก้ไขนำมา อย่าคัดลอก MAC จากเครื่องอื่นหรือโพสต์ฟอรัมเลย ใช้ค่าที่ไคลเอนต์นี้บันทึกสำหรับบัญชีนี้ และบันทึกวันที่คุณตรวจสอบ
เก็บสคริปต์ให้สั้นพอที่จะอ่านจบในครั้งเดียว วิธีเลี่ยงที่แยกวิเคราะห์บันทึกเป็นของชั่วคราวโดยธรรมชาติ สิ่งที่อยู่รอดคือสิ่งที่ผู้อ่านในอนาคตเข้าใจได้โดยไม่ต้องมีกระทู้ต้นฉบับ