基于虚拟机LINUX的SSL-VPN 网关搭建
1 SSL-VPN的功能简介
在可信安全无线路由器的产品研发过程中,我们研发小组想要在可信安全路由上,搭建一个SSL-VPN虚拟网关的专用网络。VPN的功能是:在公用网络上建立专用网络,进行加密通讯。VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问,在企业网络中有广泛应用。
OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI,它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现,和传统 VPN 相比,它的优点是简单易用。虚拟网卡是
使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出现一个网卡,可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如IE)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是OpenVpn能够跨平台一个很重要的理由。
2 OpenSSL与OpenVPN的安装 2.1 Linux下OpenSSL的安装
从OpenSSL官网上下载最新版本的OpenSSL软件openssl-1.0.1t并放入到虚拟机的Linux文件中,从终端进入OpenSSL的安装目录,并依次输入以下安装命令。(通过百度搜索官网就可以找到免费的软件源代码)
$ ./config #使用$ ./config --prefix=/usr/local --openssldir=/usr/local/openssl #可以安装到指定目录下面
$ make $ make test $ make install
输入命令$ which opensll 可以查看OpenSSL的路径,命令$ openssl version可以查看所安装的OpenSSL版本号。
2.2 Linux下OpenVPN的安装
首先,从OpenVPN官网上下载最新版本的OpenVPN软件openvpn-2.3.11并放入到虚拟机的Linux文件中,从终端进入安装目录,并依次输入以下安装命令。
$ ./configure
在configure之后会因为缺少一些数据库出现各种报错信息,根据以下报错信息进行相应操作。
1.如果你没有安装OpenSSL,则会提示:
configure: error: ssl is required but missing
解决方法是执行命令:$ sudo apt-get install libssl-dev 2. 如果你没有安装lzo,则会提示:
configure: error: lzo enabled but missing
解决方法是执行命令:$ sudo apt-get install liblzo2-dev 3. 如果你没有安装PAM,则会提示:
configure: error: libpam required but missing
解决方法是执行命令:$ sudo apt-get install libpam0g-dev
$ make $ make install
同样可以使用命令$ which opensll 可以查看OpenSSL的路径,命令$ openssl --version可以查看所安装的OpenSSL版本号。
2.3 虚拟机LINUX下OpenVPN
通过安装OpenSSL与OpenVPN我们已经完成了在Linux上搭建SSL-VPN虚拟网的准备工作,接下来我要在两安装好OpenSSL与OpenVPN的Linux上分别配置OpenVPN服务器和客户端进行连接测试。
3 OpenVPN的服务器与客户端配置 3.1 配置OpenVPN服务器
1 从安装目录下复制配置文件easy-rsa到/etc下cp -R /usr/local/openvpn/examples/easy-rsa /etc/openvpn/
2 修改var文件 :vim /etc/openvpn/easy-rsa/2.0/vars。其实也可以不修改,但是为了后续步骤能够一路enter,所以就先在这里修改下吧。主要是要修改末尾的几行。
export KEY_COUNTRY=\export KEY_PROVINCE=\export KEY_CITY=\export KEY_ORG=\
export KEY_EMAIL=\export KEY_EMAIL=mail@host.domain export KEY_CN=changeme export KEY_NAME=changeme export KEY_OU=changeme
export PKCS11_MODULE_PATH=PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234
“=”号后边就自己填入吧,我不知道大小写有没有影响,为了以防万一,还是按照它默认的格式来写吧。编辑完之后要记得保存。
3 设置环境变量
在ROOT下面建立隐藏文件的环境变量.bash_profile
Vi /root/.bash_profile
D=/root/Scripts/openvpn-2.0.9/easy-rsa KEY_CONFIG=$D/openssl.cnf KEY_DIR=$D/keys KEY_SIZE=1024
KEY_COUNTRY=CN KEY_PROVINCE=GD KEY_CITY=DG KEY_ORG=\
KEY_EMAIL=\
export KEY_CONFIG KEY_DIR KEY_SIZE KEY_COUNTRY KEY_PROVINCE
KEY_CITY KEY_ORG KEY_EMAIL D
同时在控制台终端输入:上面的全部命令
通过 echo $D
echo $KEY_SIZE 查看环境变量是否生效
4 生产证书和密钥
在/etc/openvpn/easy-rsa/2.0目录中执行下面命令: $ ./clean-al $ ./build-ca
$ ./build-key-server server
$ ./build-key client
同时可以生产其他客户端证书
$ ./build-key client1 $ ./build-key client2 $ ./build-dh
生产ta.key
$ openvpn --genkey --secret ta.key
新产生的证书可以在/etc/openvpn/easy-rsa/2.0/keys/目录下找到,将keys中的所有文件打包下载到本地提供给客户端。 ## ta.key 可能在上级目中,也要将其一起打包
$ cp -r /etc/openvpn/easy-rsa/2.0/keys /home/gaowd/
5 创建OpenVPN服务器配置文件
[root@xxx keys]# vim /usr/local/etc/server.conf
port 2000 proto udp
dev tun server 20.10.0.0 255.255.255.0 #虚拟IP push \内网IP ifconfig-pool-persist /usr/local/etc/ipp.txt ca /usr/local/etc/keys/ca.crt
cert /usr/local/etc/keys/server.crt key /usr/local/etc/keys/server.key dh /usr/local/etc/keys/dh1024.pem tls-auth /usr/local/etc/keys/ta.key 0 keepalive 10 120 comp-lzo
status /var/log/openvpn-status.log verb 4 persist-key persist-tun
##tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表 #虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。
##cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /usr/local/etc ##gunzip server.conf.gz 得到一个server.conf 文件
7配置就绪后启动OpenVPN
[root@xxx keys]# openvpn --config /usr/local/etc/server.conf
Wed Jul 25 16:00:28 2012 us=796069 UDPv4 link local (bound): [undef]:2000 Wed Jul 25 16:00:28 2012 us=796706 UDPv4 link remote: [undef]
Wed Jul 25 16:00:28 2012 us=797411 MULTI: multi_init called, r=256 v=256 Wed Jul 25 16:00:28 2012 us=798210 IFCONFIG POOL: base=20.0.0.4 size=62 Wed Jul 25 16:00:28 2012 us=799178 IFCONFIG POOL LIST
Wed Jul 25 16:00:28 2012 us=800104 client1,20.0.0.4
Wed Jul 25 16:00:28 2012 us=801389 Initialization Sequence Completed
最后一行提示Initialization Sequence Completed表明启动成功。 8 调试结束后可以后台方式启动openvpn
openvpn --daemon --config /usr/local/etc/server.conf 并把这一句添加到/ect/rc.local 文件中 可以验证一下openvpn到底有没真正起来: [root@xxx openvpn-2.0.9]# lsof -i :2000
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME openvpn 21355 root 5u IPv4 22646 UDP *:2000 [root@xxx openvpn-2.0.9]# lsmod |grep tun tun 21441 2
3.2 Linux下配置 OpenVPN 客户端
1 在linux下配置客户端
首先将OpenVPN服务器提供的配置文件解压,并将所有文件都复制到 /etc/openvpn/中。并在其中编辑配置文件client.conf
client dev tun proto udp
remote 192.168.1.135 2000 # 服务器的实际ip
# push \ ###服务器内 resolv-retry infinite #断网自动连接 persist-key persist-tun ca ca.crt
cert client.crt key client.key
tls-auth ta.key 1 #服务器设置防御DOS等攻击时,客户端不能注释掉 ns-cert-type server comp-lzo verb 3
;redirect-gateway def1 tls-auth ta.key 1
2 连接OpenVPN服务器
在配置好.ovpn文件后,执行$ openvpn /etc/openvpn/client.ovpn
此时,终端会回显很多连接日志。如果连接不成功,则可以通过这些日志来确定出错位置。如果要断开,只需要通过Ctrl+C强制终止即可。
上面的命令在实际中并不方便,因为它要占用一个独立的终端。在测试成功后,使用以下命令即可在后台连接OpenVPN:
$ openvpn /etc/openvpn/client.ovpn > /dev/null &
值得称赞的是,openvpn非常智能,在连接异常中断、无法连接服务器、断网的情况下,它会自动重连。因此,如果希望开机即自动连接OpenVPN,或者是VPN常年在线,则可将上述命令行加入/etc/rc.local文件中。
注意:命令末尾的&符号不能省略,否则将可能阻塞系统的正常启动。