如何让Azure Point-to-Site VPN一直在线

上篇文章中说到如何一步一步的去搭建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不稳定的弊端,但是对于一些敏捷的应用环境比如数据传输,并不建议使用该方式。

本文出自 “挥墨的书童” 博客,转载请与作者联系!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。