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

สองความต้องการที่ซ่อนอยู่ในประโยคเดียว

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

ApproachSteers trafficRefuses direct egressKnows the app identity
Per-app VPN profileYes, for the apps it namesOnly if a filter or firewall also blocksYes, within its own rules
Application proxy settingPartly, for requests that honour itNoNo
Content filterNoYesYes, if the filter is written that way
Local PF rulesetNoYes, by address and portNot reliably

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

การนำทางอย่างเดียวทิ้งทางออกไว้

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

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

การปฏิเสธอย่างเดียวทำให้แอปพัง

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

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

การติดตั้งเป็นตัวตัดสินว่ากฎจะยังอยู่พรุ่งนี้หรือไม่

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

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

กรณีตอบรับที่ระบุชื่อแอป

เลือกการกระทำเดียวที่แอปพลิเคชันทำเอง บันทึกที่อยู่ที่มันควรไปถึงและที่อยู่นั้นเป็น IPv4 หรือ IPv6 แล้วทำการกระทำเดิมซ้ำในสถานะอนุมัติที่ไม่มีอุโมงค์ การรันครั้งที่สองต้องสร้างการปฏิเสธที่ประกาศไว้ ไม่ใช่การลองใหม่ตรง ๆ อย่างเงียบ ๆ นั่นคือครึ่งที่คนปล่อยไว้ไม่ระบุ และเป็นครึ่งเดียวที่พิสูจน์ว่าการปฏิเสธมีอยู่จริง รันมันก่อนเมื่อมีอุโมงค์ เพื่อให้ความแตกต่างระหว่างสองผลลัพธ์มาจากอุโมงค์ที่หายไปเท่านั้น

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

ปิดท้ายด้วยการเขียนสี่รายการ แอปประกอบด้วยองค์ประกอบใด ใครถือการนำทาง ใครถือการปฏิเสธ และสถานะที่กฎยังต้องใช้บังคับ ที่เก็บโค้ดสาธารณะเป็นเกณฑ์การเลือกได้หนึ่งข้อ แต่ไม่ใช่หนึ่งในสี่ข้อนั้น และรายการเหล่านั้นเป็นตัวตัดสินว่าเครื่องมือที่กำหนดตรงตามความต้องการด้านเครือข่ายหรือไม่

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