Openvpn解决方案
OpenVPN简介
VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI。[
OpenVPN允许参与建立VPN的单点使用共享金钥,电子证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库中的SSLv3 /TLSv1 协议函式库。OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。
虚拟私有网络(VPN)隧道是通过Internet隧道技术将两个不同地理位置的网络安全的连接起来的技术。当两个网络是使用私有IP地址的私有局域网络时,它们之间是不能相互访问的,这时使用隧道技术就可以使得两个子网内的主机进行通讯。例如,VPN隧道技术经常被用于大型机构中不同办公区域子网的连接。
有时,使用VPN隧道仅仅是因为它很安全。服务提供商与公司会使用这样一种方式架设网络,他们将重要的服务器(如,数据库,VoIP,银行服务器)放置到一个子网内,仅仅让有权限的用户通过VPN隧道进行访问。如果需要搭建一个安全的VPN隧道,通常会选用IPsec,因为IPsec VPN隧道被多重安全层所保护。
VPN (虚拟专用网)发展至今已经不在是一个单纯的经过加密的访问隧道了,它已经融合了访问控制、传输管理、加密、路由选择、可用性管理等多种功能,并在全球的信息安全体系中发挥着重要的作用。也在网络上,有关各种VPN协议优缺点的比较是仁者见仁,智者见智,很多技术人员由于出于使用目的考虑,包括访问控制、 安全和用户简单易用,灵活扩展等各方面,权衡利弊,难以取舍;尤其在VOIP语音环境中,网络安全显得尤为重要,因此现在越来越多的网络电话和语音网关支持VPN协议。
一. vpn分类
1. PPTP
点对点隧道协议 (PPTP) 是由包括微软和3Com等公司组成的PPTP论坛开发的一种点对点隧道协,基于拨号使用的PPP协议使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MPPE。其通过跨越基于 TCP/IP 的数据网络创建 VPN 实现了从远程客户端到专用企业服务器之间数据的安全传输。PPTP 支持通过公共网络(例如 Internet)建立按需的、多协议的、虚拟专用网络。PPTP 允许加密 IP 通讯,然后在要跨越公司 IP 网络或公共 IP 网络(如 Internet)发送的 IP 头中对其进行封装。
2. L2TP
第 2 层隧道协议 (L2TP) 是IETF基于L2F (Cisco的第二层转发协议)开发的PPTP的后续版本。是一种工业标准 Internet 隧道协议,其可以为跨越面向数据包的媒体发送点到点协议 (PPP) 框架提供封装。PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。PPTP只能在两端点间建立单一隧道。 L2TP支持在两端点间使用多隧道,用户可以针对不同的服务质量创建不同的隧道。L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP 或PPTP与IPSEC共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道使用L2TP。 PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接,L2TP可以在IP(使用UDP),桢中继永久虚拟电路 (PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。
3. IPSec
IPSec 的隧道是封装、路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有新的寻址与路由信息,从而使其能够通过网络传输。隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地后,会删除封装,原始数据包头用于将数据包路由到最终目的地。
4. SSLVPN
SSL协议提供了数据私密性、端点验证、信息完整性等特性。SSL协议由许多子协议组成,其中两个主要的子协议是握手协议和记录协议。握手协议允许服务器 和客户端在应用协议传输第一个数据字节以前,彼此确认,协商一种加密算法和密码钥匙。在数据传输期间,记录协议利用握手协议生成的密钥加密和解密后来交换 的数据。
SSL独立于应用,因此任何一个应用程序都可以享受它的安全性而不必理会执行细节。SSL置身于网络结构体系的传输层和应用层之间。此外,SSL本身就被几乎所有的Web浏览器支持。这意味着客户端不需要为了支持SSL连接安装额外的软件。这两个特征就是SSL能 应用于VPN的关键点。
二. 什么是VPN使用的隧道技术与隧道协议
VPN隧道所使用的公共网络可以是任何类型的通信网络。可以是Internet,也可以是企业内部网。为创建隧道,VPN的客户机和服务器必须使用相同的隧道协议,常用的隧道协议包括点对点隧道协议PPTP、第2层隧道协议L2TP和安全IP隧道模式IPSec。
按照开放系统互联OSI参考模型划分,隧道技术可以分为以第2层隧道协议为基础的技术和以第3层隧道协议为基础的技术。第2层隧道协议对应OSI模型中的数据链路层,使用帧作为数据传输单位。PPTP和L2TP协议属于第2层隧道协议,都是将数据封装在点对点协议(PPP)的帧中通过Internet发送。第3层隧道协议对应OSI模型中的网络层,使用包作为数据传输单位。安全IP隧道模式IPSec属于第3层隧道协议,是将数据包封装在附加了IP包头的新数据包中通过IP网络传送。
点对点隧道协议(PPTP,Point-to-PointTunnelingProtocol)将点对点协议(PPP,Point-to-PointProtocol)的数据帧封装进IP数据包中,通过TCP/IP网络进行传输。PPTP可以对IP、IPX或NetBEUI数据进行加密传递。PPTP通过PPTP控制连接来创建、维护和终止一条隧道,并使用通用路由封装(GRE,GenericRoutingEncapsulation)对PPP数据帧进行封装。封装前,PPP数据帧的有效载荷(有效传输数据)首先必须经过加密、压缩或是两者的混合处理。
第2层隧道协议(L2TP,LayerTwoTunnelingProtocol)是PPTP和第2层转发技术(L2F,LayerTwoForward)的结合。第2层转发是Cisco公司提出的隧道技术。为了避免PPTP和L2F两种互不兼容的隧道技术在市场上彼此竞争给用户造成困惑和带来不便,Internet工程任务委员会IETF要求将两种技术结合在单一隧道协议中,并在该协议中综合PPTP和L2F两者的优点,由此产生了L2TP。L2TP协议将PPP数据帧封装后,可通过TCP/IP、X.25、帧中继或ATM等网络进行传送。L2TP可以对IP、IPX或NetBEUI数据进行加密传递。目前,仅定义了基于TCP/IP网络的L2TP。L2TP隧道协议既可用于Internet,也可用于企业内部网。
为了实现在专用或公共IP网络上的安全传输,安全IP隧道模式IPSec使用安全方式封装和加密整个IP包。它首先对IP数据包进行加密,然后将密文数据包再次封装在明文IP包内,通过网络发送到接收端的VPN服务器。VPN服务器对收到的数据包进行处理,在去除明文IP包头,对内容进行解密之后,获得原始的IP数据包,再将其路由到目标网络的接收计算机。
在这三种隧道协议中,点对点隧道协议PPTP和第2层隧道协议L2TP的优点是对用微软公司操作系统的用户来说很方便,因为微软公司已把它们作为路由软件的一部分;缺点是PPTP和L2TP将不安全的IP数据包封装在安全的IP数据包内。PPTP和L2TP适用于远程访问虚拟专用网。安全IP隧道模式IPSec的优点是它定义了一套用于认证、保护私密和数据完整性的标准协议,缺点是微软公司对IPSec的支持不够。IPSec适用于可信的局域网之间的虚拟专用网,即企业内部网VPN应用。
OpenVPN
典型的SSL VPN应用如OpenVPN,是一个比较好的开源软件。PPTP主要为那些经常外出移动或家庭办公的用户考虑;而OpenVPN主要是针对企业异地两地总分公司之间的VPN不间断按需连接,例如ERP在企业中的应用。
OpenVPN 允许参与建立VPN的单点使用预设的私钥,第三方证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库,以及SSLv3/TLSv1 协议。OpenVPN能在Linux、xBSD、Mac OS X与Windows 2000/XP上运行。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。
隧道加密
OpenVPN使用OpenSSL库加密数据与控制信息:它使用了OpesSSL的加密以及验证功能,意味着,它能够使用任何OpenSSL支持的算法。它提供了可选的数据包HMAC功能以提高连接的安全性。此外,OpenSSL的硬件加速也能提高它的性能。
验证
OpenVPN提供了多种身份验证方式,用以确认参与连接双方的身份,包括:预享私钥,第三方证书以及用户名/密码组合。预享密钥最为简单,但同时它 只能用于建立点对点的VPN;基于PKI的第三方证书提供了最完善的功能,但是需要额外的精力去维护一个PKI证书体系。OpenVPN2.0后引入了用 户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密.
网络
OpenVPN所有的通信都基于一个单一的IP端口,默认且推荐使用UDP协议通讯,同时TCP也被支持。OpenVPN连接能通过大多数的代理服务 器,并且能够在NAT的环境中很好地工作。服务端具有向客户端“推送”某些网络配置信息的功能,这些信息包括:IP地址、路由设置等。OpenVPN提供 了两种虚拟网络接口:通用Tun/Tap驱动,通过它们,可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网络数据。传送的数 据可通过LZO算法压缩。IANA(Internet Assigned Numbers Authority)指定给OpenVPN的官方端口为1194。OpenVPN 2.0以后版本每个进程可以同时管理数个并发的隧道。
OpenVPN使用通用网络协议(TCP与UDP)的特点使它成为IPsec等协议的理想替代,尤其是在ISP(Internet service provider)过滤某些特定VPN协议的情况下。在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择 TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。
安全
OpenVPN与生俱来便具备了许多安全特性:它在用户空间运行,无须对内核及网络协议栈作修改; 初始完毕后以chroot方式运行,放弃root权限;使用mlockall以防止敏感数据交换到磁盘。
OpenVPN通过PKCS#11支持硬件加密标识,如智能卡。
三. 环境部署
操作系统:centos6.6
应用软件:openvpn,http(测试用),ntp,rsync或者scp(用来分发证书)
系统数量:3
具体应用:web(192.168.10.2)、vpn(eth0:192.168.10.1 eth1:20.20.20.1)client(20.20.20.2)
部署目标:client能够访问web。
前期准备:在配置网段的时候,前期要先把应用软件都装上,防止配置完ip无法连接yum,关闭selinux和iptables。
实现思路:
安装openvpn软件
CA配置
自签名证书
为 bj-vpnserver 签发证书
为 运维人员签发证书(可以复用)
四. 实际部署
安装软件(web,vpnserver,vpnclient)
web(略:yum安装,写个测试页,启动服务)
ip配置(略:详情请见ip具体应用)
[vpnserver and vpnclient]
[root@vpnserver ~]# yum -y install openvpn
[vpnserver]
[root@vpnserver /]# cd /usr/share/doc/openvpn-2.0.9/easy-rsa/ [root@vpnserver easy-rsa]# chmod +x * [root@vpnserver easy-rsa]# vim vars
export KEY_COUNTRY=CN
export KEY_PROVINCE=BJ
export KEY_CITY=BJ
export KEY_ORG="bj-vpnserver"
export KEY_EMAIL="test@126.com"
[root@vpnserver easy-rsa]# source vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /usr/share/doc/openvpn-2.0.9/easy-rsa/keys
[root@vpnserver easy-rsa]#
[root@vpnserver easy-rsa]# source vars
[root@vpnserver easy-rsa]# ./clean-all
[root@vpnserver easy-rsa]# ./build-ca //生成ca根私钥和根证书,别的选项都默认
Common Name (eg, your name or your server"s hostname) []:ca
[root@vpnserver easy-rsa]# ./build-key-server server 为服务器端生成证书和秘钥 [server 默认]
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) [bj-vpnserver]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server"s hostname) []:bj-server
Email Address [test@126.com]:
Please enter the following "extra" attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn-2.0.9/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:"BJ"
localityName :PRINTABLE:"BJ"
organizationName :PRINTABLE:"bj-vpnserver"
commonName :PRINTABLE:"bj-server"
emailAddress :IA5STRING:"test@126.com"
Certificate is to be certified until Jul 3 12:31:22 2026 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@vpnserver easy-rsa]#
2. vpnclient 签发证书
[root@bj-vpnserver easy-rsa]# ./build-key client1 //client1自定义证书名
Common Name (eg, your name or your server"s hostname) []:client1
3. 创建密钥协商文件 迪菲・赫尔曼密钥
[root@vpnserver easy-rsa]# ./build-dh [root@vpnserver easy-rsa]# ls keys/ 01.pem ca.key client1.key index.txt.attr serial server.csr 02.pem client1.crt dh1024.pem index.txt.attr.old serial.old server.key ca.crt client1.csr index.txt index.txt.old server.crt [root@vpnserver easy-rsa]# pwd /usr/share/doc/openvpn-2.0.9/easy-rsa [root@vpnserver easy-rsa]# cd keys/ [root@vpnserver keys]# cp ca.crt server.key server.crt dh1024.pem /etc/openvpn/ [root@vpnserver keys]# ls /etc/openvpn/ ca.crt dh1024.pem server.crt server.key [root@vpnserver keys]#
4. 修改openvpn
[root@vpnserver keys]# cp /usr/share/doc/openvpn-2.0.9/sample-config-files/server.conf /etc/openvpn/ [root@vpnserver keys]# vim /etc/openvpn/server.conf
local 20.20.20.1 //vpn服务器提供服务的IP
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0 //隧道tun网络
ifconfig-pool-persist ipp.txt
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
push "route 192.168.10.0 255.255.255.0" //为所有客户添加到北京内网1的路由
push "route 192.168.20.0 255.255.255.0" //为所有客户添加到北京内网2的路由
client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script
;push "redirect-gateway"
;push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option WINS 10.8.0.1"
;client-to-client
;duplicate-cn //是否允许证书复用
keepalive 10 120
;tls-auth ta.key 0 # This file is secret
;cipher BF-CBC # Blowfish (default)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
comp-lzo
max-clients 100
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 3
mute 20
5.开启路由转发
[root@bj-vpnserver ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@bj-vpnserver ~]# sysctl -p
6. 开启服务
[root@vpnserver ~]# service openvpn start [root@vpnserver ~]# chkconfig openvpn on
7. 查看ip
[root@vpnserver keys]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:d0:cd:4b:2d brd ff:ff:ff:ff:ff:ff inet 192.168.122.15/24 brd 192.168.122.255 scope global eth0 inet6 fe80::5054:d0ff:fecd:4b2d/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:fb:18:d2 brd ff:ff:ff:ff:ff:ff inet 20.20.20.1/24 brd 20.20.20.255 scope global eth1 inet6 fe80::5054:ff:fefb:18d2/64 scope link valid_lft forever preferred_lft forever
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/[65534]
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
8. 将client证书导入client
vpnclient
[root@vpnclient ~]# cp /usr/share/doc/openvpn-2.0.9/sample-config-files/client.conf /etc/openvpn/
vpnserver
[root@vpnserver keys]# scp ca.crt client1.crt client1.key root@20.20.20.2:/etc/openvpn/ The authenticity of host "20.20.20.2 (20.20.20.2)" can"t be established. RSA key fingerprint is e4:30:be:43:07:0d:0c:a4:87:60:84:38:f8:ac:b8:04. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added "20.20.20.2" (RSA) to the list of known hosts. root@20.20.20.2"s password: ca.crt 100% 1139 1.1KB/s 00:00 client1.crt 100% 3405 3.3KB/s 00:00 client1.key 100% 916 0.9KB/s 00:00 [root@vpnserver keys]# [root@vpnclient ~]# ls /etc/openvpn/ ca.crt client1.crt client1.key client.conf
9. 配置vpnclient配置文件
[root@vpnclient ~]# ls /etc/openvpn/ ca.crt cd-client1.crt cd-client1.key [root@vpnclient ~]# vim /etc/openvpn/client.conf client dev tun ;dev-node MyTap proto udp remote 20.20.20.1 1194 //拨号地址==》vpnserver ;remote-random nobind user nobody group nobody persist-key persist-tun ;http-proxy-retry # retry on connection failures ;http-proxy [proxy server] [proxy port #] ;mute-replay-warnings ca ca.crt cert cd-client1.crt key cd-client1.key ;ns-cert-type server ;tls-auth ta.key 1 ;cipher x comp-lzo verb 3 mute 20
10. vpnclient启动
root@vpnclient openvpn]# service openvpn restart Shutting down openvpn: [ OK ] Starting openvpn: [ OK ] [root@vpnclient openvpn]# chkconfig openvpn on
注:证书错误启动会出错。
11.查看ip
[root@vpnclient openvpn]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:f0:af:44:0f brd ff:ff:ff:ff:ff:ff inet 20.20.20.2/24 brd 20.20.20.255 scope global eth0 inet6 fe80::5054:f0ff:feaf:440f/64 scope link valid_lft forever preferred_lft forever
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/[65534]
inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0
12. 测试
[root@vpnclient openvpn]# curl 192.168.10.2 web test
五. windows访问
安装openvpn
openvpn-install-X.X.X.X-x86_64.exe
2.证书文件 ca.crt cd-client1.crt cd-client1.key导入
C:\Program Files\OpenVPN\config
3. 建立配置文件
默认不存在,需要去上层目录去寻找
C:\Program Files\OpenVPN\config\client.ovpn client dev tun proto udp remote 20.20.20.1 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert cd-client2.crt key cd-client2.key ns-cert-type server cipher BF-CBC comp-lzo verb 3 mute 20
client.ovpn目录sample-config
正常启动过程
双击桌面图标,就可以访问了,如果需要连接多个vpn,就需要重复上述步骤,并且把.ovpn的文件复制并改名,然后修改配置文件内容就可以了,如果连接不上可能是ntp有问题。
上一篇:无