前段时间帮朋友写一个vpn的客户端, 涉及到了L2TP方式的连接问题。

先看看普通的PPTP连接设置方法:

With re
  .dwSize = LenB(re)
  .dwCountryCode = 86
  .dwCountryID = 86
  .dwDialExtraPercent = 75
  .dwDialExtraSampleSeconds = 120
  .dwDialMode = 1
  .dwfNetProtocols = 4
  .dwfOptions = 1024262928
  .dwfOptions2 = 367-256 ' PPTP为此值
  .dwFramingProtocol = 1
  .dwHangUpExtraPercent = 10
  .dwHangUpExtraSampleSeconds = 120
  .dwRedialCount = 3
  .dwRedialPause = 60
  .dwType = RASET_Vpn
  CopyMemory .szDeviceName(0), ByVal sDeviceName, Len(sDeviceName)
  CopyMemory .szDeviceType(0), ByVal sDeviceType, Len(sDeviceType)
  CopyMemory .szLocalPhoneNumber(0), ByVal sServer, Len(sServer) '服务器地址
  .dwVpnStrategy = 1 'vpn类型 0 默认 1仅pptp 2先pptp 3仅l2tp 4先l2tp
  .dwEncryptionType = 1 '数据加密类型 如果是pptp方式的话这句可以直接留空
  End With
  Dim rc As RASCREDENTIALS
  With rc
     Mid(.szPassword, 1, Len("xxxxxx")) = "xxxxxx"   'xxxxxx为密码
   .dwSize = 540
   .dwMask = 11 'PPTP此处设置值为11
  End With

上面是基本的PPTP连接方式的写法, 因为L2TP模式涉及到密钥方面, 所以一直很困惑

主要是在想RAS里面是否有一个特定的变量来存放密钥, 然后搜遍了谷歌百度CSDN, 始终不得其果

似乎没有人公开过L2TP的写法

最终看到某篇文章后顿时醒悟, 原来这个密钥并不是存放在一个单独的"变量"里!

其实写法很简单 下面贴出L2TP的写法核心代码:

With re
  .dwSize = LenB(re)
  .dwCountryCode = 86
  .dwCountryID = 86
  .dwDialExtraPercent = 75
  .dwDialExtraSampleSeconds = 120
  .dwDialMode = 1
  .dwfNetProtocols = 4
  .dwfOptions = 1024262928
  .dwfOptions2 = 16 ' 查阅资料得出L2TP这里应该设置为16 具体原理不得而知
  .dwFramingProtocol = 1
  .dwHangUpExtraPercent = 10
  .dwHangUpExtraSampleSeconds = 120
  .dwRedialCount = 3
  .dwRedialPause = 60
  .dwType = RASET_Vpn
  CopyMemory .szDeviceName(0), ByVal sDeviceName, Len(sDeviceName)
  CopyMemory .szDeviceType(0), ByVal sDeviceType, Len(sDeviceType)
  CopyMemory .szLocalPhoneNumber(0), ByVal sServer, Len(sServer) '服务器地址
  .dwVpnStrategy = 3 'vpn类型 首先这里设置为3 也就是默认L2TP方式连接
  .dwEncryptionType = 3 '数据加密类型 设置为3 也就是密钥加密
  End With
  Dim rc As RASCREDENTIALS
  With rc
     Mid(.szPassword, 1, Len("xxxxxx")) = "xxxxxx"   'xxxxxx为预共享密钥, 而在PPTP方式里本应设置密码处直接设置成L2TP的密钥
   .dwSize = 540
   .dwMask = 16 'L2TP此处设置值为16
  End With

以上写法创建出的L2TP方式的VPN可以完美连接, 注意在连接的时候用户密码就直接是密码了 而不是密钥了!!!

最后说一下怎么在win7中隐藏VPN链接, 其实只需要为VPN指定一个电话薄位置就行了~

RasDial函数第二个参数lpszPhonebook的值直接指定成电话薄的位置即可~ 如:"c:\1.xxx"

以上方法研究了很久, 网上关于RAS相关的信息也很少, MSDN介绍的也比较简单, 所以查询起来很模糊~ 此文就当是为准备写相关程序的黑客们提供一个方便拉 o(∩_∩)o ~

其他代码部分L2TP和PPTP写法都是一样的  网上都有源码  我只贴最核心的代码  完整代码可以参考下这个:

http://www.cnblogs.com/JackSun/archive/2011/04/01/2002167.html

摘自:https://www.t00ls.net/thread-21252-1-1.html

留言评论(旧系统):

零落千起 @ 2013-09-20 00:36:19

.dwfOptions2 = 16 ' 查阅资料得出L2TP这里应该设置为16 具体原理不得而知 // 这里应该是"rasEntry.dwfOptions2=RASEO2_UsePreSharedKey;"(C/C++) 否则无法设置Ipsec key

本站回复:

原来如此……

佚名 @ 2013-09-29 23:29:49

你好。。 在使用参考 上面给出的 完整代码 时,出现问题:在IP 用户 密码都不正确下,如何在什么情况下,都是显示连接成功的。。 这是什么情况,是不是那个代码有错 我是在WIN7环境下安装简体版VB测试的 请指教

本站回复:

这个不太清楚,这段代码本人没有用过,你再仔细调试一下。