คำเตือนของ OpenVPN เรื่องสคริปต์ --up หลายตัว: มีเพียงตัวเดียวที่ทำงาน
การสลับลำดับสองบรรทัด up ไม่ทำให้ทั้งสองทำงาน OpenVPN เก็บคำสั่งเดียวต่อขั้นตอน ดังนั้นจงหาคำจำกัดความทั้งสองและให้งานมีจุดเริ่มต้นเดียว
คำเตือนเรื่องสคริปต์หลายตัวฟังดูเหมือนข้อร้องเรียนเรื่องการจัดลำดับ ดังนั้นวิธีแก้ที่เห็นได้ชัดคือสลับบรรทัดไปเรื่อย ๆ จนกว่ามันจะหายไป แต่มันไม่ใช่ข้อร้องเรียนเรื่องการจัดลำดับ คำจำกัดความ --up ที่มาทีหลังจะแทนที่คำสั่งที่ถูกเก็บไว้แล้วสำหรับขั้นตอนนั้น และตัวแยกวิเคราะห์ก็บอกเช่นนั้น ซึ่งหมายความว่าในสองสคริปต์ของคุณมีเพียงตัวเดียวเท่านั้นที่เคยทำงาน ส่วนอีกตัวไม่ได้ต่อคิวอยู่ข้างหลัง มันหายไปแล้ว
นั่นคือเหตุผลที่คำเตือนนี้ควรได้รับความสนใจแม้จะไม่ถึงตาย: สิ่งที่มันคาดการณ์คือการอัปเดต DNS หรือการเปลี่ยนเส้นทางที่หยุดเกิดขึ้นอย่างเงียบ ๆ
คำเตือนไม่ได้เกี่ยวกับลำดับ
OpenVPN เก็บคำสั่งสคริปต์ผู้ใช้เพียงคำสั่งเดียวสำหรับขั้นตอน up เมื่อตัวแยกวิเคราะห์พบคำจำกัดความอื่น จากโปรไฟล์ จากไฟล์ที่รวมไว้ หรือจากบรรทัดคำสั่ง มันจะแทนที่สิ่งที่เก็บไว้แล้วและออกคำเตือน ไม่มีอะไรถูกนำมาต่อกัน ไม่มีอะไรทำงานสองครั้ง และไม่มีคำถามเรื่องลำดับ คำสั่งที่อยู่รอดคือคำสั่งที่ตัวแยกวิเคราะห์เห็นเป็นครั้งสุดท้าย ดังนั้นการย้ายบรรทัดอาจเปลี่ยนผู้ชนะในขณะที่อีกสคริปต์ยังตายอยู่
รูปแบบเดียวกันใช้กับขั้นตอนสคริปต์อื่น ๆ: ขั้นละหนึ่งคำสั่ง ถ้าสองงานต้องเกิดขึ้นทั้งคู่ พวกมันต้องการจุดเริ่มต้นเดียว ไม่ใช่คำสั่งสองคำสั่งที่ดูเหมือนรายการ
หาคำจำกัดความทั้งสองในการเปิดใช้งานจริง
เริ่มจากสิ่งที่เดมอนได้รับจริง ไม่ใช่จากโปรไฟล์ที่คุณแก้ไข ps -ef และ ExecStart ของยูนิตแสดงบรรทัดคำสั่ง ซึ่งอาจมีการเพิ่ม --up จากจุดเริ่มต้นของคอนเทนเนอร์หรือตัวห่อ ไฟล์ init ของดิสทริบิวชันก็ทำแบบเดียวกันได้ systemctl cat openvpn-server@server เผยให้เห็นสิ่งที่บริการเองเพิ่มเข้ามา และ grep แบบเรียกซ้ำในไดเรกทอรีการกำหนดค่าจะพบคำจำกัดความระดับไฟล์ ข้อมูลซ้ำมักมาจากเลเยอร์ที่ต่างกัน และนั่นคือเหตุผลที่การแก้ไฟล์เดียวไม่เปลี่ยนอะไรเลย
การคัดลอกสคริปต์ไปยังไดเรกทอรีอื่นหรือเปลี่ยนชื่อก็ไม่ได้ลบคำสั่ง ตัวแยกวิเคราะห์นับคำจำกัดความ ไม่ใช่ไฟล์
ให้ hook ตัวเดียวเป็นเจ้าของงาน
วิธีแก้ที่ยั่งยืนคือตัวส่งเดียวที่รันทั้งสองการกระทำตามลำดับที่ตั้งใจไว้ สคริปต์ shell สั้น ๆ ที่มี set -eu ซึ่งเรียกการผสานที่จำเป็นแล้วจึงเรียกการกระทำในเครื่อง และส่งต่อ "$@" เพื่อให้ขอบเขตของอาร์กิวเมนต์คงอยู่ จะเก็บพฤติกรรมไว้ในที่เดียวที่ตรวจสอบได้ การส่งต่ออาร์กิวเมนต์เพียงแต่รักษามันไว้ ไม่ได้พิสูจน์ว่าตัวช่วยทั้งสองคาดหวังอินเทอร์เฟซเดียวกัน ดังนั้นจงอ่านสัญญาของแต่ละตัว ตัดสินใจว่าความล้มเหลวควรทำอะไร และการเปลี่ยนแปลงบางส่วนต้องย้อนกลับหรือไม่
ถ้าตัวเปิดใช้งานมี hook ส่วนขยายที่รองรับ ให้เลือกใช้มันมากกว่าการเชื่อมต่อที่ทำเอง อิมเมจคอนเทนเนอร์หรือแพ็กเกจของผู้ขายมักมีที่ที่เขียนไว้สำหรับงานเพิ่มเติม และการใช้มันป้องกันการอัปเกรดเขียนทับตัวส่งของคุณ
การล้างข้อมูลเป็นของขั้นตอน down ที่สอดคล้องกัน การกระทำ up ที่เขียน DNS ใหม่หรือเพิ่มเส้นทางต้องมีการย้อนกลับที่เขียนไว้ และ ตัวส่งที่จัดการเฉพาะการเริ่มต้นคือการออกแบบครึ่งเดียว
ยืนยันการผสาน ไม่ใช่แค่ความเงียบ
การลบคำเตือนซ้ำเป็นส่วนที่ง่าย การผสานยังต้องทำงาน ตรวจสอบสถานะของตัวแก้ไขหลังเชื่อมต่อด้วย resolvectl status หรือโดยการอ่าน /etc/resolv.conf และยืนยันเส้นทางด้วย ip route จากนั้นตัดการเชื่อมต่อและเชื่อมต่อใหม่ เพราะ hook ที่เชื่อมต่ออย่างเร่งรีบมักทิ้งบางอย่างจากเซสชันก่อนหน้า journalctl -u openvpn-server@server -b แสดงว่าตัวส่งของคุณทำงานหรือไม่และพิมพ์อะไรออกมา
เก็บสิทธิ์ของ hook ไว้ในที่ที่ควรอยู่ การเพิ่ม script-security หรือรันเดมอนด้วยสิทธิ์ที่มากกว่าไม่ใช่การแก้ไขสำหรับ hook ที่ถูกแทนที่ มันขยายสิ่งที่ทุกสคริปต์ในอนาคตทำได้ รวมถึงตัวที่ผู้โจมตีตั้งชื่อ
สัญญาณว่าการแก้ไขนั้นจริงไม่ใช่ความเงียบในบันทึก แต่เป็นคำตอบ DNS รายการเส้นทาง และการล้างข้อมูลที่ทั้งหมดทำงานถูกต้องหลังการเชื่อมต่อใหม่สองครั้ง