# 問題背景

Windows 連上 L2TP VPN 後,預設會把所有流量導向 VPN 閘道,等同於把整台電腦的出口都換成 VPN。這在某些場景下不是你要的:

  • 只需要存取 VPN 內部網段,其他流量維持原本網路
  • VPN 頻寬有限,不想讓本地流量也塞進去
  • 需要同時存取 VPN 內網與外部服務

解法是:關閉 VPN 的預設閘道選項,再手動設定路由表,讓指定的 IP 段走 VPN,其餘走本地網路。


# 步驟一:關閉 VPN 預設閘道

連線設定中,把「在遠端網路上使用預設閘道」取消勾選。

  1. 開啟「控制台」→「網路和共用中心」→「變更介面卡設定」
  2. 找到你的 L2TP VPN 連線,右鍵 →「內容」
  3. 選擇「網際網路通訊協定第 4 版 (TCP/IPv4)」→「內容」
  4. 點右下角「進階」
  5. 取消勾選「在遠端網路上使用預設閘道
  6. 確認儲存

這樣連線後,Windows 不會自動把預設路由改成 VPN,你的上網流量仍走本地網路。


# 步驟二:連線後取得 VPN 閘道 IP

先連上 VPN,然後用 route print 確認 VPN 介面的閘道位址:

route print

輸出中找到你的 VPN 介面(通常介面名稱會是 PPP adapter 或顯示 VPN 名稱),記下對應的 Gateway IP,例如 10.10.0.1

也可以用以下指令快速篩選:

ipconfig | findstr /i "PPP\|L2TP\|VPN\|閘道"

# 步驟三:新增路由規則

確認閘道 IP 後,用 route add 把需要走 VPN 的網段加入路由表。

格式:

route add <目標網段> mask <子網路遮罩> <VPN閘道IP>

範例:讓 10.0.0.0/8 走 VPN:

route add 10.0.0.0 mask 255.0.0.0 10.10.0.1

新增多筆:

route add 10.0.0.0 mask 255.0.0.0 10.10.0.1
route add 172.16.0.0 mask 255.240.0.0 10.10.0.1
route add 192.168.100.0 mask 255.255.255.0 10.10.0.1

預設加入的路由是暫時性的,重開機後消失。加上 -p 參數可讓路由持久保留(跨重開機),但 VPN 斷線再連後閘道 IP 可能會變,建議用腳本管理。


# 步驟四:驗證路由是否生效

新增後確認路由表:

route print 10.0.0.0

也可以 ping 一台 VPN 內部的主機,確認封包走正確路徑:

tracert 10.0.1.100

# 步驟五:用腳本自動化(可選)

VPN 每次重連後閘道 IP 可能不同,手動設定容易漏。可以寫一支 PowerShell 腳本,連線後自動抓閘道並設定路由。

建立 setup-vpn-route.ps1

# 取得 VPN 介面的閘道 IP(PPP 介面)
$gateway = (Get-NetIPConfiguration | Where-Object { $_.InterfaceAlias -match "VPN名稱" }).IPv4DefaultGateway.NextHop
if ($gateway) {
    Write-Host "VPN Gateway: $gateway"
    route add 10.0.0.0 mask 255.0.0.0 $gateway
    route add 172.16.0.0 mask 255.240.0.0 $gateway
    Write-Host "路由設定完成"
} else {
    Write-Host "找不到 VPN 閘道,請確認 VPN 已連線"
}

連上 VPN 後執行:

powershell -ExecutionPolicy Bypass -File setup-vpn-route.ps1

# 注意事項

  • 閘道 IP 因 VPN 伺服器而異,每次連線可能不同,建議先 route print 確認再設定
  • 取消預設閘道後,如果 VPN 內部的 DNS 需要解析,記得在 VPN 介面卡設定 DNS 伺服器
  • route add 沒加 -p 的路由,重開機後會消失,適合每次連線後透過腳本重設
  • 設定錯誤路由可能導致部分網路不通,可用 route delete 移除或 route -f 清空所有路由(謹慎使用)