实践出真知 布署openvpn环境应注意的事

原创
安全
OpenVPN是一个开源的加密隧道构建工具,基于OpenSSL的SSL/TLS协议,可以在Internet中 实现点对点的SSLVPN安全连接。使用OpenVPN的好处是安全、易用和稳定,且认证方式灵活,具备实现SSL VPN解决方案的完整特性。OpenVPN可以应用于Linux、Unix、Mac OS以及Windows等各种操作系统平台。OpenVPN提供两种 类型的虚拟网络接口:TUN和TAP,分别用于建议IP隧道、以太网桥接。在Linux/unix中使用这两种虚拟设备,需要对应的内核模块支持。

 【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  
  • 1.
  • 2.
  • 3.

②下载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  
  • 1.
  • 2.

一、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"  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

保存退出,再运行:

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  
  • 1.
  • 2.
  • 3.
  • 4.

然后就是一段提示,要求输入信息,大部分信息默认就是上述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  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.

 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  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.

 依次类推生成其他客户端证书/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  
  • 1.
  • 2.
  • 3.
  • 4.

 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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

 #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  
  • 1.
  • 2.
  • 3.

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

责任编辑:林琳 来源: 51CTO.com
相关推荐

2021-10-26 11:42:51

系统

2012-08-13 16:48:31

架构师

2013-12-23 10:14:36

虚拟网络

2013-12-24 07:17:25

虚拟网络网络虚拟化

2013-06-28 08:49:46

炎黄盈动BPM

2019-10-18 11:11:52

DynamoDBNoSQL数据库

2015-12-25 10:42:57

爱数云存储

2010-11-17 11:29:39

2010-04-19 14:05:28

无线网络故障

2014-07-04 16:06:45

用友优普

2010-12-22 09:12:27

2012-08-14 16:57:25

开发技术周刊

2015-07-28 11:02:15

androidapp开发

2019-08-20 15:16:26

Reacthooks前端

2022-12-26 15:57:56

2011-08-30 10:03:59

软件工程

2018-12-24 14:58:02

人工智能AI视觉搜索

2017-12-07 22:08:16

系统架构设计数据服务交易系统

2020-03-27 22:18:55

JavaScript编程语言代码

2015-06-18 17:18:56

综合布线环境保护
点赞
收藏

51CTO技术栈公众号