因为工作关系,我需要在一个系统上安装两套openvpn client系统,并且有可能需要同时使用它们登录到各自指定的openvpn server上,产生的问题是:
(1)两套系统使用相同的注册表键值(都是写入SOFTWARE/OpenVPN和SOFTWARE/OpenVPN-GUI),所以只有一套client可以使用,一套openvpn client被uninstall以后,注册表键值被删除,另一套openvpn client就不能使用。
(2)两套系统会生成两块tap网卡,它们的名称不同(本地连接x),但是在系统内部它们的硬件ID相同(都是tap0801),openvpn client被uninstall的时候,调用tapinstall命令删除网卡,该命令删除指定硬件ID的网卡(tap0801),所有硬件ID相同的网卡都会被删除。再使用另一套系统,不但要增加注册表键值,还要增加一块网卡。
解决问题的方法:
分别制作两套openvpn client的安装包,在安装包里指定使用不同的注册表键值,不同的安装包使用硬件ID不同的tap网卡。
解决问题的思路:
(1)修改openvpn源代码,包括openvpn-2.0.8.zip和openvpn-gui-1.0.3.zip。
(2)openvpn-2.0.8的源代码里有tap网卡的源代码,修改网卡的硬件ID,定制tap网卡。
解决问题的过程:
1. 安装Win32OpenSSL-0_9_7k.exe,再安装MinGW-3.2.0-rc-3.exe,再安装MSYS-1.0.10.exe。都使用默认值安装,安装到c盘。
2. 运行msys,建立/etc/fstab文件,内容为:
c:\mingw /mingw
3.把lzo-1.08.tar.gz解压缩到c:\msys\1.0\目录下,在msys里编译安装:
cd /lzo-1.08
./configure
make
make install
make install会把相关文件复制到/usr/local/lib目录下,但是在/目录下看不到有/usr目录,不用管它。
4.把openvpn-2.0.8.zip文件解压缩到C:\msys\1.0\目录下,修改makefile.w32文件的以下几个变量(可以在msys里用vi打开这个文件改,也可以在windows下改):
OPENSSL = /c/OpenSSL
LZO = ../lzo-1.08
LIB_DIRS = -L${OPENSSL}/lib/MinGW -L${LZO}/src/.libs
使用原文件的变量是无法编译成功的。
5.修改service-win32\openvpnserv.c,第74行:
#define REG_KEY "SOFTWARE\\OpenVPN"
把"OpenVPN"改成自己喜欢的名字,这就是注册表里的位置。
6.把/c/OpenSSL/lib/MinGW目录下的ssleay32.a 改名为 libssl32.a。
7.根据以下提示修改/openvpn-2.0.8/tap-win32/目录下相关文件,把这些tap0801改成自己的名称,比如abcd001:
; (1) Rename all tapXXXX instances in this file to
; something different (use at least 5 characters
; for this name!)
; (3) Change TARGETNAME in SOURCES to match what you
; changed tapXXXX to.
; (4) Change TAP_COMPONENT_ID in common.h to match what
; you changed tapXXXX to.
; (6) Change DeviceDescription and Provider strings.
; (7) Change PRODUCT_STRING in constants.h to what you
; set DeviceDescription to.
注:(1)和(6)修改的是i386/OemWin2k.inf文件。
原文还有几条没有列出来,因为是不需要,或者是根据不存在这个文件(比如第5点)。
8.在/openvpn-2.0.8/目录下编译openvpn:
./configure
make -f makefile.w32
如果一切顺利的话,会生成新的openvpn.exe文件,这个文件会使用指定硬件ID的tap网卡。
9.把OemWin2k.inf文件复制到C:\Program Files\OpenVPN\bin目录(假设已经安装过一套openvpn client),把C:\Program Files\OpenVPN\driver\tap0801.sys文件也复制到bin目录,并且改名为abcd001.sys,使用以下命令生成新的网卡:
tapinstall install OemWin2k.inf abcd001
该命令会在系统中安装一块tap网卡,硬件ID为abcd001。
---------------------------------------
20061104 修正文档中一些错误。
(continue...)
[ 本帖最后由 sailer_sh 于 2006-11-4 11:09 编辑 ]
河里的鱼 回复于:2006-11-02 18:48:13
可以再增加上这样做的目的吗?我比较笨,不懂这样做有什么用处
wenzk 回复于:2006-11-02 20:04:14
呵呵,同问楼主
为什么要两套VPN呢?
难道不只是差在配置文件上?
以前我的解决办法是用两套配置文件,增加一个虚拟网卡,然后就可以同时连接2个VPN服务器了。
sailer_sh 回复于:2006-11-03 09:13:01
我搭建了两套Openvpn系统用于不同的业务,它们相互之间没有任何联系,客户端的配置、证书等等完全不相同。
为了让使用的人方便安装,我不得不用nsis制作了针对不同openvpn server的client端,当时我没有考虑,也没有人提出会在一台电脑上安装两套client端的需求,后来有领导提出这个需求,因为他需要参与这两个业务。
如果按照client默认方式安装的话,肯定只能用其中一套client,要用另一套只能让他自己建立一个快捷方式,指定openvpn.exe读取另一个配置文件,但是这样比较麻烦,领导希望事情做得更完美,所以向我提出这个要求,由我来解决这个问题。
通过研究和解决这个问题,我觉得更增加了对openvpn的了解,越来越喜欢这个东西了。
wenzk 回复于:2006-11-03 14:32:26
哦,赞一个,不同的需求:)
sailer_sh 回复于:2006-11-03 15:35:52
到现在为止,已经制作出了两套不同的openvpn client,安装以后可以同时拨号,同时连到不同的openvpn server,并且两块tap网卡分别得到各自的ip地址,现在还有一个小问题,两个client同时拨号连接以后,断开其中任意一个,另外一个也会自动断开,正在查找原因,等到全部解决后,我再更新上面写的制作过程(到现在为止,上面写的制作过程还不完整)。
我对两个openvpn server稍做调整,一台上分配的网段是10.8.0.x,另一台分配的网段是10.7.0.x,这样可以避免在一台计算机上拨两个server时分配得到同一网段的ip。
wenzk 回复于:2006-11-03 16:50:29
嗯,鼓励原创:)
yuyuhaso 回复于:2006-11-08 11:15:20
好贴,不顶不行
yuyuhaso 回复于:2006-11-16 12:14:10
我编译出来的东东COPY到另外一个目录后运行就会出现"无法定序数3724于动态链接库LIBEAY32.dll上"
放在编译的目录中的时候貌似就没有问题,请问怎么解决哈?
wenzk 回复于:2006-11-17 14:54:30
把 LIBEAY32.dll 和openvpn.exe一起拷贝走
yuyuhaso 回复于:2006-11-22 13:32:21
libeay32和编译好的openvpn程序放在一起就会报个错误
libeay32改个名字以后就不报错了,代码我还没有看,不知道是什么问题
|