零投入 教你搭建属于自己的加密VPN

2014年5月2日 0 条评论 870 次阅读 0 人点赞

面临当前低迷的市场环境,企业的每一项投资都要谨慎,应尽量寻找一些免费技术或工具解决自己面临的问题。对于拥有分支机构的企业来说,为了保证两个网络之间通信的安全,一般选择建立Site-to-Site(站点到站点)VPN的方式,通常需要投资购买专业的VPN设备。不过,为了节省投资,今天为大家介绍一种不用花钱又能实现安全防护的方法。

OpenVPN是一个开源SSL VPN客户端/服务器软件,可以让你搭建一个自己的加密VPN,该软件曾获得2007年最佳开源VPN软件,由此可见它的易用性和功能,都值得用户信赖。在本篇文章中,我将向大家介绍如何使用OpenVPN来建立站点到站点的VPN,从而在两个不同网络之间建立一条安全的加密通道。

了解网络拓扑

首先让我们先了解一下网络拓扑结构,公司总部和分支机构的局域网内各有数台计算机,两个网络通过互联网相互连接,如图1所示。我们需要在两者之间建立一个安全通道。

 

零投入教你搭建属于自己的加密VPN

 

图1、网络拓扑图

为了实现这个目的,我们可以使用OpenVPN的两种不同的模式:路由模式或桥接模式。桥接模式,从其名字上我们可以看出,只是通过OpenVPN计算机将服务器所在网络扩展到要连接的客户端。这种方式部署简单,但是随着网络规模的增长缺乏可扩展性。

在桥接模式下,其广播域也同时被扩大,因为所连接的客户端与服务器网络在同一个网段内,广播也会通过VPN通道进行发送。对于某些服务来说,这可能是个不错的功能。但是在广播严重的网络环境中,广播流量可能会占用通道带宽,影响性能。

相比之下,路由模式设置起来麻烦些,需要对客户端和服务器端路由器进行设置,但是这种模式可扩展性强,而且将总部网络和分支机构的网络分到不同的广播域中。但是,要想在这两个网络之间实现Windows文件共享,需要建立一个WINS服务器。

在本篇文章中,我们将介绍如何进行路由设置,以及如何通过OpenVPN建立安全通道。当谈及加密和安全时,首选操作系统一定是Linux,在本篇文章中也将以它为例。当然,OpenVPN也可以很好的支持Windows,两种系统下的设置思路是相似的。

现在来看一下相关的硬件设置:

服务器端路由器:D-Link DGL-4300

客户端路由器:Linksys WRT54G

服务器端OpenVPN计算机:CPU,AMD Athlon 1600+,768Mb内存

客户端操OpenVPN计算机:CPU,AMD Athlon X2 3800+,2Gb内存

两个网络的网段分配如图2所示:

 

零投入教你搭建属于自己的加密VPN

 

图2、网络地址

 

安装OpenVPN

首先,我们需要一个OpenVPN软件。我们需要分别从服务器端计算机和客户端计算机上下载、解压缩、配置、编译和安装OpenVPN,命令如下:

~ $ wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
~ $ tar xvzf openvpn-2.0.9.tar.gz
~ $ cd openvpn-2.0.9
~/openvpn-2.0.9 $ ./configure
~/openvpn-2.0.9 $ make
~/openvpn-2.0.9 $ su -c 'make install'

注意:

OpenVPN需要OpenSSL支持,在多数Linux版本中都已经默认安装,如果没有的话,你需要首先安装它。

 

设置公开密钥体系

和WPA企业模式一样,OpenVPN依靠一个公开密钥体系(PKI)。OpenVPN开发者在发现建立PKI非常复杂后,编写了一些封装的脚本可以让你非常轻松的搭建并运行自己的PKI,OpenVPN的easy-rsa脚本就可以实现这个任务,详细的安装过程在OpenVPN的文档中有介绍,因此在这儿我只对其进行简单介绍。

进入解开的OpenVPN目录下的easy-rsa目录(~/openvpn-2.0.9/easy-rsa),根据你的需要对这个文件中的某些变量进行修改。我一般将密钥大小改为2048bit(在第40行):

export KEY_SIZE=2048

然后根据你的应用需要对第45行到49行的字段值进行修改:

export KEY_COUNTRY=CN
export KEY_PROVINCE=BJ
export KEY_CITY="Beijing"
export KEY_ORG="IT168"
export KEY_EMAIL="smile@free.it168.com"

接下来,初始化这个变量文件:

~/openvpn-2.0.9/easy-rsa $ . ./vars

最后,初始化运行环境,建立认证中心(CA):

~/openvpn-2.0.9/easy-rsa $ ./clean-all
~/openvpn-2.0.9/easy-rsa $ ./build-ca

OpenSSL需要我们在这个变量文件中定义的一些字段值;只需要按回车接受默认值即可。当需要你输入Common Name(通用名称)字段值时,你可以设定一个自己起的名字:

Common Name (eg, your name or your server's hostname) []:CA

接下来,创建服务器密钥(下面命令中的Server是密钥的文件名):

~/openvpn-2.0.9/easy-rsa $ ./build-key-server server

然后,使用同样的方法来建立客户端密钥:

~/openvpn-2.0.9/easy-rsa $ ./build-key remote_office

 

配置服务器端OpenVPN计算机

服务器端OpenVPN计算机是这个VPN网络的核心所在。在路由模式下,所有的客户端都要连接到OpenVPN服务器,所有客户端之间的通信都要由OpenVPN服务器来进行路由,因此它的重要性不言自明,需要保持不宕机,能够稳定运行。

客户端需要在它们的配置文件中设置服务器端的地址,因此最简单的方法是通过一个域名来指向你的服务器端网络。

首先,我们需要为OpenVPN创建一个配置目录。使用root帐号创建目录/etc/openvpn,下面有两个子目录/etc/openvpn/certs和/etc/openvpn/keys。

~ # mkdir /etc/openvpn
~ # mkdir /etc/openvpn/certs /etc/openvpn/keys

接下来,拷贝服务器的证书(server.crt)和CA的证书(ca.crt)到/etc/openvpn/certs下。同样,拷贝服务器密钥(server.key)到/etc/openvpn/keys目录下。服务器密钥需保密,锁定它的访问权限:

~ # chmod -R 600 /etc/openvpn/keys/

接下来,我们需要创建e-Hellman密钥一致和交换参数。之后,拷贝DH参数(dh2048.pem)到/etc、openvpn目录下。

~ $ openssl dhparam -out dh2048.pem 2048

OpenVPN最强大的功能之一就是能够“推送”特定配置到不同的客户端。这一点对于具有多个客户端的VPN网络的创建和管理来说,是有很大帮助的。

要完成这个推送,我们还需要在OpenVPN服务器上建立客户端配置目录,包含连接到该服务器的每一个客户端的简短配置文件。当一个客户连接时,服务器首先查看与它具有相同通用名称的配置文件,作为该客户端的证书,并在那个文件中执行任何配置参数。

创建/etc/openvpn/client-configs目录,并在它下面创建一个与客户端网络具有相同通用名称的文件(在这个例子中是remote_office)。

~ # mkdir /etc/openvpn/client-configs
~ # touch /etc/openvpn/client-configs/remote_office

使用你熟悉的文本编辑工具打开remote_office,并输入如下配置:

iroute 192.168.1.0 255.255.255.0
push "route 10.1.1.0 255.255.255.0 vpn_gateway"

iroute命令在OpenVPN服务器上建立一条内部路由,这样它就知道通过remote_office对所有通向网络192.168.1.0/24的数据进行路由。推送路由10.1.1.0/24,允许客户端广播服务器网络到客户端。

最后,我们需要编辑OpenVPN配置文件。OpenVPN具有一些非常不错的示例配置文件供我们参考。

 

配置服务器端路由器

为了通过OpenVPN将来自服务器端网络的数据路由到客户端,服务器端网络中的计算机需要知道如何才能到达客户端。因此,我们需要为服务器端路由器增加一条路由,以将去往客户端子网(192.168.1.0/24)的通信路由到OpenVPN计算机(10.1.1.2)上。

在DGL-4300上,可以在高级设置——>路由中进行设置,如图3。

 

零投入教你搭建属于自己的加密VPN

 

图3、在服务器端路由器上增加路由

现在,我们可以启动OpenVPN服务器了:

~ # openvpn --config /etc/openvpn/server.conf

 

配置客户端OpenVPN计算机

建立客户端OpenVPN计算机,与服务器的建立非常类似:为证书和密钥创建目录;拷贝文件;对其进行安全设置。客户端OpenVPN配置要比服务器端少很多,因为在与服务器建立起连接后,服务器可以推送合适的配置到客户端。

#
# IT168 OpenVPN Client Configuration
#
# Instructs OpenVPN to run in client mode, requests IP address and
# special instructions (like routes) from the server.
client
# Interface for tunnel
dev tun0
# Remote server to connect to. Can be domain name or IP address.
remote it168test.com
# Certificates and keys required for connection
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/remote_office.crt
key /etc/openvpn/keys/remote_office.key
# Symmetric cipher - Must be the same as the server's
cipher BF-CBC
# Protocol and Port - Must be the same on both server and client.
proto udp
port 1194
# Log to file instead of syslog
log-append /var/log/openvpn.log
verb 4
# Since the OpenVPN client is acting as a gateway for other machines
# on the client-side network, run as a daemon and downgrade user
# priviledges.
user nobody
group nobody
daemon
# Use a persistent key and tunnel interface.
persist-tun
persist-key

 

配置客户端路由器

如同服务器端路由器的配置一样,在OpenVPN客户端网络中的所有计算机需要知道如何到达服务器端网络(10.1.1.0/24),这样也需要增加一条路由,来把目的网络为服务器网络的通讯指向OpenVPN客户端计算机(192.168.1.2)。在WRT54G上,需要在Setup>Advanced Routing下设置,如图4。

 

零投入教你搭建属于自己的加密VPN

 

图4、向客户端路由器增加路由

最后,使用以下命令将客户端连接到OpenVPN服务器:

~ # openvpn --config /etc/openvpn/client.conf

 

 关于性能和排障的总结

你或许也可以想到,加密会对网络性能有所影响。但是实际上,网络吞吐能力受OpenVPN本身的影响,要远远小于总部与分支机构之间互联网连接的带宽的影响。

因此,如果你想实现安全通信又不想投资,就不能太看重带宽因素。

如果你通过OpenVPN建立其VPN通道后,网络不能正常运行,可以通过一些工具和方法来进行挂账排查。

首先,检查OpenVPN的日志,它里面记录了详细的信息,或许可以帮助你发现问题所在。

另外,你可以使用tcpdump网络排障工具,关于它的用法,可以通过man命令进行详细查看。

在安全方面,VPN所带来的意义是非常重大的,它可以让移动员工安全的连接到总部网络中,也可以把分支机构的整个网络与总部网络通过一个安全的通道连接起来。OpenVPN是一个“工业级别”VPN工具,功能即全面又强大,值得那些有此需求的人选用。

chong2008

这个人太懒什么东西都没留下

文章评论(0)

上传图片