# 問題背景
Windows 連上 L2TP VPN 後,預設會把所有流量導向 VPN 閘道,等同於把整台電腦的出口都換成 VPN。這在某些場景下不是你要的:
- 只需要存取 VPN 內部網段,其他流量維持原本網路
- VPN 頻寬有限,不想讓本地流量也塞進去
- 需要同時存取 VPN 內網與外部服務
解法是:關閉 VPN 的預設閘道選項,再手動設定路由表,讓指定的 IP 段走 VPN,其餘走本地網路。
# 步驟一:關閉 VPN 預設閘道
連線設定中,把「在遠端網路上使用預設閘道」取消勾選。
- 開啟「控制台」→「網路和共用中心」→「變更介面卡設定」
- 找到你的 L2TP VPN 連線,右鍵 →「內容」
- 選擇「網際網路通訊協定第 4 版 (TCP/IPv4)」→「內容」
- 點右下角「進階」
- 取消勾選「在遠端網路上使用預設閘道」
- 確認儲存
這樣連線後,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清空所有路由(謹慎使用)