【51CTO.com独家特稿】前言
OpenVPN是一个开源的加密隧道构建工具,基于OpenSSL的SSL/TLS协议,可以在Internet中 实现点对点的SSLVPN安全连接。使用OpenVPN的好处是安全、易用和稳定,且认证方式灵活,具备实现SSL VPN解决方案的完整特性。OpenVPN可以应用于Linux、Unix、Mac OS以及Windows等各种操作系统平台。OpenVPN提供两种 类型的虚拟网络接口:TUN和TAP,分别用于建议IP隧道、以太网桥接。在Linux/unix中使用这两种虚拟设备,需要对应的内核模块支持。 RHEL5/FreeBSD8系统默认已编译好TUN模块,直接使用即可。OpenVPN的官方站点是http://openvpn.net,目前稳定版为OpenVPN-2.0.9。
推荐专题:企业内网开发环境部署与管理全攻略(FreeBSD+PHP)
我替公司设计VPN家庭办公方案时,初期部署的是pptpd方案,稳定性和加密性大家都是还满意的;后期在运作时发现,许多小区或用电信路由器作NAT拨号的同事发现,根本连接不了公司的公网pptpd服务器,拨号时出现了619报错,具体原因为:
这种情况大数多原因为客户机连接Internet的网关(如家庭宽带路由或公司上网网关路由或防火墙)NAT-T功能关闭或对VPN支持性不好,主要是对GRE及PPTP协议的NAT-T不支持。可打开网关路由的NAT-T功能,如果还是出现错误,则需要更换网关设备,现在市面上大多数设备已经支持。由于公司在小区或家里有几台电脑的情况都很普遍,另考虑到以前布署的点对点openvpn穿透能力还是很强的,考虑放弃pptpd,改用openvpn。
值得注意的是:为了消除防火墙及路由器的影响,我直接将openvpn服务器放在防火墙前面(如果置于防火墙后,还要考虑DMZ映射及路由方面的因素,失败率比较高),为了稳定性我用的是64bit的Centos5.5,LAN:192.168.4.222,WAN:220.249.x.x。
这里提前说明一下openvpn的网络部署应该注意的情况,如果你所在小区的局域网是192.168.1.0,而你的openvpn所在局域网也是192.168.4.0的话,会发生杯具性的事情,你是拨不上openvpn服务器的;所以你在规划你的网络时,应该考虑将网段不要设计成192.168.1.0的网段,考虑用192.168.4.0或192.168.10.0这些不常见的网段;你到星巴克咖啡馆唱咖啡时你会惊奇的发现,大多数类似的提供无线服务,基本是将局域网设计成192.168.1.0的,所以我推荐公司的网络尽量不要用192.168.1.0的网段,切记。
完整安装步骤如下(以下过程我重复了上百次,大家可依此实验,Freebsd及Linux均适用)
一、安装前的准备工作
OpenVPN是基于openssl的,所以需要安装openssl,在freebsd8下可采用port安装 cd /usr/ports/security/openssl && make install clean;
RHEL5&Centos5下用 yum -y install openssl openssl-devel
二、 安装服务器端及配置 ,源码包我放在/usr/local/src下。
①首先下载及安装lzo软件包,用于压缩隧道通讯数据以加快传输速度。
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
- tar zxvf lzo-2.03.tar.gz
- cd lzo-2.03
- ./configure --prefix=/usr && make && make install
②下载openvpn及安装
wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
- tar zxvf openvpn-2.0.9
- ./configure --with-lzo-lib=/usr && make && make install
一、OpenVPN服务器端的配置
1)建立CA
在OpenVPN源代码目录下有一个\easy-rsa\2.0目录,进入后修改vars文件最后部分的信息,即
- vim /root/openvpn-2.0.9/easy-ras/2.0/vars
- export KEY_COUNTRY="CN"
- export KEY_PROVINCE="BJ"
- export KEY_CITY="Beijing"
- export KEY_ORG="PKU"
- export KEY_EMAIL=" xxxxxx@pku.edu.cn"
保存退出,再运行:
- source vars
- NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/openvpn-2.0.9/easy-rsa/2.0/keys
- ./clean-all
- ./build-ca
然后就是一段提示,要求输入信息,大部分信息默认就是上述vars文件里的信息,自己只需要填写“Organizational Unit Name”一项,这个随便写一个就是了,也可以不写,我就没有写。
2)为服务器生成证书和密钥
./build-key-server server
还是与上一步类似,自己只需要填写“Organizational Unit Name”一项,也可以不写,即均默认为default值。还会出现:“Sign the certificate? [y/n]”和“1 out of 1 certificate requests certified, commit? [y/n]”,都输入y然后回车,其它可参照如下。
- Generating a 1024 bit RSA private key
- ......++++++
- ....................++++++
- writing new private key to 'server.key'
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [CN]:
- State or Province Name (full name) [BJ]:
- Locality Name (eg, city) [BJ]:
- Organization Name (eg, company) [buaa]:
- Organizational Unit Name (eg, section) []:gait
- Common Name (eg, your name or your server's hostname) []:server
- Email Address [[email]support@cooldvd.com[/email]]:
- Please enter the following 'extra' attributes
- to be sent with your certificate request
- A challenge password []:abcd1234
- An optional company name []:dvdmaster
- Using configuration from /openvpn-2.0.5/easy-rsa/openssl.cnf
- Check that the request matches the signature
- Signature ok
- The Subject's Distinguished Name is as follows
- countryName :PRINTABLE:'CN'
- stateOrProvinceName :PRINTABLE:'GD'
- localityName :PRINTABLE:'SZ'
- organizationName :PRINTABLE:'dvdmaster'
- organizationalUnitName:PRINTABLE:'dvdmaster'
- commonName :PRINTABLE:'server'
- emailAddress :IA5STRING:'[email]support@cooldvd.com[/email]'
- Certificate is to be certified until Mar 19 08:15:31 2016 GMT (3650 days)
- Sign the certificate? [y/n]:y
- 1 out of 1 certificate requests certified, commit? [y/n]y
- Write out database with 1 new entries
- Data Base Updated
3)在openvpn中,这种配置方法是每一个登陆的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客 户端连接(如果有两个机器安装相同证书,同时拨服务器,都能拨上,但是只有第一个拨上的才能连通网络)。所以需要建立许多份证书。下面建立2份,名称分别 为client1和client2
- ./build-key client1
- Generating a 1024 bit RSA private key
- .....++++++
- ......++++++
- writing new private key to 'client1.key'
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [CN]:
- State or Province Name (full name) [BJ]:
- Locality Name (eg, city) [BJ]:
- Organization Name (eg, company) [buaa]:
- Organizational Unit Name (eg, section) []:gait
- Common Name (eg, your name or your server's hostname) []:client1 重要: 每个不同的 client 生成的证书, 名字必须不同.
- Email Address [[email]support@cooldvd.com[/email]]:
- Please enter the following 'extra' attributes
- to be sent with your certificate request
- A challenge password []:abcd1234
- An optional company name []:gait
- Using configuration from /openvpn-2.0.5/easy-rsa/openssl.cnf
- Check that the request matches the signature
- Signature ok
- The Subject's Distinguished Name is as follows
- countryName :PRINTABLE:'CN'
- stateOrProvinceName :PRINTABLE:'GD'
- localityName :PRINTABLE:'SZ'
- organizationName :PRINTABLE:'dvdmaster'
- organizationalUnitName:PRINTABLE:'dvdmaster'
- commonName :PRINTABLE:'client1'
- emailAddress :IA5STRING:'[email]support@cooldvd.com[/email]'
- Certificate is to be certified until Mar 19 08:22:00 2016 GMT (3650 days)
- Sign the certificate? [y/n]:y
- 1 out of 1 certificate requests certified, commit? [y/n]y
- Write out database with 1 new entries
- Data Base Updated
依次类推生成其他客户端证书/key:
./build-key client2
4)./build-dh,这步不要看掉了~
生成的证书文件均在/usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys下
5)配置服务器VPN文件
a) cp -p /usr/local/src/openvpn-2.0.9/sample-config-files/server.conf /usr/local/etc/server.conf
b) vi /usr/local/etc/server.conf
i. proto udp改成proto tcp
ii. ca那四行改成
- ca /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/ca.crt
- cert /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/server.crt
- key /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/server.key
- dh /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/dh1024.pem
iii. server那行改成
server 10.0.0.0 255.255.255.0 前期我用是10.0.0.0,后期实际部署用的是10.10.0.0。
v. 改成verb 5可以多查看一些调试信息
6) 启动服务:
a) 关闭服务器、防火墙上所有对SSH(22)、openvpn(1194)的拦截。
b) echo "1" > /proc/sys/net/ipv4/ip_forward
c)
- /usr/local/sbin/openvpn --config /usr/local/etc/server.conf
- Fri Jan 23 23:55:34 2009 OpenVPN 2.0.9 i686-pc-linux [SSL] [EPOLL] built on Jan 23 2009
- Fri Jan 23 23:55:34 2009 Diffie-Hellman initialized with 1024 bit key
- Fri Jan 23 23:55:34 2009 TLS-Auth MTU parms [ L:1543 D:140 EF:40 EB:0 ET:0 EL:0 ]
- Fri Jan 23 23:55:35 2009 TUN/TAP device tun0 opened
- Fri Jan 23 23:55:35 2009 /sbin/ifconfig tun0 10.0.0.1 pointopoint 10.0.0.2 mtu 1500
- Fri Jan 23 23:55:35 2009 /sbin/route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.2
- Fri Jan 23 23:55:35 2009 Data Channel MTU parms [ L:1543 D:1450 EF:43 EB:4 ET:0 EL:0 ]
- Fri Jan 23 23:55:35 2009 Listening for incoming TCP connection on [undef]:1194
- Fri Jan 23 23:55:35 2009 TCPv4_SERVER link local (bound): [undef]:1194
- Fri Jan 23 23:55:35 2009 TCPv4_SERVER link remote: [undef]
- Fri Jan 23 23:55:35 2009 MULTI: multi_init called, r=256 v=256
- Fri Jan 23 23:55:35 2009 IFCONFIG POOL: base=10.0.0.4 size=62
- Fri Jan 23 23:55:35 2009 IFCONFIG POOL LIST
- Fri Jan 23 23:55:35 2009 MULTI: TCP INIT maxclients=1024 maxevents=1028
- Fri Jan 23 23:55:35 2009 Initialization Sequence Completed
#p#
二、安装WidnowsVPN客户端
1、安装客户端
①从http://openvpn.se/files/上下载与openvpn服务器版本一致的Windows客户端“OpenVPN GUI For Windows”
例如, 服务器装的是 OpenVPN 2.09, 那么下载的 OpenVPN GUI fow windows应该是: openvpn-2.0.9-gui-1.0.3-install.exe
②执行openvpn-2.0.9-gui-1.0.3-install.exe。一切采用默认设置。
③将ca.crt、client1.crt、client1.key复制到C:\Program Files\OpenVPN\config。(不同用户使用不同的证书,每个证书包括.crt和.key两个文件,如client2.crt和client2.key)
④在/root/openvpn-2.0.9/sample-config-files/client.conf 的基础上建立客户端配置文件,改名为C:\Program Files\OpenVPN\config\client.ovpn,即先在服务器上建立配置文件,然后再上传改名到客户机上。
a) proto udp改成proto tcp
b) remote那行改成
192.168.1.103 1194
c) ca那3行改为
- ca ca.crt
- cert client1.crt
- key client1.key
d) 注释掉comp-lzo
⑤连接:在右下角的openvpn图标上右击,选择“Connect”。正常情况下应该能够连接成功,分配正常的IP。(点击看大图)
2、这些都很顺利,但拨号成功后,如何才能使拨号用户访问局域网内192.168.4.0网段的机器呢,具体做法来:
①在openvpn的配置文件里增加push "route 192.168.4.0 255.255.255.0",目的是为客户端加一条路由,这样客户端才有可能访问到办公网络中出VPN Server之外的其它主机(有很多VPN客户端直接添加默认路由,这样客户端的所有连接请求都被路由到 VPN 通道内,结果是客户端此时不能访问VPN,而此项添加指定地址的路由不会导致这一问题)
②在openvpn上开启ip转发echo “1”> /proc/sys/net/ipv4/ip_forward
③在公司的网关或路由器上增加一条路由,添加到 10.10.0.0/24 的路由项目,网关为服务器的内部 IP 地址,目的是为了让公司局域网里的主机知道去往VPN Client的包如何路由,记住 ,路由是双向和回环的,既要有来的路由,也应该有回的路由。由于我这种环境下既没有路由器,也没有防火墙,所以我直接在公司重要的服务器及我要远程的机器(xp)上增加一条路由。
route add 10.10.0.0 mask 255.255.255.0 192.168.4.222
三、需要注意的问题
每个人的网络拓补不一样,如何使openvpn的客户端也能访问除openvpn外的公司局域网内的机器呢?这个问题是玩openvpn的朋友们最为关注的,其它情况可以参考以下几点:
1 、可以把openvpn服务器也设成路由器,并使openvpn服务器作为这些需要被访问的内网机器的路由器,这样路由器和openvpn在同一台机器上就 ok了。
2 、如果内网中有多台机器可能需要被访问,针对我这种情况,可以在路由器上设置静态路由表,设置10.10.0.0网段的信息路由到openvpn服务器, 具体设置参看自己的路由器的设置页面吧。如果是计算机作路由器,那就使用route add 10.10.0.0 mask 255.255.255.0 192.168.4.222(openvpn服务器的ip),这样只需要改一个地方就ok了,就不需要修改每台内网的机器了。
3 、如果改不了路由器,或者内网需要修改的机器不多的话,也可以直接在内网要被访问的机器上,执行route add 10.10.0.0 mask 255.255.255.0 192.168.4.222(openvpn服务器的ip)命令(我的情况是操作系统是windows,命令就是那个了),来直接给内网的机器添加路由,这样 当碰到10.10.0.0网段的信息,它就知道直接路由到openvpn服务器,而不会走路由器这条路了。
还有一个细节问题应该注意:一台机器只能用一个证书拨号,如果是二台机器都要用一个证书来拨号的话,第二台机器会发生每5秒就掉线的杯具,这个也是实际使用中发现的;虽然可以在openvpn通过配置来更改,但我建议还是一台机器使用一个证书的好。
另外一个小问题就是:在进行证书制作工作时,仍旧需要进行初始化,
但只需要进入openvpn\easy-rsa目录,运行vars就可以了,不需要./clean-all步骤,它会清掉一切证书文件的(汗) 。
以上就是我玩openvpn以来的一些经验总结和心得,希望能给大家带来一些帮助;每个人的情况不一样,别人的未必适用于你,所以多动手,多尝试,毕竟实践出真知嘛。通过部署整个VPN办公环境,发现openVPN的稳定和穿透能力相当的强悍啊,套用一句流行的话:openVPN相当V5,呵呵。
附录:
在windows机器上永久增加路由的方法:
ROUTE命令可以在XP、2K/2003、WIN7等操作系统下手工增加静态路由,但是重启之后路由便丢失了,还要重新增加,那么怎样能让路由一直保待,重启后仍然存在呢?其实很简单,在增加路由的命令后加上-P开关就可以了。例如
route -p add 10.10.0.0 mask 255.255.0.0 192.168.4.222
-p参数详解
与Add命令共同使用时,指定路由被添加到注册表并在启动TCP/IP协议的时候初始化IP路由表。默认情况下,启动TCP/IP协议时不会保存添加的路 由,与Print命令一起使用时,则显示永久路由列表。所有其他的命令都忽略此参数。永久路由存储在注册表中的位置是,注意最后一副图画红线的部分,它也可以验证我们新增的命令会永久的增加静态路由。
HKEY_LOCAL_MACHSYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes