iPhone อยู่ใน VPN หรือไม่? แอป iOS มองเห็นอะไรได้จริง
ไม่มีธง VPN เพียงตัวเดียวใน iOS SDK แอปทำได้เพียงสังเกตการกำหนดค่าของตัวเอง การแจ้งเตือนสถานะ และภาพรวมพร็อกซี่แบบจำกัดขอบเขตเท่านั้น
ถามแอป iOS ว่าโทรศัพท์อยู่ใน VPN หรือไม่ คำตอบที่ซื่อตรงคือมันไม่สามารถรู้ได้ในความหมายที่คุณคิด SDK ไม่มีธงสำหรับ «อุปกรณ์อยู่ในอุโมงค์» และอินเทอร์เฟซส่วนตัวที่อาจเข้าใกล้เรื่องนี้ได้ก็ปิดสำหรับแอปที่เผยแพร่ คุณสังเกตได้เพียงการกำหนดค่าของแอปเอง สถานะที่ผูกอยู่กับมัน และเบาะแสทางอ้อมหนึ่งหรือสองอย่างจากสแตกเครือข่าย แต่ละอย่างตอบคำถามคนละข้อ และการตรวจที่พังส่วนใหญ่มาจากการเอาอย่างใดอย่างหนึ่งเป็นคำตอบทั้งหมด
ตำนานของธง VPN เพียงตัวเดียว
ความเชื่อคือมีคุณสมบัติอยู่ที่ใดที่หนึ่งใน SDK ที่รายงานว่าอุปกรณ์อยู่ในอุโมงค์หรือไม่ เช่นเดียวกับที่ธงการเข้าถึงรายงานว่าโฮสต์ตอบหรือไม่ คุณสมบัติสาธารณะเช่นนั้นไม่มีอยู่จริง และแม้จะมี «มีอุโมงค์อยู่» กับ «ทราฟฟิกของฉันใช้มัน» ก็เป็นข้อกล่าวอ้างที่ต่างกัน และสำหรับแอปส่วนใหญ่มีเพียงข้อที่สองที่สำคัญ
ช่องว่างนี้เองคือเหตุผลที่ไลบรารีซึ่งโฆษณาตัวตรวจจับ VPN แบบบรรทัดเดียวมักอ่านสิ่งที่เปราะบาง เช่น ชื่ออินเทอร์เฟซหรือคีย์พร็อกซี่ แล้วนำเสนอเป็นคำตัดสิน
โหลดค่ากำหนดก่อนที่จะเชื่อ nil
อินสแตนซ์ของตัวจัดการที่ใช้ร่วมกันมีอยู่ทันทีที่คุณขอ แต่คุณสมบัติโปรโตคอลของมัน ยังคงเป็น nil จนกว่าคอลแบ็กการโหลดจะเสร็จ ดังนั้นโปรโตคอล nil จึงหมายถึง «ยังไม่ได้โหลด» อย่างน้อยบ่อยพอ ๆ กับ «ไม่ได้ติดตั้ง» ทำการอ่านภายในบล็อกเสร็จสิ้น แล้วจึงตัดสินใจ: ออบเจกต์โปรโตคอลที่มีอยู่พร้อมธงเปิดใช้งานที่เปิดอยู่ คือหน้าตาของ «ติดตั้งแล้ว»
สัญญาณที่สองอยู่บนออบเจกต์การเชื่อมต่อ: สถานะที่ไม่ถูกต้อง ซึ่งระบบรายงานเมื่อแอปนี้ไม่มีการกำหนดค่าที่ติดตั้งไว้ สถานะไม่ถูกต้องพร้อมกับโปรโตคอล nil หลังการโหลดที่เสร็จสมบูรณ์คือการไม่มีอยู่จริง ไม่ใช่การแข่งกับเวลา
การเปลี่ยนแปลงการเชื่อมต่อมาในรูปการแจ้งเตือน
ตัวจัดการที่ส่งให้ load และ save รายงานว่าเกิดอะไรขึ้นกับการกำหนดค่า ไม่ใช่ว่าอุโมงค์กำลังทำอะไร การรอให้ตัวใดตัวหนึ่งทำงานตอนเชื่อมต่อคือการแข่งที่ไม่มีวันจบ ควรเฝ้าดูการแจ้งเตือนการเปลี่ยนสถานะแทน และอ่านค่าปัจจุบันของออบเจกต์การเชื่อมต่อเมื่อมันมาถึง
เมื่อติดตั้งการกำหนดค่าแล้ว สถานะการเชื่อมต่อจะผ่านลำดับสั้น ๆ: ตัดการเชื่อมต่อ กำลังเชื่อมต่อ เชื่อมต่อแล้ว กำลังยืนยันซ้ำ กำลังตัดการเชื่อมต่อ «เชื่อมต่อแล้ว» อธิบายอุโมงค์ ไม่ใช่เซิร์ฟเวอร์ที่อยู่ข้างหลัง จึงไม่ใช่หลักฐานว่าทราฟฟิกไหล On-demand ยังสามารถยกอุโมงค์ขึ้นได้ขณะแอปถูกระงับ และการแจ้งเตือนจะมาถึงก่อนที่คุณจะมีอะไรให้อัปเดต
ภาพรวมพร็อกซี่แบบจำกัดขอบเขตเป็นเบาะแส ไม่ใช่คำตัดสิน
CFNetwork สามารถให้การตั้งค่าพร็อกซี่ปัจจุบันของระบบแก่แอปได้ และภายในผลลัพธ์นั้นมีพจนานุกรมแบบจำกัดขอบเขตที่ใช้ชื่ออินเทอร์เฟซเป็นคีย์ การเห็นชื่อที่ขึ้นต้นด้วย tun, utun, ppp, ipsec หรือ tap คือเบาะแสว่ามีอุโมงค์อยู่ มันยังคงเป็นภาพรวมของสิ่งที่แอปนี้มองเห็น ไม่ใช่ข้อความเกี่ยวกับว่าแพ็กเก็ตเดินทางไปที่ใด
ผู้ให้บริการไม่ลงรอยกันเรื่องการตั้งชื่อ การไม่มีคำนำหน้าจึงพิสูจน์อะไรไม่ได้ และอินเทอร์เฟซที่มีอยู่ก็อาจมีได้โดยไม่บรรทุกทราฟฟิก การเข้าถึงยังอ่อนกว่าอีก: คำขอที่สำเร็จไปยังที่อยู่ส่วนตัวแสดงว่าเส้นทางทำงานสำหรับคำขอนั้นในขณะนั้น ไม่ได้หมายความว่าติดตั้ง VPN ไว้
โปรแกรมจำลองยืม Mac และแอปอื่นยังคงมองไม่เห็น
โปรแกรมจำลองไม่มีสแตกเครือข่ายของตัวเอง ทุกการเชื่อมต่อที่มันทำคือของ Mac ดังนั้น VPN ที่ทำงานบน Mac โฮสต์จึงมีผลกับการจำลองแอปอยู่แล้ว และการตั้งค่าของโปรแกรมจำลองเองก็ไม่แสดงอะไร หากอุโมงค์ขึ้นหลังจากเริ่มโปรแกรมจำลอง การรีสตาร์ทมักเร็วกว่าการดีบักแอป โฮสต์บนพอร์ตที่ไม่ได้มาตรฐานต้องมีพอร์ตนั้นใน URL หรือมีการส่งต่อภายในเครื่องเช่น socat TCP-LISTEN:12345,fork TCP:host:12345
API สาธารณะจะไม่แจกแจงโปรไฟล์ VPN ที่เป็นของแอปอื่นหรือโปรไฟล์การกำหนดค่า สำหรับแอปที่รู้จักหนึ่งตัว การตรวจสอบสคีมา URL ผ่าน canOpenURL คือกลเม็ดที่พกพาได้ และตั้งแต่ iOS 9 สคีมาที่สอบถามต้องประกาศใน Info.plist ของคุณ หากละไว้ การเรียกจะคืนค่า false OpenVPN Connect ตอบสนองที่ openvpn:// ซึ่งทำให้มันเป็นตัวอย่างที่ดีและตัวตรวจจับทั่วไปที่แย่
รวมสามการสังเกตแล้วบอกว่ามันหมายความว่าอะไร
ในทางปฏิบัติ ให้วางซ้อนสามผลลัพธ์: การกำหนดค่าที่โหลดแล้วและเปิดใช้งาน สถานะการเชื่อมต่อที่ไม่ใช่สถานะไม่ถูกต้อง และคำขอไปยังที่อยู่ที่เข้าถึงได้เฉพาะผ่านอุโมงค์ แต่ละอย่างหลอกคนเดียว ส่วนเมื่ออยู่ด้วยกันมันบอกว่าแอปรู้ได้อะไร ไม่ใช่ผู้ใช้สมมติอะไร
เขียนผลลัพธ์เป็นสามบรรทัดในการวินิจฉัยของคุณ ไม่ใช่บูลีนเดียว เมื่อผู้ใช้บอกว่า VPN ปิดอยู่แต่แอปของคุณไม่เห็นด้วย สามบรรทัดนั้นแสดงว่าการสังเกตใดคลาดเคลื่อน และนั่นคือความต่างระหว่างตั๋วสนับสนุนที่คุณลงมือทำได้กับตั๋วที่จบด้วย «เครื่องผมใช้ได้»