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

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

อะไรดังขึ้น และมันนับอะไรอยู่

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

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

สามนาฬิกาเบื้องหลังข้อกำหนดเดียว

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

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

ผูกตัวจับเวลาไว้กับเซสชัน ไม่ใช่บัญชี

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

Evidence you can readWhat it establishesWhere it misleads
Connection state changes to activeA session started nowDoes not carry the gateway's own session identifier
Duration reported at disconnectTotal service time for that sessionArrives too late for any advance notice
Interim usage updateTime accounted up to that updateStaleness equals the update interval
Local timestamp taken at activationAge of your observationResets whenever the observer restarts

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

ทดสอบด้วยขีดจำกัดสั้น ๆ

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

# current connection state and profile identity
nmcli -f GENERAL.STATE,GENERAL.CONNECTION connection show work

# the notifier unit you wrote: does it restart the deadline or resume it?
journalctl --user -u vpn-timer.service --since "-5 min" -o cat

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

การพักเครื่อง การเชื่อมต่อใหม่ และการส่งที่ไม่ถึง

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

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

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