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

ทำไมไฟล์ที่แก้ไขจึงถูกสร้างใหม่

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

ดูว่าลำดับการบูตเขียนอะไรและเขียนเมื่อใด คำตอบเกือบทุกครั้งคือสคริปต์ในไดเรกทอรี init หรือ autorun ของเฟิร์มแวร์

แทรกคำสั่งตรงตำแหน่งที่สคริปต์สร้างไฟล์

อุปกรณ์ QTS สร้างการกำหนดค่าเซิร์ฟเวอร์ OpenVPN ใหม่ภายในสคริปต์ init ที่เริ่มเดมอน ดังนั้นการแก้ไขต้องเกิดขึ้นที่นั่น เพิ่มการต่อท้ายก่อนคำสั่งเริ่มระบบโดยตรงแทนการแก้ไขไฟล์ที่สร้างขึ้น

sed -i '/daemon_mgr/i echo client-config-dir clientconfig >>/etc/openvpn/server.conf' /etc/init.d/vpn_openvpn.sh
grep -c client-config-dir /etc/openvpn/server.conf

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

ซ่อมฟอร์มที่บันทึกคีย์แบบ escape ไว้

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

openssl dhparam -out dh2048.pem 2048
grep -n "BEGIN DH PARAMETERS" dh2048.pem

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

ตรวจสอบอีกครั้งหลังอัปเกรด

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

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

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