การตั้งค่า 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 หรืออุปกรณ์ตัวที่สองจะรักษาการแยกไว้อย่างซื่อสัตย์ด้วยต้นทุนที่ต้องย้ายมากกว่าหนึ่งกระบวนการ

ShapeWhat starts the tunnelWhat enters itPick it when
Trigger plus routed splitProcess startOnly pushed or added prefixesThe app's endpoints are stable prefixes and the host should stay direct
Trigger plus default routeProcess startEverything, machine-wideYou need one exit for all traffic and accept the wider scope
Separate VM or deviceGuest boot or loginEverything inside that guestThe 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
  • ไม่มีทริกเกอร์ค้างเหลืออยู่หลังถอดโปรไฟล์

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