วิธีวัดเวลาทำงานของไคลเอนต์ OpenVPN ด้วยฮุก up และ down
OpenVPN ไม่มีตัวนับเวลาทำงาน เก็บตราประทับ epoch จากฮุก up ลบมันที่ down นำมาลบกัน และรักษาให้ซื่อตรงข้ามการรีสตาร์ตและหลายอินสแตนซ์
แดชบอร์ดถามหาตัวเลขว่าการเชื่อมต่อเปิดอยู่มานานเท่าไร และ OpenVPN ไม่ได้ให้ค่านั้น ไคลเอนต์รู้ว่าอุโมงค์ของตนขึ้นเมื่อไร แต่ก็ต่อเมื่อมีบางสิ่งบันทึกช่วงเวลานั้นไว้ก่อนที่สถานะเซสชันจะหายไป สถานที่ที่รองรับคือฮุก up และค่าที่ควรเก็บคือวินาที epoch ดิบไม่ใช่สตริงที่จัดรูปแบบแล้ว ทุกอย่างหลังจากนั้นคือเลขคณิต บวกกับกฎลำดับสองสามข้อที่ตัดสินว่าตัวเลขยังซื่อตรงหรือไม่
ยืนยันว่าฮุกทำงานจริง
พิสูจน์ว่าฮุกยิงก่อนที่จะออกแบบสิ่งใดรอบ ๆ มัน การกำหนดค่าไคลเอนต์ขั้นต่ำต้องใช้ script-security 2 และเส้นทางที่ชัดเจน up และ down; หากไม่มีบรรทัดความปลอดภัย OpenVPN จะปฏิเสธที่จะรันสคริปต์และบอกเช่นนั้นอย่างชัดเจน เพิ่ม up-restart และ down-pre ในเวลาเดียวกัน เพื่อให้เส้นทางการรีสตาร์ตและการรื้อถอนทำงานอย่างคาดเดาได้
ทำให้ฮุกเวอร์ชันแรกเพิ่มสภาพแวดล้อมของตนลงในไฟล์และไม่ทำอะไรอื่น สิ่งนี้บอกชื่อตัวแปรที่บิลด์ของคุณส่งออกจริง เช่น dev และ script_type แทนที่จะเป็นชื่อที่คุณจำได้จากเวอร์ชันอื่น รันการเชื่อมต่อหนึ่งครั้งและการตัดการเชื่อมต่อหนึ่งครั้ง แล้วอ่านไฟล์ หากไม่มีอะไรปรากฏ ให้หยุดตรงนี้ เพราะการออกแบบตราประทับเวลาบนฮุกที่ไม่เคยทำงานจะดูเหมือนความล้มเหลวในการเฝ้าระวังเป็นสัปดาห์
ตรวจสอบว่าฮุกรันในฐานะผู้ใช้ใด user และ group ถูกตั้งค่าไว้ OpenVPN จะสละสิทธิ์ก่อนรันสคริปต์ ดังนั้นไดเรกทอรีที่ root เขียนได้อาจถูกปิดสำหรับฮุก เลือกเส้นทางจากมุมมองของบริการไม่ใช่จากเชลล์ของคุณ
บันทึกค่า epoch หนึ่งค่าและลบมันอย่างตั้งใจ
ฮุก up ต้องการหนึ่งบรรทัด date +%s > /run/openvpn-client.started โดยปรับเส้นทางตามแต่ละอินสแตนซ์ ค่า epoch หลีกเลี่ยงคำถามเรื่องภาษา เขตเวลา และรูปแบบในภายหลัง และเป็นตัวเลขเดียวกันกับที่ตัวแทนเฝ้าระวังสามารถเทียบกับนาฬิกาของตนเองได้
การลบสำคัญพอ ๆ กับการเขียน ฮุก down ควรทำให้ไฟล์ว่างหรือลบไฟล์นั้น และ down-pre ทำให้สิ่งนั้นเกิดขึ้นก่อนที่อินเทอร์เฟซจะปิด ซึ่งขจัดหน้าต่างที่ไฟล์อธิบายอุโมงค์ที่จากไปแล้ว up-restart จากนั้นรีเฟรชตราประทับเมื่อรีสตาร์ตภายในแทนที่จะปล่อยค่าเดิมไว้ในที่ของมัน หากไม่มีคู่นั้น การรีสตาร์ตหลัง ping หมดเวลา จะให้ตัวเลขที่ยังคงไต่ขึ้นระหว่างที่อุโมงค์สร้างใหม่
เลือกตำแหน่งที่มีอายุการใช้งานเหมาะสม ไฟล์ใต้ /run หายไปเมื่อรีบูต ซึ่งตรงกับความเป็นจริง ขณะที่ไฟล์ใต้ /tmp อาจถูกทำความสะอาดอย่างคาดเดาไม่ได้ และไฟล์ในไดเรกทอรีการกำหนดค่าอยู่รอดในลักษณะที่ทำให้เข้าใจผิด ตั้งสิทธิ์ให้เฉพาะผู้ใช้บริการและผู้อ่านการเฝ้าระวังเท่านั้นที่อ่านได้
คำนวณเวลาทำงานโดยไม่เชื่อถือบรรทัดบันทึก
อ่านวินาทีที่เก็บไว้ อ่านวินาทีปัจจุบัน ลบกัน เมื่อไม่มีไฟล์หรือไฟล์ว่าง คำตอบที่ซื่อตรงคือไม่มีอุโมงค์ทำงานอยู่ ไม่ใช่ว่าเวลาทำงานเป็นศูนย์ เพราะสองสถานะนั้นควรสร้างการแจ้งเตือนที่ต่างกัน เก็บวินาทีดิบไว้ในเพย์โหลดการเฝ้าระวังและจัดรูปแบบวันและชั่วโมงในชั้นการแสดงผล ตัวจัดรูปแบบที่ปัดเศษภายในตัวส่งออกจะทิ้งความแม่นยำที่ใครบางคนจะต้องการระหว่างเหตุการณ์
การแยกวิเคราะห์ตราประทับเวลาของบันทึกเป็นทางลัดที่ชวนให้หลงไหล และมันล้มเหลวสามทาง รูปแบบเป็นไปตามตัวเลือกใดก็ตามที่ตั้งไว้ การหมุนเวียนลบประวัติ และการเชื่อมต่อใหม่ปรากฏเป็นเซสชันแยกแทนที่จะเป็นอุโมงค์ต่อเนื่องเดียว ฮุกบันทึกเหตุการณ์ครั้งเดียว ณ ช่วงเวลาที่มันเกิดขึ้น
เมื่อการตรวจทำงานบนโฮสต์อื่น ให้ส่งตราประทับเวลาแทนระยะเวลา เพื่อให้ผู้อ่านใช้นาฬิกาของตนเอง ผลลัพธ์เชิงลบเล็กน้อยจะถูกอ่านเป็นความคลาดเคลื่อนของนาฬิกาแทนที่จะเป็นฮุกที่เสีย
ครอบคลุมการเชื่อมต่อใหม่ การรีสตาร์ต และหลายอินสแตนซ์
อุโมงค์สองอุโมงค์บนโฮสต์เดียวต้องใช้สองไฟล์ โดยใช้ชื่ออินสแตนซ์ที่บริการใช้อยู่แล้วเป็นคีย์ เส้นทางที่ใช้ร่วมกันหมายความว่าการเชื่อมต่อล่าสุดเขียนทับเวลาเริ่มของทุกโปรไฟล์ และอาการคือตัวเลขที่กระโดดถอยหลังเมื่ออุโมงค์ที่สองเริ่ม
พฤติกรรมการเชื่อมต่อใหม่สมควรได้รับการทดสอบของตัวเอง เพราะที่นั่นคือที่ที่การออกแบบที่ดูสมเหตุสมผลรายงานสิ่งที่ผิดอย่างเงียบ ๆ บังคับให้รีสตาร์ตโดยทิ้งเพียร์หรือส่งสัญญาณไปยังโปรเซส แล้วเปรียบเทียบสถานะอินเทอร์เฟซกับไฟล์ ตราประทับเวลาควรเคลื่อนไปข้างหน้า ณ ช่วงเวลาที่อุโมงค์กลับมา
ฝั่งเซิร์ฟเวอร์ ไฟล์สถานะมีค่า connected-since ต่อไคลเอนต์ ซึ่งตอบคำถามอีกข้อหนึ่งว่าเซิร์ฟเวอร์เห็นเพียร์นั้นครั้งสุดท้ายเมื่อใด ใช้มันสำหรับการตรวจสอบไขว้ไม่ใช่แทนที่ เพราะมันหายไปพร้อมกับเซสชันที่มันอธิบาย การวัดทั้งสองไม่ได้บอกอะไรเกี่ยวกับสุขภาพของแอปพลิเคชันหลังอุโมงค์
รันการตรวจสามอย่างที่จับบั๊กด้านลำดับ
ทดสอบการเชื่อมต่อปกติ การเชื่อมต่อใหม่แบบบังคับ และการหยุดอย่างสะอาด โดยอ่านรายการอินเทอร์เฟซและไฟล์ร่วมกันหลังแต่ละครั้ง ตราประทับที่ยังอยู่หลังการหยุดอย่างสะอาด หรือไฟล์ที่อ้างว่ามีอุโมงค์ซึ่งไม่อยู่ในรายการอินเทอร์เฟซ ชี้ตรงไปที่ลำดับของฮุก รันการตรวจในฐานะผู้ใช้บริการและด้วยเส้นทางของบริการ เพราะเชลล์ของ root อาจเห็นไฟล์อื่นและให้คำตอบที่ผิดอย่างมั่นใจ จากนั้นปล่อยให้ตัวสำรวจที่ช้า ๆ อ่านไฟล์และยืนยันว่ามันไม่เคยเขียนลงไป
การสำรวจทุกหกสิบวินาทีครอบคลุมการแจ้งเตือน และไม่มีฮุกใดควรพึ่งพาว่าตัวสำรวจนั้นยังมีชีวิต แยกความรับผิดชอบสองอย่างนั้นออกจากกัน และตัวเลขจะยังเชื่อถือได้เมื่อฝ่ายใดฝ่ายหนึ่งถูกปรับใช้ใหม่