คุณมีบริการ VPN ที่บันทึกไว้ใน System Settings และต้องการให้เทอร์มินัลเริ่มบริการนั้น บน macOS เส้นทางที่รองรับคือ scutil --nc แต่ใช้ได้เฉพาะบริการที่ตัวจัดการการเชื่อมต่อเครือข่ายของระบบเองเป็นเจ้าของ แถบเมนูไม่ใช่ API ไคลเอนต์ของบุคคลที่สามมักมีระบบอัตโนมัติของตัวเอง และโปรไฟล์ที่ถูกส่งโดยบริการจัดการอาจปฏิเสธการเริ่มจากเครื่องนี้ รายการตรวจสอบที่ผมทำคือ หาบริการให้ตรง อ่านสถานะ เริ่มบริการ รอให้สถานะเปลี่ยน แล้วพิสูจน์ว่าทราฟฟิกใช้ทันเนลจริง หยุดที่ขั้นแรกที่ไม่ตรง เพราะทุกคำสั่งถัดไปถือว่าคำสั่งก่อนหน้าสำเร็จแล้ว

หาบริการก่อนพยายามเริ่มมัน

เริ่มจากรายการบริการ ไม่ใช่ชื่อโปรไฟล์ที่คุณจำได้

scutil --nc help
scutil --nc list

แต่ละบรรจบสถานะกับตัวระบุบริการ ชนิด และชื่อที่แสดง ตัวระบุคือค่าที่ใช้เขียนสคริปต์ เพราะชื่อที่แสดงซ้ำกันและแก้ไขได้ คู่มือ scutil ของ Apple อธิบายโหมดการเชื่อมต่อเครือข่าย ส่วน --nc help ที่ติดตั้งไว้คือรายการคำสั่งย่อยที่เชื่อถือได้บน Mac เครื่องนั้น อย่าสันนิษฐานว่าธงจากคู่มือเก่ายังมีอยู่ใน macOS เวอร์ชันของคุณ

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

อ่านสถานะปัจจุบันและยืนยันตัวเลือก

ถามสถานะของบริการก่อนเริ่ม เพื่อให้รู้ว่าการเริ่มที่สำเร็จควรเปลี่ยนอะไร

scutil --nc status "Office VPN"

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

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

เริ่มการเชื่อมต่อและรอให้สถานะเข้าที่

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

scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
  state=$(scutil --nc status "Office VPN" | head -n 1)
  [ "$state" = "Connected" ] && break
  [ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
  sleep 2
  n=$((n + 1))
done

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

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

พิสูจน์ว่าทันเนลขนส่งทราฟฟิก ไม่ใช่แค่บอกว่า Connected

Connected อธิบายการเชื่อมต่อ ไม่ใช่การตัดสินใจเรื่องเส้นทาง บริการ PPP และ IKEv2 ดั้งเดิมสร้างอินเทอร์เฟซ ppp หรือ utun และติดตั้งเส้นทาง ขณะที่ทันเนลแบบแยกจะปล่อยเส้นทางเริ่มต้นไว้โดยเจตนา ตรวจอินเทอร์เฟซและตระกูลที่อยู่ทั้งสองแบบ

ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns

หาอินเทอร์เฟซที่บริการสร้างขึ้นแทนการเดาหมายเลข แล้วถามตารางเส้นทางว่าปลายทางหนึ่งใช้อินเทอร์เฟซใด: route -n get 10.0.0.10 โดยแทนที่ด้วยโฮสต์ภายใน หากรายงานอินเทอร์เฟซกายภาพ ทันเนลเปิดอยู่แต่ไม่ได้ขนส่งกระแสดังกล่าว ตรวจเส้นทางของทันเนลแบบแยก ลำดับตัวแก้ไขชื่อ และกฎไฟร์วอลล์ภายในที่อนุญาตอินเทอร์เฟซทันเนลแต่ไม่อนุญาตโปรเซส

การแก้ไขชื่อเป็นผลลบเท็จตามปกติ ชื่อภายในอาจถูกแก้ไขผ่านตัวแก้ไขชื่อที่ผิดขณะที่ทันเนลสมบูรณ์ดี ซึ่งดูเหมือนความผิดพลาดของ VPN แต่ไม่ใช่ scutil --dns แสดงลำดับที่ macOS จะใช้ หลังเปลี่ยนตัวแก้ไขชื่อ ให้ล้างแคชด้วย dscacheutil -flushcache และ sudo killall -HUP mDNSResponder

เก็บข้อมูลรับรองและสิทธิ์ไว้นอกบรรทัดคำสั่ง

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

การรันคำสั่งด้วย sudo ไม่ได้ทำให้การเข้าสู่ระบบแบบโต้ตอบไร้ผู้ดูแล มันเปลี่ยนผู้ใช้ที่มีผล ไม่ใช่ความพร้อมของพรอมต์ GUI โทเคนฮาร์ดแวร์ หรือ keychain สำหรับเข้าสู่ระบบ LaunchAgent สามารถเริ่มบริการได้หลังจากผู้ใช้เข้าสู่ระบบและปลดล็อก keychain แล้ว ส่วน LaunchDaemon มักเข้าถึงส่วนเหล่านั้นของเซสชันผู้ใช้ไม่ได้ หากองค์กรจัดการบริการ กฎวงจรชีวิตขององค์กรย่อมเหนือกว่าสคริปต์ภายในใด ๆ

หยุดบริการและตรวจว่ามันหยุดอยู่จริง

หยุดด้วยตัวเลือกเดียวกับที่ใช้เริ่ม แล้วอ่านสถานะกลับมาแทนการสันนิษฐานว่าทันเนลหายไป

scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"

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

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

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