การหยุดบริการจะลบอินเทอร์เฟซแม้จะตั้งค่า persist-tun ไว้ นี่คือตัวเลือกที่ทำงานตามเอกสาร ไม่ใช่ความล้มเหลว ตัวเลือกนี้อธิบายเส้นทางการรีสตาร์ทหนึ่งเส้นทางภายในโปรเซสที่กำลังทำงาน และ systemctl stop ไม่ใช่เส้นทางนั้น

อ่านชื่อทั้งสองพร้อมกันแล้วการออกแบบจะชัดเจน ตัวหนึ่งเก็บ descriptor อีกตัวเก็บวัสดุกุญแจ และทั้งสองมีอยู่เพราะสิ่งที่เกิดขึ้นหลังจากปล่อยสิทธิ์

ทรัพยากรทั้งสองและการรีเซ็ตที่พวกมันเป็นส่วนหนึ่ง

OpenVPN ส่งสัญญาณการรีสตาร์ทของตัวเองในสองสถานการณ์ปกติ SIGUSR1 แบบชัดเจนทำเช่นนั้น และ ping-restart ที่เกิดจาก peer ที่ตายแล้วก็ทำเช่นเดียวกัน ทั้งสองทำให้โปรเซสยังมีชีวิตและรันการตั้งค่าการเชื่อมต่อใหม่ และนั่นคือที่ที่ตัวเลือกเหล่านี้ได้ที่ของมัน

EventTUN/TAP deviceKey and auth filesAddresses and routesup/down hooks
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itselfsurvives only with persist-tunsurvive only with persist-keysurvive with the device, otherwise rebuiltrun again only when restart hooks are enabled
Configuration reload, SIGHUPrecreatedre-read from diskrebuilt once the device returnsrun again
Service stoplostre-read at the next startremovedrun 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

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

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

ตั้งชื่อเหตุการณ์ก่อนวินิจฉัย การรีสตาร์ทแบบนุ่มนวล การพยายามเชื่อมต่อที่ล้มเหลว และการหยุดบริการเป็นสามเหตุการณ์ที่มีสามพฤติกรรม และมีเพียงเหตุการณ์แรกเท่านั้นที่ตัวเลือกเหล่านี้อธิบาย

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