OpenVPN是一个开源SSL VPN客户端/服务器软件,可以让你搭建一个自己的加密VPN,该软件曾获得2007年最佳开源VPN软件,由此可见它的易用性和功能,都值得用户信赖。在本篇文章中,我将向大家介绍如何使用OpenVPN来建立站点到站点的VPN,从而在两个不同网络之间建立一条安全的加密通道。
了解网络拓扑
首先让我们先了解一下网络拓扑结构,公司总部和分支机构的局域网内各有数台计算机,两个网络通过互联网相互连接,如图1所示。我们需要在两者之间建立一个安全通道。
图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所示:
图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 servers 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。
图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 servers
cipher BF-CBC
# P