VPN拨号后自动处理路由策略(For Windows)

经常使用各种不同的VPN,但一般客户端都需要根据不同的场景来选择配置不同的路由策略,很久之前写过一个批处理脚本(For Win)。今天突然要用,但是找不到了,所以只好重新再写一次,然后保存下来,希望下次会记得。

PS:Linux类系统下自然有更多优秀的解决方案,或者说第三方VPN插件自然也会很优雅的解决办法,自然不必纠结我这个批处理的脚本,只给有需要的人。

@echo off
Setlocal enabledelayedexpansion
rem 校内常见的私有地址,例如教务系统,OA办公系统等
set ip0=10.0.0.0/8;
set prefix=10.0.0.
rem =====================以上部分不要修改===========================================

rem 所有需要通过VPN访问的IP,用分号隔开。支持添加整个子网。最多添加到ip3,并且每个都要以分号结尾
set ip1=211.155.94.138;122.115.55.6;
set ip2=
set ip3=

rem 用户名user
set user=XXX

rem 密码pass
set pass=XXX

rem 新建vpn连接的名称,可以在"控制面板"的"网络连接"中看到
set vpn_name=gdst

rem =====================以下部分不要修改=================================
set ip4=172.16.0.0/16
set ipt="%ip0% %ip1% %ip2% %ip3% %ip4%"
set "ips=%ipt: =%"
set try=0
set mask=
set aip=
set ans=
set ip=

:dial
cls
echo 正在VPN连接...
rasdial %vpn_name% %user% %pass%
if errorlevel 1 (
set /a try+=1
echo 第%try%次拨号失败,5秒后重新尝试,按Ctrl+C终止
ping 1.1.1.1 -n 1 -w 5000 > nul
goto dial
) else (
echo 拨号成功.
)
rem VPN获取的IP地址应该是10.0.0开头的

for /f "tokens=1* delims=:" %%i in ('ipconfig /all^|find "%prefix%"') do (
if /i not "%%j" == "" (
set ip=%%j
goto ipout
)
)
:ipout
echo VPN的IP地址为:%ip%
echo 正在处理网络配置,如果失败,请修复本地连接后重新尝试。
rem 删除拨号成功后默认添加的路由
rem route delete 0.0.0.0 mask 0.0.0.0 %ip% METRIC 1 >NUL 2>NUL
call:clean
call:add_all %ips%
echo 网络配置完毕。

:menu
rem cls
rem echo 当前路由表为(仅供调试之用)
rem route print %prefix%
set /p user_input=输入1,将自动断开vpn,并恢复原来的网络配置。
if /i not "%user_input%"=="1" goto menu

rasdial %vpn_name% /DISCONNECT
call:clean
echo 操作完毕,请关闭此窗口。
pause
exit

:gmask
set /a nid=32
set /a q=4
set /a r=0
set aip=%~1
set "aip=%aip: =%"
if "!aip!" == "" goto:eof
for /f "delims=/, tokens=1,*" %%s in ("%~1") do (
if /i not "%%t"=="" (
set /a q="%%t/8"
set /a nid="%%t"
set aip=%%s
)
)

set /a r="%nid%-%q%*8"
if %nid% GEQ 32 (
set mask=255.255.255.255.
) else if %nid% LEQ 0 (
set mask=0.0.0.0.
) else (
set mask=
for /L %%i in (1,1,%q%) do (
set mask=!mask!255.
)
set /a next="%q%+1"
if %r% GTR 0 (
set /a smask=1"<<"%r% set /a smask=256-!smask! set mask=!mask!!smask!. ) for /L %%i in (!next!,1,4) do ( set mask=!%mask!0. ) ) set "mask=%mask:~0,-1%" goto:eof :add_all for /f "delims=;, tokens=1,*" %%i in ("%~1") do ( call:gmask "%%i" echo 正在处理 %%i !aip! !mask! %ip% if /i not "!aip!" == "" ( route add !aip! mask !mask! %ip% METRIC 1 >NUL 2>NUL
)
if /i not "%%j"=="" (
call:add_all "%%j"
)

)
goto:eof

:clean
for /f "tokens=1-4" %%i in ('route print ^| find "!ip!"') do (
route delete %%i mask %%j !ip! >NUL 2>NUL
)
goto:eof

执行后显示的日志信息如下:

正在VPN连接…
正在连接到 GDST…
正在验证用户名及密码…
正在网络上注册您的计算机…
已连接 GDST。
命令已完成。
拨号成功.
VPN的IP地址为: 10.0.0.4
正在处理网络配置,如果失败,请修复本地连接后重新尝试。
正在处理 10.0.0.0/8 10.0.0.0 255.0.0.0 10.0.0.4
正在处理 211.155.94.138 211.155.94.138 255.255.255.255 10.0.0.4
正在处理 122.115.55.6 122.115.55.6 255.255.255.255 10.0.0.4
正在处理 172.16.0.0/16 172.16.0.0 255.255.0.0 10.0.0.4
网络配置完毕。
输入1,将自动断开vpn,并恢复原来的网络配置。1
命令已完成。
操作完毕,请关闭此窗口。
请按任意键继续. . .

打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注