上篇文章中说到如何一步一步的去搭建P2S的VPN连接,但是我们在使用的时候会遇到一个问题,就是这种连接不是那么稳定,也是就是说经常断开连接,那这对于一个无人值守的环境中可以说是一个 大的问题。(在此多谢@gs_h兄弟提醒)
那如何能够让电脑在断开连接后自动连接呢?首先想到的最靠谱的方法就是执行某些脚本,我试图查找一些关于Azure VPN 客户端的一些命令代码,得到的只有这一个命令:
rasdial "VPN Name"
在客户端执行后,你会发现此命令不支持Azure的VPN,通过上一篇文章我们也了解到,P2S VPN是使用的Azure的VPN客户端,而不是windows系统自带的。所以我们要找到VPN客户端的连接信息,然后我们可以在系统中创建自定义VPN。
那接下来看看Azure的VPN是怎么样工作的?
当我们连接VPN的时候,会弹出VPN客户端,我们点击属性
点击查看日志
你会得到像这样的日志
****************************************************************** 操作系统: Windows NT 6.3 拨号程序版本: 7.2.9600.16384 连接名: demonet 所有用户/单一用户: 单一用户 起始日期/时间: 2015/5/23, 6:32:02 ****************************************************************** 模块名, 时间, 日志 ID, 日志项目名, 其他信息 对于连接类型, 0=拨号, 1=VPN, 2=拨号上的 VPN ****************************************************************** [cmdial32] 6:32:02 22 清除日志事件 [cmdial32] 6:32:06 04 预连接事件 连接类型 = 1 [cmdial32] 6:32:06 06 预隧道事件 用户名 = ClientCertificateName 域 = DUNSetting = bb2085f8-ce38-4f42-982b-aab7fb623cc9 Tunnel 设备名 = 隧道地址 = azuregateway-bb2085f8-ce38-4f42-982b-aab7fb623cc9-236d763b2d68.cloudapp.net [cmdial32] 6:32:09 07 连接事件 [cmdial32] 6:32:09 08 自定义操作 Dll 操作类型 = Connect Actions 描述 = to update your routing table 操作路径 = C:\Users\itadmin\AppData\Roaming\Microsoft\Network\Connections\Cm\BB2085F8-CE38-4F42-982B-AAB7FB623CC9\CMROUTE.DLL 返回值 = 0x0 [CMMON32] 6:32:15 23 外部断开 [cmdial32] 6:32:15 13 断开事件 呼叫进程 = C:\Windows\Explorer.EXE ****************************************************************** 操作系统: Windows NT 6.3 拨号程序版本: 7.2.9600.16384 连接名: demonet 所有用户/单一用户: 单一用户 起始日期/时间: 2015/5/23, 6:32:18 ****************************************************************** 模块名, 时间, 日志 ID, 日志项目名, 其他信息 对于连接类型, 0=拨号, 1=VPN, 2=拨号上的 VPN ****************************************************************** [cmdial32] 6:32:18 03 预初始化事件 呼叫进程 = C:\Windows\system32\rasautou.exe
这是我们注意有这么一个路径
打开改路径,你会发现VPN客户端的所有配置文件都在这里面
这里面有个拨号电话簿的PBX文件,是以Guid命名的。我们双击打开,然后点击属性。你会发现一个熟悉的界面-VPN属性界面。
接下来,我们就在系统中创建一个新的VPN连接,然后做如下配置。
复制上面地址,到Internet地址框中
选项框中,勾选如图所示的内容
配置如图所示的设置,选择客户端证书。
在网络中,取消勾选“在远程网络上使用默认网关”
做好以上配置后,我们再运行上面的命令
rasdial "Azure VPN"
到这里我们还需要注意一个问题,那就是本地计算机并没有到Azure 虚拟网络的路由地址,当发送到Azure 的路由信息不知道如何去走。
P2S VPN自带的客户端程序能根据Microsoft Azure端的配置信息自动更新路由表,以便客户机能自动连接到Microsoft Azure的虚拟网络。在%AppData%\Microsoft\Network\Connections\Cm\ {Guid} 下有一个routes.txt的文件,用来提供自动路由信息。
而手动构建的P2S VPN连接并不会替我们自动更新路由表,所以需要用以下的PowerShell脚本进行刷新。
############################################################# # Adds IP routes to Azure VPN through the Point-To-Site VPN ############################################################# # Define your Azure Subnets $ips = @("10.0.1.0", "10.0.2.0","10.0.3.0") 【此处可去掉:虚拟网络的子网,用逗号分开】 # Point-To-Site IP address range # should be the first 4 octets of the ip address ‘172.16.0.14‘ == ‘172.16.0. $azurePptpRange = "172.16.0." 注释:客户端连接VPN分配IP地址的子网 # Find the current new DHCP assigned IP address from Azure $azureIpAddress = ipconfig | findstr $azurePptpRange # If Azure hasn‘t given us one yet, exit and let u know if (!$azureIpAddress){ "You do not currently have an IP address in your Azure subnet." exit 1 } $azureIpAddress = $azureIpAddress.Split(": ") $azureIpAddress = $azureIpAddress[$azureIpAddress.Length-1] $azureIpAddress = $azureIpAddress.Trim() # Delete any previous configured routes for these ip ranges foreach($ip in $ips) { $routeExists = route print | findstr $ip if($routeExists) { "Deleting route to Azure: " + $ip route delete $ip } } # Add our new routes to Azure Virtual Network foreach($subnet in $ips) { "Adding route to Azure: " + $subnet echo "route add $ip MASK 255.255.255.0 $azureIpAddress" route add $subnet MASK 255.255.255.0 $azureIpAddress }
执行后使用route print 命令查看路由表就可查看路由信息是否增加上了,记得如果你在Azure中更新了路由信息,请在此脚本中手动更新,
然后运行以下命令,添加计划任务,确保每当VPN自动重拨成功时(20225事件),就会自动执行该脚本,刷新路由表。
schtasks /create /F /TN "VPN Connection Update" /TR "Powershell.exe -NonInteractive -command C:\UpdateRouteTableForAzureVPN.ps1" /SC ONEVENT /EC Application /MO "*[System[(Level=4 or Level=0) and (EventID=20225)]] and *[EventData[Data=‘Azure VPN‘]] "
最后写个BAT脚本
rasdial "Azure VPN" ipconfig /flushdns
把该脚本添加的任务序列中,设置成每5分钟执行一次。
这样一个自动拨号的VPN连接就完成了。这种方式可在一定程度上完善P2S VPN不稳定的弊端,但是对于一些敏捷的应用环境比如数据传输,并不建议使用该方式。