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

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

ฮุครัน แล้วไงต่อ?

#!/bin/sh
case "$1" in
  pre)
    vpn-client disconnect
    ;;
  post)
    vpn-client connect
    ;;
esac

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

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

Root สภาพแวดล้อมน้อยที่สุด ผู้ใช้ผิด

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

เขียนฮุคด้วยพาธแบบสัมบูรณ์ ให้ root เป็นเจ้าของและรันได้ และบันทึกว่ามันทำอะไร หากไม่มีบันทึกนั้น การสอบสวนครั้งต่อไปจะเริ่มจากศูนย์

การเชื่อมต่ออัตโนมัติไม่ใช่เส้นทางของ VPN

NetworkManager มีกลไกเปิดใช้งานสองแบบ คือแฟล็กเชื่อมต่ออัตโนมัติบนโปรไฟล์ และการเชื่อมต่อทุติยภูมิที่เริ่มเมื่อโปรไฟล์หลักถูกเปิดใช้งาน อุปกรณ์ชนิดเนทีฟใช้แบบแรก ปลั๊กอิน VPN ในอดีตใช้เพียงแบบที่สอง ดังนั้นการติ๊กเชื่อมต่ออัตโนมัติบนโปรไฟล์ OpenVPN อาจไม่มีผลเลย ตรวจสอบทั้งสองคุณสมบัติ แล้วแนบ VPN เป็นทุติยภูมิของโปรไฟล์ Wi-Fi หรือ Ethernet แทน

[Unit]
PartOf=NetworkManager.service
Requires=NetworkManager-wait-online.service
After=NetworkManager-wait-online.service

อินเทอร์เฟซ WireGuard ที่จัดการโดยยูนิต systemd ต้องใช้ไฟล์ drop-in นั้นแทนฮุค จัดลำดับหลังเครือข่ายออนไลน์

รอเครือข่าย โดยมีเพดาน

timer=1
while ! ping -c1 -n -w1 203.0.113.1 >/dev/null; do
  sleep 1; timer=$((timer+1))
  [ $timer -ge 300 ] && exit 0
done
nmcli connection up "work-vpn"

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

ป้องกันพายุรีสตาร์ตด้วย โดยนับความพยายามและหยุด ตัวเฝ้าดูที่ตอบสนองทุกการตรวจสอบที่ล้มเหลวจะเปลี่ยนความล้มเหลวหนึ่งครั้งให้เป็นลูป

ระงับระบบหนึ่งครั้ง แล้วอ่านบันทึกเพื่อดูเอาต์พุตของฮุคเอง นั่นคือการทดสอบเดียวที่พิสูจน์ลำดับ

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