ทริกเกอร์ VPN ต่อแอปบน Windows เทียบทันเนลแบบแยกส่วน: อะไรแยกได้จริง
โปรไฟล์ VPN ของ Windows ที่ทริกเกอร์ด้วยแอปเพียงเปิดทันเนลขึ้นมา ทันเนลแบบแยกส่วนที่มีเส้นทางเป็นตัวกำหนดว่าอะไรเข้าไปข้างใน และแต่ละแบบล้มเหลวต่างกันสำหรับแอปเดียว
การตั้งค่า Windows สองแบบดูเหมือนกันในหน้าตั้งค่าแต่ทำงานต่างกันโดยสิ้นเชิง แบบหนึ่งคือโปรไฟล์ VPN ที่คัดลอกมาพร้อมทริกเกอร์แอป ดังนั้นการเปิดไฟล์ที่รันได้หนึ่งไฟล์จะยกทันเนลขึ้น อีกแบบคือโปรไฟล์ทันเนลแบบแยกส่วนซึ่งรายการเส้นทางบังเอิญครอบคลุมสิ่งที่แอปนั้นสื่อสารด้วย แบบแรกตอบว่า ทันเนลมีอยู่เมื่อใด แบบที่สองตอบว่า แพ็กเก็ตใดเข้าไปข้างใน และมีเพียงแบบที่สองเท่านั้นที่ปล่อยให้ส่วนที่เหลือของเครื่องอยู่บนลิงก์กายภาพในขณะที่แอปยังเชื่อมต่ออยู่
ทริกเกอร์เป็นกฎวงจรชีวิต ไม่ใช่กฎการกำหนดเส้นทาง
Add-VpnConnectionTriggerApplication ผูกพาธไฟล์ที่รันได้เข้ากับชื่อโปรไฟล์ เมื่อกระบวนการนั้นเริ่ม ตัวจัดการการเชื่อมต่อการเข้าถึงระยะไกลจะหมุนสายโปรไฟล์ และ เมื่อเงื่อนไขทริกเกอร์สิ้นสุดลง การเชื่อมต่ออาจหลุดไม่มีอะไรในการแลกเปลี่ยนนั้นตรวจสอบซ็อกเก็ต คำสั่งนี้ต้องใช้เชลล์ที่ยกสิทธิ์ พาธเต็มของไบนารี และ -Force เมื่อคุณแทนที่รายการที่มีอยู่ ตรวจสอบว่าความสัมพันธ์ยังอยู่ด้วย Get-VpnConnectionTrigger แทนที่จะเชื่อพร้อมต์; เอกสารอ้างอิง Add-VpnConnectionTriggerApplication ของ Microsoft ได้รวบรวมพารามิเตอร์และตัวอย่างไว้
ข้อจำกัดสองข้ออธิบายรายงานที่ว่า “ทริกเกอร์ไม่ทำอะไรเลย” ได้เกือบทั้งหมด ทริกเกอร์ถูกสร้างขึ้นรอบโปรไฟล์สำหรับผู้ใช้ทั้งหมด ดังนั้นขอบเขตของโปรไฟล์คือสิ่งแรกที่ต้องทำให้ชัด และพาธของแอปต้องตรงกับไบนารีที่รันจริง ไม่ใช่ทางลัดหรือตัวเรียกใช้ที่สร้างกระบวนการที่สอง ข้อจำกัดอีกข้อเป็นโดยเจตนา: บนเครือข่ายที่ Windows จัดว่าเชื่อถือได้ ทริกเกอร์จะนิ่งอยู่ เพราะโปรไฟล์ถูกออกแบบมาให้ทำงานนอกออฟฟิศ
Add-VpnConnectionTriggerApplication -Name "APP_VPN" -ApplicationID "C:\Program Files\Vendor\app.exe" -Force
Get-VpnConnectionTrigger -Name "APP_VPN" | Format-List *
Get-VpnConnection -Name "APP_VPN" | Format-List Name,ConnectionStatus,SplitTunneling,AllUserConnection
ทันเนลแบบแยกส่วนกำหนดว่าอะไรข้ามทันเนล
เมื่อปิดทันเนลแบบแยกส่วน Windows จะติดตั้งเส้นทางเริ่มต้นแบบอิงคลาสที่มีเมตริกต่ำบนอินเทอร์เฟซ VPN ทุกซ็อกเก็ตทำตามเส้นทางนั้น รวมถึงเบราว์เซอร์และบริการอัปเดต ดังนั้นทริกเกอร์ในการตั้งค่านั้นจะย้ายทั้งเครื่องตราบเท่าที่โปรไฟล์ยังเชื่อมต่ออยู่ ทริกเกอร์ยังคงเป็นเพียงกฎวงจรชีวิต รัศมีผลกระทบมาจากเส้นทาง
เมื่อเปิดทันเนลแบบแยกส่วน โปรไฟล์จะพาเฉพาะคำนำหน้าที่เกตเวย์ดันมาหรือที่คุณเพิ่มบนอินเทอร์เฟซ VPN เท่านั้น ส่วนอื่นยังคงใช้เส้นทางเริ่มต้นกายภาพ นั่นคือรูปแบบที่คนมักหมายถึงเมื่อพูดว่า “แอปเดียวออกทางออกแยก” และเป็นการตัดสินใจเรื่องเส้นทางตั้งแต่ต้นจนจบ
Set-VpnConnection -Name "APP_VPN" -SplitTunneling $true
Get-VpnConnection -Name "APP_VPN" | Select-Object SplitTunneling
Get-NetRoute -InterfaceAlias "APP_VPN" | Sort-Object DestinationPrefix
จุดที่การแยกส่วนแบบมีเส้นทางหยุดแยกแอปของคุณ
ความล้มเหลวที่พบบ่อยคือปลายทางที่ไม่เคยปรากฏในรายการเส้นทางของทันเนล แอปที่ลงชื่อเข้าใช้กับที่อยู่หนึ่งแล้วสตรีมจาก CDN หรือแปลงปลายทางที่หมุนเวียนเป็นสิบ ๆ แบบ จะวางการเชื่อมต่อบางส่วนบนอินเทอร์เฟซ VPN และที่เหลือบน Wi-Fi IPv6 เป็นตารางแยก ดังนั้นโปรไฟล์ที่ดันเฉพาะคำนำหน้า IPv4 อาจดูถูกต้องในขณะที่ทราฟฟิก IPv6 ของแอปยังอยู่ภายในเครื่อง
ผลกระทบเล็กกว่าอีกสองข้อสำคัญพอ ๆ กัน การจับคู่คำนำหน้าที่ยาวที่สุดชนะ ดังนั้นเส้นทาง on-link ที่เฉพาะเจาะจงกว่า /32 ที่ดันมาเพื่อโฮสต์สำหรับการจัดการ หรือซับเน็ตของอะแดปเตอร์ตัวที่สอง อาจชนะทันเนลในที่อยู่ที่คุณสนใจพอดี การแปลงชื่อก็เกิดก่อนการกำหนดเส้นทางเช่นกัน เว้นแต่ DNS ของโปรไฟล์หรือกฎ NRPT จะครอบคลุมชื่อนั้น แอปอาจแปลงผ่านอะแดปเตอร์กายภาพแล้วหมุนสายไปยังที่อยู่ที่ไม่เคยอยู่ในคำนำหน้าที่ถูกส่งเข้าทันเนล
สามรูปแบบ และแต่ละแบบได้อะไร
ตารางคือส่วนที่ผมจะแปะไว้บนผนัง เพราะการตัดสินใจเป็นเรื่องรัศมีผลกระทบไม่ใช่คุณสมบัติ ถ้าปลายทางของแอปเป็นคำนำหน้าที่คงที่และคุณระบุได้ การแยกส่วนแบบมีเส้นทางจะให้การแยกด้วยรอยเท้าที่เล็กที่สุด ถ้าไม่ใช่ โปรไฟล์เส้นทางเริ่มต้นที่อยู่หลัง VM หรืออุปกรณ์ตัวที่สองจะรักษาการแยกไว้อย่างซื่อสัตย์ด้วยต้นทุนที่ต้องย้ายมากกว่าหนึ่งกระบวนการ
| Shape | What starts the tunnel | What enters it | Pick it when |
|---|---|---|---|
| Trigger plus routed split | Process start | Only pushed or added prefixes | The app's endpoints are stable prefixes and the host should stay direct |
| Trigger plus default route | Process start | Everything, machine-wide | You need one exit for all traffic and accept the wider scope |
| Separate VM or device | Guest boot or login | Everything inside that guest | The app's destinations rotate, or the host must keep its own public address |
สิ่งที่ไม่มีแบบใดให้คือการผูกระดับซ็อกเก็ตบนโฮสต์ ไคลเอนต์ VPN แบบคลาสสิกของ Windows ไม่มีกฎที่บอกว่ากระบวนการนี้ต้องใช้อะแดปเตอร์นั้น ทริกเกอร์และตัวกรองเส้นทางอยู่ในชั้นต่างกัน และชั้นที่เลือกอินเทอร์เฟซคือตารางเส้นทาง ถ้าคู่มือสัญญาว่าจะบังคับใช้ต่อแอปได้จากโปรไฟล์ที่คัดลอกมาเพียงอย่างเดียว ให้ถามว่าเส้นทางใดหรือตัวกรองใดกำลังทำงานนั้น
ตรวจสอบทั้งคู่ในรอบเดียว
ทดสอบวงจรชีวิตและการกำหนดเส้นทางแยกกันตามลำดับนั้น ปิดแอป ยืนยันว่าโปรไฟล์รายงาน Disconnected แล้วเปิดแอปและตรวจว่าสถานะเปลี่ยนไป เพิ่งจะถามได้ว่าปลายทางเฉพาะไปที่ไหนหลังทันเนลขึ้นแล้ว และควรใช้ที่อยู่ที่แอปหมุนสายจริงไม่ใช่การเดา
$app = Get-Process app | Select-Object -First 1
Get-VpnConnection -Name "APP_VPN" | Select-Object ConnectionStatus
Get-NetTCPConnection -OwningProcess $app.Id -State Established | Select-Object RemoteAddress,RemotePort
Find-NetRoute -RemoteIPAddress 203.0.113.10
Find-NetRoute จะบอกชื่ออินเทอร์เฟซและฮอปถัดไปที่จะพาปลายทางนั้น ถ้ามีนามแฝงกายภาพตรงนั้น แปลว่าทันเนลขึ้นแล้วแต่ไม่เกี่ยวข้องกับโฟลว์นั้น ให้ตรวจคำนำหน้าที่ดันมา แล้วเส้นทางที่เฉพาะเจาะจงกว่า แล้ว IPv6 ถ้าสถานะไม่เปลี่ยนเลย ทริกเกอร์ไม่ได้ทำงาน และพาธไฟล์ที่รันได้ ขอบเขตโปรไฟล์ กับบันทึกการทำงานของไคลเอนต์ VPN คือสามที่ที่ต้องดู
ถอนให้สะอาดเพื่อให้การทดสอบครั้งหน้าเป็นความจริง
ถอดตามลำดับย้อนกลับจากการสร้าง คือถอนทริกเกอร์แอปก่อน แล้วจึงถอดโปรไฟล์ การลบโปรไฟล์ในขณะที่ทริกเกอร์ยังอยู่จะทิ้งความสัมพันธ์ที่ค้างไว้ซึ่งทำให้ความพยายามครั้งถัดไปสับสน และ Remove-VpnConnection -Force ไม่ได้ล้างรายการสมุดโทรศัพท์ที่สร้างนอกคำสั่งเสมอไป
รายการต่อผู้ใช้อยู่ใน rasphone.pbk ของผู้ใช้ภายใต้โปรไฟล์ Roaming ส่วนรายการสำหรับผู้ใช้ทั้งหมดอยู่ภายใต้ ProgramData ตรวจที่เก็บที่ตรงกับขอบเขตโปรไฟล์ เชื่อมต่อโปรไฟล์ที่เก็บไว้ใหม่ และยืนยันว่าเส้นทางกับ DNS ยังทำงานถูกต้อง เพื่อให้การทดสอบภายหลังวัดการเปลี่ยนแปลงที่คุณทำ ไม่ใช่สถานะที่ค้างอยู่
- ทันเนลขึ้นเมื่อกระบวนการเริ่ม ไม่ใช่ตอนลงชื่อเข้าใช้
- มีเพียงคำนำหน้าที่ตั้งใจไว้เท่านั้นที่ปรากฏบนอินเทอร์เฟซ VPN
- ที่อยู่ระยะไกลจริงของแอปแปลงเป็นนามแฝง VPN
- ไม่มีทริกเกอร์ค้างเหลืออยู่หลังถอดโปรไฟล์