สิ่งที่ persist-tun และ persist-key รอดชีวิตจริงใน OpenVPN
ทั้งสองตัวเลือกครอบคลุมการรีสตาร์ทแบบนุ่มนวลภายในโปรเซสที่ยังมีชีวิต พวกมันไม่คงอินเทอร์เฟซไว้หลังหยุด และไม่ใช่นโยบายบล็อกทราฟฟิก
การหยุดบริการจะลบอินเทอร์เฟซแม้จะตั้งค่า persist-tun ไว้ นี่คือตัวเลือกที่ทำงานตามเอกสาร ไม่ใช่ความล้มเหลว ตัวเลือกนี้อธิบายเส้นทางการรีสตาร์ทหนึ่งเส้นทางภายในโปรเซสที่กำลังทำงาน และ systemctl stop ไม่ใช่เส้นทางนั้น
อ่านชื่อทั้งสองพร้อมกันแล้วการออกแบบจะชัดเจน ตัวหนึ่งเก็บ descriptor อีกตัวเก็บวัสดุกุญแจ และทั้งสองมีอยู่เพราะสิ่งที่เกิดขึ้นหลังจากปล่อยสิทธิ์
ทรัพยากรทั้งสองและการรีเซ็ตที่พวกมันเป็นส่วนหนึ่ง
OpenVPN ส่งสัญญาณการรีสตาร์ทของตัวเองในสองสถานการณ์ปกติ SIGUSR1 แบบชัดเจนทำเช่นนั้น และ ping-restart ที่เกิดจาก peer ที่ตายแล้วก็ทำเช่นเดียวกัน ทั้งสองทำให้โปรเซสยังมีชีวิตและรันการตั้งค่าการเชื่อมต่อใหม่ และนั่นคือที่ที่ตัวเลือกเหล่านี้ได้ที่ของมัน
| Event | TUN/TAP device | Key and auth files | Addresses and routes | up/down hooks |
|---|---|---|---|---|
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itself | survives only with persist-tun | survive only with persist-key | survive with the device, otherwise rebuilt | run again only when restart hooks are enabled |
Configuration reload, SIGHUP | recreated | re-read from disk | rebuilt once the device returns | run again |
| Service stop | lost | re-read at the next start | removed | run at the next start |
มีเพียงแถวของการรีสตาร์ทแบบนุ่มนวลเท่านั้นที่ตัวเลือกทั้งสองนี้เปลี่ยน และงานที่พวกมันข้ามไปคือส่วนที่แพงบนลิงก์ที่ยุ่ง การเปิดอุปกรณ์อีกครั้งจะรื้อที่อยู่และเส้นทางที่ผูกอยู่กับมัน และการสร้างใหม่สามารถทำแพ็กเก็ตที่อยู่ระหว่างทางหายได้เมื่อการรีสตาร์ทเริ่ม การหยุดจะทำลายวัตถุเดียวกันโดยไม่มีตัวเลือกใด ๆ ที่จะรักษาไว้
ทำไมตัวเลือกเหล่านี้จึงมีอยู่เลย
เซิร์ฟเวอร์ OpenVPN ที่เสริมความแข็งแรงมักเริ่มเป็น root เปิดคีย์และอุปกรณ์ของมัน แล้วจึงลดลงไปยังผู้ใช้ที่ไม่มีสิทธิ์ หลังจากการลดลงนั้น การดำเนินการบางอย่างก็หายไปเลย การอ่านไฟล์คีย์โหมด 0600 การสร้างอินเทอร์เฟซเครือข่าย หรือการเปลี่ยนเส้นทางสามารถถูกปฏิเสธได้ทั้งหมด
หากไม่มีตัวเลือก persist peer ที่เงียบนานพอที่จะกระตุ้น ping-restart จะบังคับการดำเนินการเหล่านั้นพอดี การเชื่อมต่อใหม่จะล้มเหลวแม้ไม่มีอะไรเปลี่ยนในคอนฟิกูเรชัน โปรเซสจะดูเหมือนตายโดยไม่มีเหตุผล และล็อกจะแสดงข้อผิดพลาดสิทธิ์แทนข้อผิดพลาดเครือข่าย
ด้วยตัวเลือกเหล่านี้ การรีสตาร์ทแบบนุ่มนวลใช้สิ่งที่เฟสที่มีสิทธิ์ได้มาแล้วซ้ำ ไม่มีเวทมนตร์และโปรเซสไม่ได้รอดชีวิตจากสิ่งใด การได้มาซึ่งทรัพยากรเพียงแต่ถูกเลื่อนออกไป
อ่านข้อผิดพลาดแรก ไม่ใช่ข้อสุดท้าย
เมื่อการรีสตาร์ทล้มเหลว ให้อ่านข้อผิดพลาดแรกแทนข้อสุดท้าย คีย์ที่ได้รับการป้องกัน ไฟล์ auth ioctl ของอินเทอร์เฟซ และฮุกภายนอกเป็นทรัพยากรที่แตกต่างกันสี่อย่าง การเก็บไว้หนึ่งอย่างไม่ได้บอกอะไรเกี่ยวกับการเข้าถึงอย่างอื่น ฮุกที่เรียกเครื่องมือไฟร์วอลล์ยังคงต้องการสิทธิ์ที่เครื่องมือนั้นเรียกร้อง
ฮุกมีสวิตช์ของตัวเอง คู่มือ OpenVPN จับคู่ตัวเลือก persist กับ up-restart ซึ่งตัดสินว่าสคริปต์ up และ down จะรันอีกครั้งหลังรีสตาร์ทหรือไม่ อินเทอร์เฟซที่ยังขึ้นอยู่จึงไม่ได้บอกอะไรเกี่ยวกับว่าการผสานรวม resolver ของคุณได้รับการรีเฟรชหรือไม่
# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'
# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0
คำสั่งทั้งสองนี้แยกโหมดความล้มเหลวสองโหมดภายในไม่กี่วินาที อินเทอร์เฟซที่มีอยู่แต่เส้นทางหายไปคือปัญหาฮุกหรือเส้นทาง อินเทอร์เฟซที่หายไปหมายความว่าโปรเซสจบลงจริง ๆ
อินเทอร์เฟซที่คงไว้ไม่ใช่ kill switch
หากข้อกำหนดคือทราฟฟิกต้องไม่ออกจากอุโมงค์เลย อุปกรณ์ที่คงไว้ไม่ได้ให้สิ่งนั้น เส้นทางสำหรับตระกูลที่อยู่อีกตระกูลหนึ่ง เส้นทางเริ่มต้นที่สอง และกรณีที่โปรเซสออกไปทั้งหมดยังคงอยู่นอกขอบเขตของตัวเลือก
จัดการข้อกำหนดทั้งสองแยกกัน การเก็บวัตถุอุโมงค์ไว้ระหว่างการเชื่อมต่อใหม่เป็นความสะดวกสำหรับเดมอน การบล็อกการออกเมื่ออุโมงค์ล่มเป็นนโยบายไฟร์วอลล์ที่มีกฎและแบบทดสอบของตัวเอง การหลอมรวมทั้งสองทำให้เกิดคอนฟิกูเรชันที่ดูป้องกันแต่ทำงานเหมือนการเชื่อมต่อใหม่แบบพยายามเต็มที่
ตั้งชื่อเหตุการณ์ก่อนวินิจฉัย การรีสตาร์ทแบบนุ่มนวล การพยายามเชื่อมต่อที่ล้มเหลว และการหยุดบริการเป็นสามเหตุการณ์ที่มีสามพฤติกรรม และมีเพียงเหตุการณ์แรกเท่านั้นที่ตัวเลือกเหล่านี้อธิบาย