项目课---OpVEN架构实施方案(七)

VPN介绍

 

VPN概述

VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的连接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现。

为了便于大家理解,给一个直观的形象图:

image_1cs6slj71j8a6th19td1a31l1s9.png-135.2kB

 

VPN的作用

VPN功能可以帮助公司里的远程用户(出差,家里),公司的分支机构,商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者是局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网,处理相关的业务流。我们可以通过一张网络逻辑图为同学们描述VPN的作用。

image_1cs6smd14jjr1ehqf7hi6a14sfm.png-482.9kB

 

VPN的分类

我们根据VPN的常见企业应用,将VPN分为以下4类应用

(1)远程访问VPN服务

即通过个人电脑远程拨号到企业办公网络。

a.一般为企业内部员工出差,休假或特殊情况下在远离办公室的时候,又有需求访问公司的内部网络获取相关资源,就可以通过VPN拨号到公司内部。此时远程拨号的员工和办公室内的员工以及其他拨号的员工之间都相当于一个局域网络内。例如:访问内部的域控制器,文件服务器,OA系统,ERP,HTTP服务,内网飞秋聊天工具等局域网服务应用。

image_1cs6snmaf11d816m91osg1673h513.png-101.2kB

对于运维人员来说就是需要个人电脑远程拨号到企业网站IDC机房,远程维护IDC服务器。

此点是技术人员特别是运维人员在工作中会经常用这个方法维护大量的机房内无外网的服务器及网络设备。

(2)企业内部网络之间VPN服务

在公司的分支机构的局域网和公司总部LAN之间的VPN连接。通过公网Internet建立VPN将公司在各地的分支机构的LAN链接到公司总部的LAN。例如:各大超市之间业务结算等。

这是由于地域的原因而产生的VPN的需求,通过VPN让不同地域内的机器可以互相访问,就好像是一个局域网一样。例如:办公室互联协同办公,机房互联数据同步及业务访问等。

(3)互联网公司多IDC机房之间VPN服务

此处是运维架构人员需要考虑的问题。不同机房之间业务管理和业务访问,数据流动。

(4)企业外部VPN服务

在供应商,合作伙伴的LAN和本公司的LAN之间建立的VPN服务。

(5)访问国外的网站

FQ业务应用

 

常见隧道协议介绍

(1)PPTP

点对点隧道协议(PPTP)是由包括微软和3Com等公司组成的PPTP论坛开发的一种点对点隧道协议,基于拨号使用的PPTP协议,使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MPPE。其通过跨越基于TCP/IP的数据网络创建VPN实现了从远程客户端到专用企业服务器之间数据的安全传输。PPTP支持通过公共网络(例如Internet)建立按需的,多协议的,虚拟专用网络。PPTP允许加密IP通讯,然后在要跨越公司IP网络或公共IP网络(如Internet)发送的IP头中对其进行封装。典型的linux平台的开源软件为pptp。

PPTP属于点对点方式的应用,比较适合远程的企业用户拨号到企业进行办公等的应用

(2)L2TP

L2TP第2层隧道协议(L2TP)是LETF基于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

IP安全协议(IPSec:IP Security)实际上是一套协议包而不是一个独立的协议。从1995年开始IPSec的研究以来,IETF IPSec 工作组在它的主页上发布了几十个Internet草案文献和12个RFC文件。其中,比较重要的有RFC2409IKE(互联网密钥交换),RFC2401 IPSec协议,RFC2402 AH验证包头,RFC2406 ESP加密数据等文件。

IPSec隧道模式隧道是封装,路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有细心的寻址与路由信息,从而使其能够通过网络传输。隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地后,会删除封装,原始数据包头用于将数据包路由到最终目的地。

隧道本身是封装数据经过的逻辑数据路径,对原始的源和目的端,隧道是不可见的,而只能看到网络路径中的点对点连接。连接双方并不关心隧道起点和终点之间的任何路由器,交换机,代理服务器或者其他安全网关。将隧道和数据保密性结合使用时,可用于提供VPN。

封装的数据包在网络中的隧道内部传输。在此示例中,该网络是Internet。网关可以是外部Internet与专用网络间的周界网关。周界网关可以是路由器,防火墙,代理服务器或其他安全网关。另外,在专用网络内部可使用两个网关来保护网络中不信任的通讯。

当以隧道模式使用IPSec时,其只为IP通讯封装。使用IPSec隧道模式主要是为了与其他不支持IPSec上的L2TP或PPTP VPN隧道技术的路由器,网关或终端系统之间的相互操作。

(4)SSL VPN

SSL VPN,SSL协议提供了数据私密性,端点验证,信息完整性等特性。SSL协议由许多子协议组成,其中两个主要的子协议是握手协议和记录协议。握手协议允许服务器和客户端在应用协议传输第一个数据字节以前,彼此确认,协商一种加密算法和密码钥匙。在数据传输期间,记录协议利用握手协议生成的密钥加密和解密后来交换的数据。

SSL独立于应用,因此任何一个应用程序都可以享受它的安全性而不必理会执行细节。SSL置身于网络结构体系的传输层和应用层之间。此外,SSL本身就被几乎所有的Web浏览器支持。这意味着客户端不需要为了支持SSL连接安装额外的软件。这两个特征就是SSL能应用于VPN的关键点。

典型的SSL VPN应用如OpenVPN,是一个比较好的开源软件。OpenVPN允许参与建立VPN的单点使用预设的私钥,第三方证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库,以及SSLv3/TLSv1协议。OpenVPN能在Linux,xBSD,Mac OSX与Windows 2000/XP上运行.它并不是一个基于Web的VPN软件,也不与IPSec及其他VPN软件包兼容,C/S架构的软件,单独安装openvpn客户端。

image_1cs6stv275ub1r011ur6s9e1gar1g.png-549.8kB

 

实现vpn功能的常见开源产品

(1)PPTP VPN

使用PPTP VPN的最大优势在于,无需在windows客户端单独安装客户端软件,windows默认就支持PPTP VPN拨号连接功能。另外,PPTP VPN属于点对点方式的应用,比较适合远程的企业用户拨号到企业进行办公等的应用。

(2)SSL VPN(OpenVPN)

PPTP主要为那些经常外出移动或家庭办公的用户考虑,而OpenVPN不但使用于PPTP的应用场景,还适合针对企业异地两地总分公司之间的VPN不间断按需连接,例如:ERP,OA,及时通讯工具等在企业中的应用。

(3)IPSec VPN

IPSec VPN也适合针对企业异地两地总分公司或多个IDC机房之间的VPN不间断按需连接,并且在部署使用上更简单方便。

 

根据企业生产场景需求选择vpn方案建议

如果领导愿意花钱,可以选择相关硬件产品,不错的成熟的很多,例如:防火墙,负载均衡等硬件产品都附带VPN功能。

对于多数互联网公司,为了体现我们运维架构师的价值,我们应该建议老板选择开源产品,优势就是省钱,可扩展性更强,例如:二次开发,相应的改动。

1.对于开源的产品,Mr.chen建议:个人拨号选择openvpn,功能强大,稳定可靠。 
2.如果不希望单独安装客户端拨号,则可选择PPTP 
3.多个企业之间或者多个IDC机房直接互联,选择ipsecvpn或openvpn。

本课程所讲解的:openvpn,ipsec vpn的完整企业实现。可以满足各种企业需求。

 

openvpn开源产品

 

openvpn产品介绍

在众多vpn产品中,OpenVPN无疑是Linux下开源VPN的先锋,它提供了良好的访问性能和友好的用户GUI。

OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许参与建立VPN的单点使用预设的私钥,第三方证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库,以及SSLv3/TLSv1协议。OpenVPN能在Linux,xBSD,MacOS X与Windows上运行。Openvpn是一个服务器和客户端软件,而不是一个基于Web的VPN软件,也不与IPSec及其他VPN软件包兼容。

 

openvpn依赖的SSL与TLS协议介绍

SSL即,安全套接层(Secure Sockets Layer,SSL)是一种安全协议,诞生的目的是为网络通信提供安全及数据完整性保障,SSL在传输层中对网络通信进行加密。

SSL采用公开密钥技术,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。它在服务器和客户机两端可同时被支持,目前已成为互联网上保密通讯的工业标准。现行的Web浏览器亦普遍将HTTP和SSL相结合1,从而实现安全通信。SSL协议其继任者是TLS。

后来IETF(www.ietf.org)将SSL作了标准化,即RFC2246,并将其称为TLS(Transport Layer Security),其最新版本是RFC5246,版本1.2。从技术上讲,TLS1.0与SSL3.0的差异非常微小。

TLS(Transport Layer Security)利用密钥算法在互联网上提供端点身份认证与通讯保密,其基础是公钥基础设施(public key infrastructure,PKI)。不过在实现的典型例子中,只有网络服务者被可靠身份验证,而其客户端则不一定。这是因为公钥基础设施普遍商业运营,电子签名证书通常需要付费购买。协议的设计在某种程度上能够使主从架构应用程序通讯本身防窃听,干扰(Tampering)和消息伪造。

 

openvpn的加密通信原理过程

OpenVPN使用TLS加密是通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Public key,另一个是Private key)对数据进行加密的,对于TLS传输的工作原理,这里暂且先不介绍。对于OpenVPN使用TLS_mode,首先Server和Client要有相同CA签发的证书,双方通过交换证书验证双方的合法性以决定是否建立VPN连接,然后使用对方CA把自己目前使用的数据加密方法(类似于密钥)加密后发送给对方,由于使用对方CA加密的,所以只有对方CA对应的Private key才能解密该字串,保证了此密钥的安全性,并且此密钥定期改变,对于窃听者来说,可能还没有破解出密钥,通信双方已经更换密钥了。

 

openvpn的多种身份验证方式

OpenVPN提供了多种身份验证方式,用以确认参与连接双方的身份,包括:预享私钥,第三方证书以及用户名/密码组合等。预享密钥最为简单,但同时它只能用于建立点对点的VPN;基于PKI的第三方证书提供了最完善的功能,但是需要额外的精力去维护一个PKI证书体系。OpenVPN2.0后引入了用户名/口令组合的身份验证方式,他可以省略客户端预享密钥,但是仍有一份服务器CA证书需要被用作加密,比较好的验证方式还有LDAP统一验证等。

 

openvpn通信原理

OpenVPN所有的通信都基于一个单一的IP端口(默认为1194),默认使用UDP协议通讯,同时TCP也被支持。OpenVPN连接能通过大多数的代理服务器,并且能够在NAT的环境中很好地工作。OpenVPN服务端具有向客户端“推送”某些网络配置信息的功能,这些信息包括:IP地址,路由设置等。OpenVPN提供了两种虚拟网络接口:通用Tun/Tap驱动,通过它们,可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网络数据。传送的数据可通过LZO算法压缩。OpenVPN2.0以后版本每个进程可以同时管理数个并发的隧道。

OpenVPN使用通用网络协议(TCP与UDP)的特点使它成为IPsec等协议的理想替代1,尤其是在ISP(Internet server provider)过滤某些特定VPN协议的情况下。

在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。这里建议用TCP协议方式。

参考资料: 
http://www.baike.com/wiki/OpenVPN 
http://zh.wikipedia.org/zh-cn/OpenVPN

OpenVPN的技术核心是虚拟网卡,其次是SSL协议实现,SSL协议前面已阐述过,这里重点对虚拟网卡及其在OpenVpn中的工作机理进行介绍:

虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出一个网卡,可以像其他网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如IE)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是OpenVPN能够跨平台一个很重要的理由。

在OpenVPN中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作性系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过SOCKET从外网上发送出去,远程服务程序通过SOCKET从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。

OpenVPN使用OpenSSL库加密数据与控制信息:它使用了OpenSSL的加密以及验证功能,意味着,它能够使用任何OpenSSL支持的算法。它提供了可选的数据包HMAC功能以提高连接的安全性。此外,OpenSSL的硬件加速也能提高它的性能。

(1)openvpn驱动部分实现了网卡处理和字符设备。网卡处理网络数据,字符设备完成与应用层的数据交互。

(2)使用openvpn必须修改路由表

工作过程,发送数据

1,应用程序发送网络数据 
2,网络数据根据修改后的路由表把数据路由到虚拟网卡 
3,虚拟网卡把数据放到数据队列中 
4,字符设备从数据队列中取数据,然后送给应用层 
5,应用层把数据转发给物理网卡 
6,物理网卡发送数据

接收过程

1,物理网卡接收到数据,并传到应用空间。 
2,应用守护程序通过字符设备,把数据传给驱动网卡。 
3,数据通过虚拟网卡重新进入网络堆栈。 
4,网络堆栈把数据传给上层真实的应用程序。

 

openvpn生产环境常用场景

(1)远程拨号访问企业网络或IDC机房

用的最多的场景

(2)企业异地内部网络通过VPN连接成局域网

image_1cs6t86mgpeqsb5srb1u9be581t.png-101.2kB

(3)互联网公司多IDC机房之间通过VPN连接交换数据

此处是运维架构人员需要考虑的问题。不同机房之间业务管理和业务访问,数据流动。

(4)企业外部VPN服务

在供应商,合作伙伴的LAN和本公司的LAN之间建立的VPN服务。 
从技术上来说,2,3,4的实现是一样的。

 

OpenVPN生产环境需求及环境模拟

环境需求

image_1cs6tbarlskvbm11t104tcl034.png-18kB

实现需求: 
在远端通过VPN客户端(笔记本)拨号到VPNserver,然后可以直接访问VPNServer所在局域网内的多个servers,进行管理维护。

 
 

openvpn实验初始环境搭建

(1)网关ADSL服务器初始搭建环境

image_1cs6tdbst16rp50uta54l15o84b.png-7kB

模拟网关的ADSL,并没有设置网关,因为它的eth0网卡,模拟的本身就是公网的IP了。因为是测试环境所以网关ADSL的eth0网卡可以直接ping到VPNServer的eth0(同网段),因此ADSL就不需要在设置网关了。在真实环境中,它是需要设置网关(上级路由器的),但由于VPNServer的eth0网卡在真实环境中也是公网IP,也会设置网关(上级路由器)。因此,在公网环境中就算ADSL的公网IP和VPNServer的公网IP不在同一网段,那么上级路由器仍旧可以帮你将数据包发给对方(路由转发规则)。

综上,我们模拟的公网环境直接设置成同网段即可。

 
  1. [root@ADSL ~]# ifconfig eth0 #查看eth0网卡IP
  2. eth0 Link encap:Ethernet HWaddr 00:0C:29:B5:8C:08
  3. inet addr:192.168.0.200 Bcast:192.168.0.255 Mask:255.255.255.0
  4. inet6 addr: fe80::20c:29ff:feb5:8c08/64 Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  6. RX packets:1969 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:123 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:144896 (141.5 KiB) TX bytes:12435 (12.1 KiB)
  10. [root@ADSL ~]# ifconfig eth1 #查看eth1网卡IP
  11. eth1 Link encap:Ethernet HWaddr 00:0C:29:B5:8C:12
  12. inet addr:192.168.100.200 Bcast:192.168.100.255 Mask:255.255.255.0
  13. inet6 addr: fe80::20c:29ff:feb5:8c12/64 Scope:Link
  14. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  15. RX packets:479 errors:0 dropped:0 overruns:0 frame:0
  16. TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
  17. collisions:0 txqueuelen:1000
  18. RX bytes:43346 (42.3 KiB) TX bytes:2302 (2.2 KiB)
  19. [root@ADSL ~]# route -#查看路由规则(没有GW)
  20. Kernel IP routing table
  21. Destination Gateway Genmask Flags Metric Ref Use Iface
  22. 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  23. 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  24. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  25. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  26. [root@ADSL ~]# sysctl -#开启Linux网卡转发
  27. net.ipv4.ip_forward = 1 #已经开启
  28. net.ipv4.conf.default.rp_filter = 1
  29. net.ipv4.conf.default.accept_source_route = 0
  30. kernel.sysrq = 0
  31. kernel.core_uses_pid = 1
  32. net.ipv4.tcp_syncookies = 1
  33. error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  34. error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  35. error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  36. kernel.msgmnb = 65536
  37. kernel.msgmax = 65536
  38. kernel.shmmax = 68719476736
  39. kernel.shmall = 4294967296

(2)VPNServer服务器初始搭建环境

image_1cs6tegubt601vv11npp3ah71o4o.png-6.9kB

模拟IDC机房的VPNServer,也没有设置网关,因为它的eth0网卡,模拟的本身就是公网的IP了。所以,设置同网段即可。

至于eth1网卡模拟的是IDC机房的内网环境,由于VPNServer并不是正常的网关内网出口,用户的URL请求是不会通过VPNServer的公网网卡进来的,所以我们的模拟环境就不需要设置网关了。在真实环境中,IDC机房的内网环境是会有真正的网关出口的(会有一台作为内网出到公网的出口。用户URL也是从那里进来的)

 
  1. [root@localhost ~]# ifconfig eth0 #查看eth0网卡IP
  2. eth0 Link encap:Ethernet HWaddr 00:0C:29:87:B8:AF
  3. inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
  4. inet6 addr: fe80::20c:29ff:fe87:b8af/64 Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  6. RX packets:2136 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:154 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:157244 (153.5 KiB) TX bytes:13765 (13.4 KiB)
  10. [root@localhost ~]# ifconfig eth1 #查看eth1网卡IP
  11. eth1 Link encap:Ethernet HWaddr 00:0C:29:87:B8:B9
  12. inet addr:192.168.200.100 Bcast:192.168.200.255 Mask:255.255.255.0
  13. inet6 addr: fe80::20c:29ff:fe87:b8b9/64 Scope:Link
  14. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  15. RX packets:2544 errors:0 dropped:0 overruns:0 frame:0
  16. TX packets:86 errors:0 dropped:0 overruns:0 carrier:0
  17. collisions:0 txqueuelen:1000
  18. RX bytes:171207 (167.1 KiB) TX bytes:7121 (6.9 KiB)
  19. [root@localhost ~]# route -#查看路由规则(没有网关)
  20. Kernel IP routing table
  21. Destination Gateway Genmask Flags Metric Ref Use Iface
  22. 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  23. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  24. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  25. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  26. [root@localhost ~]# sysctl -#查看网卡转发情况
  27. net.ipv4.ip_forward = 1 #已开启转发
  28. net.ipv4.conf.default.rp_filter = 1
  29. net.ipv4.conf.default.accept_source_route = 0
  30. kernel.sysrq = 0
  31. kernel.core_uses_pid = 1
  32. net.ipv4.tcp_syncookies = 1
  33. error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  34. error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  35. error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  36. kernel.msgmnb = 65536
  37. kernel.msgmax = 65536
  38. kernel.shmmax = 68719476736
  39. kernel.shmall = 4294967296

(3)企业内网PC(windows 7)

image_1cs6tfpg218b2cq31ist1fvtap855.png-4.9kB

和ADSL的内网卡同网段,并设置ADSL内网网卡为网关即可。 
模拟企业公司的办公内网环境

image_1cs6tgahe1u3d1neiho1iv31g8j5i.png-171.7kB

提示: 
注意关闭windows7的防火墙

(4)IDC内网跳板机

image_1cs6th3li1lh04rq1tak1bf0101c6f.png-4.8kB

模拟IDC机房的内网跳板机,运维人员通过VPNServer服务器DNAT到本内网服务器,然后在通过跳板机连到其他内网服务器。

 
  1. [root@localhost ~]# ifconfig eth0 #查看网卡IP
  2. eth0 Link encap:Ethernet HWaddr 00:0C:29:F6:3F:B5
  3. inet addr:192.168.200.200 Bcast:192.168.200.255 Mask:255.255.255.0
  4. inet6 addr: fe80::20c:29ff:fef6:3fb5/64 Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  6. RX packets:3350 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:225903 (220.6 KiB) TX bytes:11485 (11.2 KiB)
  10. [root@localhost ~]# route -#查看路由规则(无GW信息)
  11. Kernel IP routing table
  12. Destination Gateway Genmask Flags Metric Ref Use Iface
  13. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  14. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
 

配置VPN服务器的时间同步(在学校环境下不用做此步骤)

 
  1. #给VPN服务器的外网网卡添加网关和DNS信息
  2. [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
  3. DEVICE=eth0
  4. TYPE=Ethernet
  5. ONBOOT=yes
  6. NM_CONTROLLED=yes
  7. BOOTPROTO=none
  8. IPADDR=192.168.0.100
  9. NETMASK=255.255.255.0
  10. GATEWAY=192.168.0.1
  11. DNS1=192.168.0.1
  12. [root@localhost ~]# ifdown eth0;ifup eth0 #重启网卡
  13. Determining if ip address 192.168.0.100 is already in use for device eth0...
  14. [root@localhost ~]# route -n
  15. Kernel IP routing table
  16. Destination Gateway Genmask Flags Metric Ref Use Iface
  17. 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  18. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  19. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  20. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  21. 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 #网关信息
  22. [root@localhost ~]# cat /etc/resolv.conf #查看DNS信息
  23. nameserver 192.168.0.1
  24. [root@localhost ~]# mount /dev/sr0 /media/cdrom/ #挂载光盘
  25. mount: block device /dev/sr0 is write-protected, mounting read-only
  26. [root@localhost ~]# yum -y install ntpdate #安装ntpdate
  27. #手动执行如下命令:
  28. [root@localhost ~]# /usr/sbin/ntpdate ntp1.aliyun.com #时间同步
  29. [root@localhost ~]# date +%Y-%m-%d-%H-%#查看系统时间
  30. #写入定时任务
  31. [root@localhost ~]# echo "* * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null" >> /var/spool/cron/root
  32. [root@localhost ~]# crontab -l
  33. * * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null

特别提示: 
如果同学们遇到同步以后时间始终和真实时间对应不上; 
那么可能是Linux时区的设置有误 
我们只需要执行/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime命令即可

 

openvpn生产环境实战

 

OpenVPN所需软件

 
  1. [root@localhost ~]# ls -l lzo-2.06.tar.gz openvpn-2.2.2.tar.gz
  2. -rw-r--r--. 1 root root 583045 Nov 13 23:00 lzo-2.06.tar.gz
  3. -rw-r--r--. 1 root root 1225636 Nov 13 23:00 openvpn-2.2.2.tar.gz
 

安装lzo压缩模块

wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz

 
  1. [root@localhost ~]# tar xf lzo-2.06.tar.gz -/usr/src/
  2. [root@localhost ~]# cd /usr/src/lzo-2.06/
  3. [root@localhost lzo-2.06]# ./configure
  4. [root@localhost lzo-2.06]# make && make install
 

安装openvpn软件

 
  1. [root@localhost openvpn-2.2.2]# yum -y install openssl-devel pam-devel
  2. [root@localhost ~]# tar xf openvpn-2.2.2.tar.gz -/usr/src/
  3. [root@localhost ~]# cd /usr/src/openvpn-2.2.2/
  4. [root@localhost openvpn-2.2.2]# ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
  5. [root@localhost openvpn-2.2.2]# make && make install
  6. [root@localhost src]# which openvpn
  7. /usr/local/sbin/openvpn
 

配置openvpn server-建立CA(Certificate Authority)证书

初始化配置命令

 
  1. [root@localhost ~]# cd /usr/src/openvpn-2.2.2/easy-rsa/2.0/
  2. [root@localhost 2.0]# cp vars vars.bak.2017-11-14
  3. #修改证书文件vars最后的11行信息
  4. [root@localhost 2.0]# tail -11 vars
  5. export KEY_COUNTRY="US" #国家
  6. export KEY_PROVINCE="CA" #省份
  7. export KEY_CITY="SanFrancisco" #城市
  8. export KEY_ORG="Fort-Funston" #组织
  9. export KEY_EMAIL="[email protected]" #邮件地址
  10. export KEY_EMAIL=mail@host.domain #邮件地址
  11. export KEY_CN=changeme #国家
  12. export KEY_NAME=changeme #名字
  13. export KEY_OU=changeme #名字
  14. export PKCS11_MODULE_PATH=changeme
  15. export PKCS11_PIN=1234
  16. #修改成如下信息即可
  17. [root@localhost 2.0]# tail -11 vars
  18. export KEY_COUNTRY="CN"
  19. export KEY_PROVINCE="BJ"
  20. export KEY_CITY="Beijing"
  21. export KEY_ORG="yunjisuan"
  22. export KEY_EMAIL="[email protected]" #换成同学们的邮箱
  23. export KEY_EMAIL=215379068@qq.com #换成同学们的邮箱
  24. export KEY_CN=CN
  25. export KEY_NAME=yunjisuan
  26. export KEY_OU=yunjisuan
  27. export PKCS11_MODULE_PATH=changeme
  28. export PKCS11_PIN=1234
  29. #提示:下面在建立证书时,会提示上面配置的内容,直接回车即可
  30. #让vars文件,source vars生效一下
  31. [root@localhost 2.0]# source vars
  32. NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/src/openvpn-2.2.2/easy-rsa/2.0/keys
  33. [root@localhost 2.0]# ./clean-all #根据提示清空所有证书相关
  34. [root@localhost 2.0]# ./build-ca
  35. Generating a 1024 bit RSA private key
  36. ..............++++++
  37. ...........................++++++
  38. writing new private key to 'ca.key'
  39. -----
  40. You are about to be asked to enter information that will be incorporated
  41. into your certificate request.
  42. What you are about to enter is what is called a Distinguished Name or a DN.
  43. There are quite a few fields but you can leave some blank
  44. For some fields there will be a default value,
  45. If you enter '.', the field will be left blank.
  46. -----
  47. Country Name (2 letter code) [CN]: #直接回车
  48. State or Province Name (full name) [BJ]: #直接回车
  49. Locality Name (eg, city) [Beijing]: #直接回车
  50. Organization Name (eg, company) [yunjisuan]: #直接回车
  51. Organizational Unit Name (eg, section) [yunjisuan]: #直接回车
  52. Common Name (eg, your name or your server's hostname) [CN]:yunjisuan #输入yunjisuan
  53. Name [yunjisuan]: #直接回车
  54. Email Address [[email protected]]: #直接回车
  55. [root@localhost 2.0]# ll keys/ #查看证书
  56. total 12
  57. -rw-r--r--. 1 root root 1334 Nov 14 00:20 ca.crt #证书
  58. -rw-------. 1 root root 916 Nov 14 00:20 ca.key #私钥
  59. -rw-r--r--. 1 root root 0 Nov 14 00:20 index.txt
  60. -rw-r--r--. 1 root root 3 Nov 14 00:20 serial
 

生成服务器端证书和密钥key文件

 
  1. [root@localhost 2.0]# ./build-key-server server #生成服务器端证书,第二个server是文件名
  2. Generating a 1024 bit RSA private key
  3. .......................++++++
  4. .......++++++
  5. writing new private key to 'server.key'
  6. -----
  7. You are about to be asked to enter information that will be incorporated
  8. into your certificate request.
  9. What you are about to enter is what is called a Distinguished Name or a DN.
  10. There are quite a few fields but you can leave some blank
  11. For some fields there will be a default value,
  12. If you enter '.', the field will be left blank.
  13. -----
  14. Country Name (2 letter code) [CN]: #直接回车
  15. State or Province Name (full name) [BJ]: #直接回车
  16. Locality Name (eg, city) [Beijing]: #直接回车
  17. Organization Name (eg, company) [yunjisuan]: #直接回车
  18. Organizational Unit Name (eg, section) [yunjisuan]: #直接回车
  19. Common Name (eg, your name or your server's hostname) [server]: #直接回车
  20. Name [yunjisuan]: #直接回车
  21. Email Address [[email protected]]: #直接回车
  22. Please enter the following 'extra' attributes
  23. to be sent with your certificate request
  24. A challenge password []:666666 #输入验证密码
  25. An optional company name []:yunjisuan #输入公司名
  26. Using configuration from /usr/src/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.cnf
  27. Check that the request matches the signature
  28. Signature ok
  29. The Subject'Distinguished Name is as follows
  30. countryName :PRINTABLE:'CN'
  31. stateOrProvinceName :PRINTABLE:'BJ'
  32. localityName :PRINTABLE:'Beijing'
  33. organizationName :PRINTABLE:'yunjisuan'
  34. organizationalUnitName:PRINTABLE:'yunjisuan'
  35. commonName :PRINTABLE:'server'
  36. name :PRINTABLE:'yunjisuan'
  37. emailAddress :IA5STRING:'[email protected]'
  38. Certificate is to be certified until Nov 11 16:33:24 2027 GMT (3650 days)
  39. Sign the certificate? [y/n]:#输入y
  40. 1 out of 1 certificate requests certified, commit? [y/n]#输入y
  41. Write out database with 1 new entries
  42. Data Base Updated
  43. #查看生成的证书信息
  44. [root@localhost 2.0]# ll keys/
  45. total 40
  46. -rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
  47. -rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
  48. -rw-------. 1 root root 916 Nov 14 00:29 ca.key
  49. -rw-r--r--. 1 root root 130 Nov 14 00:33 index.txt7
  50. -rw-r--r--. 1 root root 21 Nov 14 00:33 index.txt.attr
  51. -rw-r--r--. 1 root root 0 Nov 14 00:29 index.txt.old
  52. -rw-r--r--. 1 root root 3 Nov 14 00:33 serial
  53. -rw-r--r--. 1 root root 3 Nov 14 00:29 serial.old
  54. -rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt #服务器端证书
  55. -rw-r--r--. 1 root root 785 Nov 14 00:33 server.csr #服务器端证书
  56. -rw-------. 1 root root 916 Nov 14 00:33 server.key #服务器端密钥
 

生成客户端证书和key文件

生成client证书和key文件。若建立多个客户证书,则重复如下步骤即可。只需要修改Common Name项yunjisuan的名称。

在openvpn中,这种配置方法是每一个登录的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接(如果有两个机器安装相同证书,同时拨服务器,都能拨上,但是只有第一个拨上的才能连通网络)。所以,如果有多个人,每个人需要建立一份证书(建立一7份证书多人使用的情况在后文中会讲到)。

下面建立2份客户端证书,名称分别为chensiqi和benet,操作过程如下:

 
  1. [root@localhost 2.0]# ./build-key chensiqi #生成客户端私钥,chensiqi为私钥的文件名
  2. Generating a 1024 bit RSA private key
  3. .....++++++
  4. .....++++++
  5. writing new private key to 'chensiqi.key'
  6. -----
  7. You are about to be asked to enter information that will be incorporated
  8. into your certificate request.
  9. What you are about to enter is what is called a Distinguished Name or a DN.
  10. There are quite a few fields but you can leave some blank
  11. For some fields there will be a default value,
  12. If you enter '.', the field will be left blank.
  13. -----
  14. Country Name (2 letter code) [CN]: #直接回车
  15. State or Province Name (full name) [BJ]: #直接回车
  16. Locality Name (eg, city) [Beijing]: #直接回车
  17. Organization Name (eg, company) [yunjisuan]: #直接回车
  18. Organizational Unit Name (eg, section) [yunjisuan]: #直接回车
  19. Common Name (eg, your name or your server's hostname) [chensiqi]: #直接回车
  20. Name [yunjisuan]: #直接回车
  21. Email Address [[email protected]]: #直接回车
  22. Please enter the following 'extra' attributes
  23. to be sent with your certificate request
  24. A challenge password []:666666 #设定密码
  25. An optional company name []:yunjisuan #设定公司名称
  26. Using configuration from /usr/src/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.cnf
  27. Check that the request matches the signature
  28. Signature ok
  29. The Subject'Distinguished Name is as follows
  30. countryName :PRINTABLE:'CN'
  31. stateOrProvinceName :PRINTABLE:'BJ'
  32. localityName :PRINTABLE:'Beijing'
  33. organizationName :PRINTABLE:'yunjisuan'
  34. organizationalUnitName:PRINTABLE:'yunjisuan'
  35. commonName :PRINTABLE:'chensiqi'
  36. name :PRINTABLE:'yunjisuan'
  37. emailAddress :IA5STRING:'[email protected]'
  38. Certificate is to be certified until Nov 12 12:48:43 2027 GMT (3650 days)
  39. Sign the certificate? [y/n]:#输入y
  40. 1 out of 1 certificate requests certified, commit? [y/n]#输入y
  41. Write out database with 1 new entries
  42. Data Base Updated
  43. [root@localhost 2.0]# ll keys/
  44. total 64
  45. -rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
  46. -rw-r--r--. 1 root root 3964 Nov 14 20:48 02.pem
  47. -rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
  48. -rw-------. 1 root root 916 Nov 14 00:29 ca.key
  49. -rw-r--r--. 1 root root 3964 Nov 14 20:48 chensiqi.crt #用户私钥文件
  50. -rw-r--r--. 1 root root 790 Nov 14 20:48 chensiqi.csr #用户私钥文件
  51. -rw-------. 1 root root 916 Nov 14 20:48 chensiqi.key #用户私钥文件
  52. -rw-r--r--. 1 root root 262 Nov 14 20:48 index.txt
  53. -rw-r--r--. 1 root root 21 Nov 14 20:48 index.txt.attr
  54. -rw-r--r--. 1 root root 21 Nov 14 00:33 index.txt.attr.old
  55. -rw-r--r--. 1 root root 130 Nov 14 00:33 index.txt.old
  56. -rw-r--r--. 1 root root 3 Nov 14 20:48 serial
  57. -rw-r--r--. 1 root root 3 Nov 14 00:33 serial.old
  58. -rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt
  59. -rw-r--r--. 1 root root 785 Nov 14 00:33 server.csr
  60. -rw-------. 1 root root 916 Nov 14 00:33 server.key
  61. #继续生成benet用户的私钥
  62. [root@localhost 2.0]# ./build-key benet #私钥名称benet
  63. Generating a 1024 bit RSA private key
  64. .........................++++++
  65. .......++++++
  66. writing new private key to 'benet.key'
  67. -----
  68. You are about to be asked to enter information that will be incorporated
  69. into your certificate request.
  70. What you are about to enter is what is called a Distinguished Name or a DN.
  71. There are quite a few fields but you can leave some blank
  72. For some fields there will be a default value,
  73. If you enter '.', the field will be left blank.
  74. -----
  75. Country Name (2 letter code) [CN]:
  76. State or Province Name (full name) [BJ]:
  77. Locality Name (eg, city) [Beijing]:
  78. Organization Name (eg, company) [yunjisuan]:
  79. Organizational Unit Name (eg, section) [yunjisuan]:
  80. Common Name (eg, your name or your server's hostname) [benet]:
  81. Name [yunjisuan]:
  82. Email Address [[email protected]]:
  83. Please enter the following 'extra' attributes
  84. to be sent with your certificate request
  85. A challenge password []:666666
  86. An optional company name []:yunjisuan
  87. Using configuration from /usr/src/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.cnf
  88. Check that the request matches the signature
  89. Signature ok
  90. The Subject'Distinguished Name is as follows
  91. countryName :PRINTABLE:'CN'
  92. stateOrProvinceName :PRINTABLE:'BJ'
  93. localityName :PRINTABLE:'Beijing'
  94. organizationName :PRINTABLE:'yunjisuan'
  95. organizationalUnitName:PRINTABLE:'yunjisuan'
  96. commonName :PRINTABLE:'benet'
  97. name :PRINTABLE:'yunjisuan'
  98. emailAddress :IA5STRING:'[email protected]'
  99. Certificate is to be certified until Nov 12 15:02:37 2027 GMT (3650 days)
  100. Sign the certificate? [y/n]:y
  101. 1 out of 1 certificate requests certified, commit? [y/n]y
  102. Write out database with 1 new entries
  103. Data Base Updated
  104. [root@localhost 2.0]# ll /keys
  105. ls: cannot access /keys: No such file or directory
  106. [root@localhost 2.0]# ll keys/
  107. total 80
  108. -rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
  109. -rw-r--r--. 1 root root 3964 Nov 14 20:48 02.pem
  110. -rw-r--r--. 1 root root 3957 Nov 14 23:02 03.pem
  111. -rw-r--r--. 1 root root 3957 Nov 14 23:02 benet.crt
  112. -rw-r--r--. 1 root root 785 Nov 14 23:02 benet.csr
  113. -rw-------. 1 root root 916 Nov 14 23:02 benet.key
  114. -rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
  115. -rw-------. 1 root root 916 Nov 14 00:29 ca.key
  116. -rw-r--r--. 1 root root 3964 Nov 14 20:48 chensiqi.crt
  117. -rw-r--r--. 1 root root 790 Nov 14 20:48 chensiqi.csr
  118. -rw-------. 1 root root 916 Nov 14 20:48 chensiqi.key
  119. -rw-r--r--. 1 root root 391 Nov 14 23:02 index.txt
  120. -rw-r--r--. 1 root root 21 Nov 14 23:02 index.txt.attr
  121. -rw-r--r--. 1 root root 21 Nov 14 20:48 index.txt.attr.old
  122. -rw-r--r--. 1 root root 262 Nov 14 20:48 index.txt.old
  123. -rw-r--r--. 1 root root 3 Nov 14 23:02 serial
  124. -rw-r--r--. 1 root root 3 Nov 14 20:48 serial.old
  125. -rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt
  126. -rw-r--r--. 1 root root 785 Nov 14 00:33 server.csr
  127. -rw-------. 1 root root 916 Nov 14 00:33 server.key
 

生成传输进行密钥交换时用到的交换密钥协议文件

./build-dh <----------不能落了不执行哦,否则出错

 
  1. [root@localhost 2.0]# ./build-dh
  2. Generating DH parameters, 1024 bit long safe prime, generator 2
  3. This is going to take a long time
  4. ....................................+...........................+............................................................+.................................+.......+........................+................................................................................+.....+................+..........................................+................................................+.........+...........................................+..........+................................+................................................................+............................................+...........................+.................................................................+............................++*++*++*
  5. #查看生成的文件
  6. [root@localhost 2.0]# ll keys/dh1024.pem
  7. -rw-r--r--. 1 root root 245 Nov 14 23:15 keys/dh1024.pem
 

查看生成服务器及客户单的证书文件

生成的证书目录及文件如下

 
  1. [root@localhost 2.0]# pwd
  2. /usr/src/openvpn-2.2.2/easy-rsa/2.0
  3. [root@localhost 2.0]# ll keys/
  4. total 84
  5. -rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
  6. -rw-r--r--. 1 root root 3964 Nov 14 20:48 02.pem
  7. -rw-r--r--. 1 root root 3957 Nov 14 23:02 03.pem
  8. -rw-r--r--. 1 root root 3957 Nov 14 23:02 benet.crt
  9. -rw-r--r--. 1 root root 785 Nov 14 23:02 benet.csr
  10. -rw-------. 1 root root 916 Nov 14 23:02 benet.key
  11. -rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
  12. -rw-------. 1 root root 916 Nov 14 00:29 ca.key
  13. -rw-r--r--. 1 root root 3964 Nov 14 20:48 chensiqi.crt
  14. -rw-r--r--. 1 root root 790 Nov 14 20:48 chensiqi.csr
  15. -rw-------. 1 root root 916 Nov 14 20:48 chensiqi.key
  16. -rw-r--r--. 1 root root 245 Nov 14 23:15 dh1024.pem
  17. -rw-r--r--. 1 root root 391 Nov 14 23:02 index.txt
  18. -rw-r--r--. 1 root root 21 Nov 14 23:02 index.txt.attr
  19. -rw-r--r--. 1 root root 21 Nov 14 20:48 index.txt.attr.old
  20. -rw-r--r--. 1 root root 262 Nov 14 20:48 index.txt.old
  21. -rw-r--r--. 1 root root 3 Nov 14 23:02 serial
  22. -rw-r--r--. 1 root root 3 Nov 14 20:48 serial.old
  23. -rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt
  24. -rw-r--r--. 1 root root 785 Nov 14 00:33 server.csr
  25. -rw-------. 1 root root 916 Nov 14 00:33 server.key
 

详解服务器及客户端的证书各文件用途

image_1cs6tqevft7hbij1eelqli1dsr6s.png-30.9kB

 

详解服务器端VPN server.conf重要参数

(1)创建openvpn配置文件目录,并拷贝keys及配置

 
  1. [root@localhost ~]# mkdir -/etc/openvpn
  2. [root@localhost ~]# cd /usr/src/openvpn-2.2.2/easy-rsa/2.0/
  3. [root@localhost 2.0]# /bin/cp -ap keys /etc/openvpn/
  4. [root@localhost 2.0]# cd /usr/src/openvpn-2.2.2/sample-config-files/
  5. [root@localhost sample-config-files]# cp client.conf server.conf /etc/openvpn/
  6. [root@localhost sample-config-files]# tree /etc/openvpn/
  7. /etc/openvpn/
  8. ├── client.conf #客户端配置文件
  9. ├── keys
  10.  ├── 01.pem
  11.  ├── 02.pem
  12.  ├── 03.pem
  13.  ├── benet.crt
  14.  ├── benet.csr
  15.  ├── benet.key
  16.  ├── ca.crt
  17.  ├── ca.key
  18.  ├── chensiqi.crt
  19.  ├── chensiqi.csr
  20.  ├── chensiqi.key
  21.  ├── dh1024.pem
  22.  ├── index.txt
  23.  ├── index.txt.attr
  24.  ├── index.txt.attr.old
  25.  ├── index.txt.old
  26.  ├── serial
  27.  ├── serial.old
  28.  ├── server.crt
  29.  ├── server.csr
  30.  └── server.key
  31. └── server.conf #服务端配置文件
  32. 1 directory, 23 files

(2)server.conf样例

 
  1. #查看服务器端默认配置文件
  2. [root@localhost openvpn]# pwd
  3. /etc/openvpn
  4. [root@localhost openvpn]# grep -vE ";|#|^$" server.conf
  5. port 1194
  6. proto udp
  7. dev tun
  8. ca ca.crt
  9. cert server.crt
  10. dh dh1024.pem
  11. server 10.8.0.0 255.255.255.0
  12. ifconfig-pool-persist ipp.txt
  13. keepalive 10 120
  14. comp-lzo
  15. persist-key
  16. persist-tun
  17. status openvpn-status.log
  18. verb 3

(3)企业生产环境server.conf配置案例

image_1cs6tsu1b47qfo17p341h11mm79.png-87.9kB

提示: 
先执行export LANG="ZH_GB18030",然后编辑配置文件server.conf,清空所有内容,把上面内容考进来。然后,执行dos2unix server.conf本文档目录下,有参考配置文件server.conf

 

实际服务器端VPN配置文件server.conf配置

 
  1. #生成默认的服务器端配置文件
  2. [root@localhost openvpn]# cd /etc/openvpn/
  3. [root@localhost openvpn]# cp server.conf{,.bak}
  4. [root@localhost openvpn]# egrep -"#|^$|;" server.conf.bak > server.conf
  5. [root@localhost openvpn]# cat server.conf
  6. port 1194
  7. proto udp
  8. dev tun
  9. ca ca.crt
  10. cert server.crt
  11. dh dh1024.pem
  12. server 10.8.0.0 255.255.255.0
  13. ifconfig-pool-persist ipp.txt
  14. keepalive 10 120
  15. comp-lzo
  16. persist-key
  17. persist-tun
  18. status openvpn-status.log
  19. verb 3
  20. #将默认的服务器配置文件修改成如下所示:
  21. [root@localhost openvpn]# cat server.conf
  22. local 192.168.0.100 #添加本行(监听的公网网卡IP)
  23. push "route 192.168.200.0 255.255.255.0" #添加本行(VPN内网路由规则)
  24. client-to-client #添加本行
  25. duplicate-cn #添加本行
  26. log /var/log/openvpn.log #添加本行
  27. port 52115 #修改端口
  28. proto tcp #换成tcp
  29. dev tun
  30. ca /etc/openvpn/keys/ca.crt #修改本行
  31. cert /etc/openvpn/keys/server.crt #修改本行
  32. key /etc/openvpn/keys/server.key #添加本行
  33. dh /etc/openvpn/keys/dh1024.pem #修改本行
  34. server 10.8.0.0 255.255.255.0
  35. ifconfig-pool-persist ipp.txt
  36. keepalive 10 120
  37. comp-lzo
  38. persist-key
  39. persist-tun
  40. status openvpn-status.log
  41. verb 3
 

调试服务端VPN服务启动环境

(1)关闭VPNServer的防火墙

 
  1. [root@localhost openvpn]# service iptables stop
  2. iptables: Setting chains to policy ACCEPT: filter [ OK ]
  3. iptables: Flushing firewall rules: [ OK ]
  4. iptables: Unloading modules: [ OK ]

(2)开启内核转发功能:

 
  1. [root@localhost openvpn]# sed -'7p' /etc/sysctl.conf
  2. net.ipv4.ip_forward = 1 #转发已经开启
 

启动服务端的VPN服务并检查

(1)启动VPN服务

 
  1. #启动vpn服务
  2. [root@localhost openvpn]# /usr/local/sbin/openvpn --config /etc/openvpn/server.conf &
  3. [1] 29935
  4. [root@localhost openvpn]#
  5. #查看vpn端口
  6. [root@localhost openvpn]# netstat -antup | grep vpn
  7. tcp 0 0 192.168.0.100:52115 0.0.0.0:* LISTEN 29935/openvpn
  8. #设置开机自启动
  9. [root@localhost openvpn]# echo "#startup openvpn service by oldboy" >> /etc/rc.local
  10. [root@localhost openvpn]# echo "/usr/local/sbin/openvpn --config /etc/openvpn/server.conf &" >> /etc/rc.local
  11. [root@localhost openvpn]# tail -2 /etc/rc.local
  12. tail: inotify cannot be used, reverting to polling
  13. #startup openvpn service by oldboy
  14. /usr/local/sbin/openvpn --config /etc/openvpn/server.conf &

(2)查看VPN启动日志

 
  1. [root@localhost openvpn]# tail /var/log/openvpn.log
  2. Thu Nov 16 23:47:46 2017 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
  3. Thu Nov 16 23:47:46 2017 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
  4. Thu Nov 16 23:47:46 2017 Listening for incoming TCP connection on 192.168.0.100:52115
  5. Thu Nov 16 23:47:46 2017 TCPv4_SERVER link local (bound): 192.168.0.100:52115
  6. Thu Nov 16 23:47:46 2017 TCPv4_SERVER link remote: [undef]
  7. Thu Nov 16 23:47:46 2017 MULTI: multi_init called, r=256 v=256
  8. Thu Nov 16 23:47:46 2017 IFCONFIG POOL: base=10.8.0.4 size=62
  9. Thu Nov 16 23:47:46 2017 IFCONFIG POOL LIST
  10. Thu Nov 16 23:47:46 2017 MULTI: TCP INIT maxclients=1024 maxevents=1028
  11. Thu Nov 16 23:47:46 2017 Initialization Sequence Completed

(3)查看VPNserver路由信息

 
  1. [root@localhost openvpn]# route -n
  2. Kernel IP routing table
  3. Destination Gateway Genmask Flags Metric Ref Use Iface
  4. 10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
  5. 10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
  6. 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  7. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  8. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  9. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1

(4)最后,我们需要把客户端证书及CA证书安全的下载到本地

 

配置VPN常规启动(利用vpn自带服务启动脚本启动VPN)

这里仅仅给出演示步骤。为了让同学们看得。不需要在实验中操作

 
  1. [root@localhost sample-scripts]# cd /usr/src/openvpn-2.2.2/sample-scripts/
  2. [root@localhost sample-scripts]# ll
  3. total 28
  4. -rwxrwxr-x. 1 500 500 2408 Oct 21 2010 auth-pam.pl
  5. -rwxrwxr-x. 1 500 500 741 Nov 25 2011 bridge-start
  6. -rwxrwxr-x. 1 500 500 313 Nov 25 2011 bridge-stop
  7. -rwxrwxr-x. 1 500 500 5481 Nov 25 2011 openvpn.init #VPN自带启动脚本
  8. -rwxrwxr-x. 1 500 500 339 Oct 21 2010 ucn.pl
  9. -rwxrwxr-x. 1 500 500 2205 Nov 25 2011 verify-cn
  10. [root@localhost sample-scripts]# cp openvpn.init /etc/init.d/openvpn
  11. [root@localhost sample-scripts]# chmod 700 /etc/init.d/openvpn
  12. [root@localhost sample-scripts]# ll /etc/init.d/openvpn
  13. -rwx------. 1 root root 5481 Nov 17 00:15 /etc/init.d/openvpn
  14. [root@localhost sample-scripts]# chkconfig --add openvpn
  15. [root@localhost sample-scripts]# chkconfig --list openvpn
  16. openvpn 0:off 1:off 2:off 3:on 4:on 5:on 6:off
 

安装WindowsVPN客户端配置VPN连接

 

下载并安装openvpn客户端

http://openvpn.se/download.html上下载与openvpn服务器版本一致的Windows客户端。openvpn-2.2.2-install.exe 
需要安装VMware Tools才能将安装包拷贝到windows虚拟机里。

 

配置并下载客户端证书

将ca.crt,chensiqi.crt,chensiqi.key,client.conf 复制到C:\Program Files\OpenVPN\config\chensiqi目录下,即先在服务器上建立配置文件,然后再下载到客户机上。

(1)建立client客户端配置文件

 
  1. #建立client.conf配置文件
  2. [root@localhost openvpn]# cp client.conf{,.bak}
  3. [root@localhost openvpn]# egrep -"#|^$|;" client.conf.bak > client.conf
  4. [root@localhost openvpn]# cat client.conf
  5. client
  6. dev tun
  7. proto udp
  8. remote my-server-1 1194
  9. resolv-retry infinite
  10. nobind
  11. persist-key
  12. persist-tun
  13. ca ca.crt
  14. cert client.crt
  15. key client.key
  16. ns-cert-type server
  17. comp-lzo
  18. verb 3
  19. #将上述配置文件内容,修改成如下所示:
  20. [root@localhost openvpn]# cat client.conf
  21. client
  22. dev tun
  23. proto tcp #修改成tcp
  24. remote 192.168.0.100 52115 #修改成VPNserver的外网IP
  25. resolv-retry infinite
  26. nobind
  27. persist-key
  28. persist-tun
  29. ca ca.crt
  30. cert chensiqi.crt #修改成你的客户端证书名字
  31. key chensiqi.key #修改成你的客户端证书密码
  32. ns-cert-type server
  33. comp-lzo
  34. verb 3

 

 

 

在win7上拨号远程连接openvpn服务

(1)启动VPN client

双击图标启动openvpn客户端image_1cs6u5mqj1k891aot1t355n7h3v8g.png-12.7kB

在windows虚拟机右下角,出现图标image_1cs6u6tuk1dmha5r1l551jk7a7g8t.png-24.8kB

(2)给企业网关ADSL做SNAT,以便windows客户端PC(192.168.100.100)可以ping通VPNserver的外网网卡(192.168.0.100)

 
  1. #在网关ADSL上操作
  2. [root@ADSL ~]# iptables -t nat -A POSTROUTING -192.168.100.0/24 -o eth0 -j SNAT --to-source 192.168.0.200 #添加SNAT规则
  3. [root@ADSL ~]# iptables -t nat --nv
  4. Chain PREROUTING (policy ACCEPT 7 packets, 646 bytes)
  5. pkts bytes target prot opt in out source destination
  6. Chain POSTROUTING (policy ACCEPT 2 packets, 144 bytes)
  7. pkts bytes target prot opt in out source destination
  8. 1 60 SNAT all -- * eth0 192.168.100.0/24 0.0.0.0/0 to:192.168.0.200
  9. Chain OUTPUT (policy ACCEPT 2 packets, 144 bytes)
  10. pkts bytes target prot opt in out source destination

(3)测试企业内网PC(windows)和VPNserver服务器的外网卡之间的连通性

image_1cs6u8o0q1lqean5ht27r9i6j9a.png-29.8kB

(4)然后右键点击新出现的那个图标,出现connect选项,并点击。

image_1cs6u95p518ud1l9khul174r1mb9n.png-27.9kB

image_1cs6u9dn486e16alaccj2n18mga4.png-6.1kB

特别提示: 
如果VPNServer的时间和你本机的时间不一致,那么就会遭遇连接失败。需要进行时间校对

(5)此时观察windows虚拟机的网络连接状态,多了一个本地连接2的东西。

image_1cs6ua7nm1nmkdlj1c1o5os1hk3ah.png-211.2kB

VPNServer 强行在OpenVPN客户端绑定了一个虚拟IP地址:10.8.0.6

(6)查看OpenVPN client端日志 
右键点击绿电脑--->View log 如下图所示

image_1cs6ub5ckguoggs8li19lb1briau.png-293kB

(7)测试windows客户端与VPNserver的内网网卡(192.168.200.100)的连通性

image_1cs6ubnnh1ebs95hn8m3cccu4bn.png-62.7kB

正常来说,企业内网的ADSL(192.168.0.200)只能转发给同网段VPNServer的外网网卡(192.168.0.100)而找不到VPNServer的内网网卡的网段(192.168.200.100)。

但我们测试的结果却能成功ping通,这说明VPNServer搭建成功了。

(8)测试企业内网windows客户端直接与IDC机房的内网跳板机之间的连通性

image_1cs6ucth815cke5v1h9op0plbdc7.png-11.1kB

测试的结果显然是不通的。这是因为企业内网windows客户端的IP为(10.8.0.6)VPNServer的本地虽然有10.8.0.0网段的路由,因此可以进行数据包的转发,但是,当VPNServer将数据包转发给IDC机房的内网跳板机以后,内网跳板机上并没有10.8.0.0网段的路由,所以内网跳板机的响应包是发不回来的。(IDC机房的内网机的网关并不是VPNServer)。因此,测试连通性是失败的。

 

实现企业内网PC和IDC机房内网机之间的互通

 

方法一:在内网机器上,配置VPN路由实现路由方式VPN架构方案

 
  1. #在IDC内网机器上操作
  2. [root@localhost ~]# hostname -I
  3. 192.168.200.200
  4. [root@localhost ~]# route add -net 10.8.0.0/24 gw 192.168.200.100
  5. [root@localhost ~]# route -n
  6. Kernel IP routing table
  7. Destination Gateway Genmask Flags Metric Ref Use Iface
  8. 10.8.0.0 192.168.200.100 255.255.255.0 UG 0 0 0 eth0
  9. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  10. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0

我们再次进行windows和跳板机互通测试

image_1cs6uefq21oe71mdl13ig125i1lggck.png-103.8kB

 

方法二:在VPNServer上,配置拨VPN内网机器不需要设置网关及路由(重要)

当数据包被VPNServer转发给内网机时,我们对所有从VPNServer的内网网卡出去的数据包做SNAT转换

 
  1. #在VPNServer上操作
  2. [root@localhost openvpn]# iptables -t nat -A POSTROUTING -10.8.0.0/24 -o eth1 -j SNAT --to-source 192.168.200.100
  3. [root@localhost openvpn]# iptables -t nat --nv
  4. Chain PREROUTING (policy ACCEPT 1 packets, 78 bytes)
  5. pkts bytes target prot opt in out source destination
  6. Chain POSTROUTING (policy ACCEPT 1 packets, 152 bytes)
  7. pkts bytes target prot opt in out source destination
  8. 0 0 SNAT all -- * eth1 10.8.0.0/24 0.0.0.0/0 to:192.168.200.100
  9. Chain OUTPUT (policy ACCEPT 1 packets, 152 bytes)
  10. pkts bytes target prot opt in out source destination

我们再次进行windows和跳板机互通测试

image_1cs6ufo4s17egbv212k7v9e10v0d1.png-44kB

OK!我们再次试验成功。

 

检查企业内网Linux客户端的实验环境

 
  1. [root@localhost ~]# hostname -I
  2. 192.168.100.50
  3. [root@localhost ~]# route -n
  4. Kernel IP routing table
  5. Destination Gateway Genmask Flags Metric Ref Use Iface
  6. 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  7. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  8. 0.0.0.0 192.168.100.200 0.0.0.0 UG 0 0 0 eth0
  9. [root@localhost ~]# service iptables stop
  10. [root@localhost ~]# setenforce 0
 

安装openvpn client客户端

安装过程和服务器端一样,具体步骤如下:

(1)在安装openvpn软件前我们先要来安装下lzo压缩模块

 
  1. [root@localhost ~]# tar xf lzo-2.06.tar.gz -/usr/src/
  2. [root@localhost ~]# cd /usr/src/lzo-2.06/
  3. [root@localhost lzo-2.06]# ./configure
  4. [root@localhost lzo-2.06]# make && make install

(2)安装openvpn软件

 
  1. [root@localhost yum.repos.d]# yum -y install openssl-devel pam-devel
  2. [root@localhost ~]# tar xf openvpn2.2.2.tar.gz -/usr/src/
  3. [root@localhost ~]# cd /usr/src/openvpn-2.2.2/
  4. [root@localhost openvpn-2.2.2]# ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
  5. [root@localhost openvpn-2.2.2]# make && make install
  6. [root@localhost openvpn-2.2.2]# which openvpn
  7. /usr/local/sbin/openvpn

(3)配置openvpn client

 
  1. #创建openvpn配置文件目录
  2. [root@localhost openvpn-2.2.2]# mkdir -/etc/openvpn
  3. [root@localhost openvpn-2.2.2]# cd /etc/openvpn

将之前windows客户端拷贝过去的文件拷贝到Linux客户端/etc/openvpn目录下

image_1cs6uivrpbak109l3pu191f1c6hdr.png-26.6kB

 
  1. [root@localhost openvpn]# pwd
  2. /etc/openvpn
  3. [root@localhost openvpn]# ll
  4. total 20
  5. -rw-r--r--. 1 root root 1363 Nov 17 16:25 ca.crt
  6. -rw-r--r--. 1 root root 3964 Nov 17 16:25 chensiqi.crt
  7. -rw-r--r--. 1 root root 916 Nov 17 16:25 chensiqi.key
  8. -rw-r--r--. 1 root root 186 Nov 17 16:25 chensiqi.ovpn #windows用
  9. -rw-r--r--. 1 root root 186 Nov 17 16:25 client.conf #Linux用

特别提示: 
chensiqi.ovpn 是openvpn windows客户端所需要的配置文件的名字 
但是在Linux系统下的openvpn client只需要叫做client.conf即可

(4)启动openvpn clinet客户端

 
  1. [root@localhost openvpn]# /usr/local/sbin/openvpn --config /etc/openvpn/client.conf &
  2. ..以下内容省略若干..
  3. Fri Nov 17 16:34:18 2017 /sbin/ifconfig tun0 10.8.0.10 pointopoint 10.8.0.9 mtu 1500
  4. Fri Nov 17 16:34:18 2017 /sbin/route add -net 192.168.200.0 netmask 255.255.255.0 gw 10.8.0.9
  5. Fri Nov 17 16:34:18 2017 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.9
  6. Fri Nov 17 16:34:18 2017 Initialization Sequence Completed #出现这个表示成功!
  7. [root@localhost openvpn]# ps -ef | grep openvpn | grep -v grep
  8. root 10556 1274 0 16:34 pts/1 00:00:00 /usr/local/sbin/openvpn --config /etc/openvpn/client.conf

(5)查看网卡信息

 
  1. [root@localhost openvpn]# ifconfig
  2. eth0 Link encap:Ethernet HWaddr 00:0C:29:B5:3E:32
  3. inet addr:192.168.100.50 Bcast:192.168.100.255 Mask:255.255.255.0
  4. inet6 addr: fe80::20c:29ff:feb5:3e32/64 Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  6. RX packets:3746 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:2476 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:1803602 (1.7 MiB) TX bytes:364324 (355.7 KiB)
  10. lo Link encap:Local Loopback
  11. inet addr:127.0.0.1 Mask:255.0.0.0
  12. inet6 addr: ::1/128 Scope:Host
  13. UP LOOPBACK RUNNING MTU:16436 Metric:1
  14. RX packets:20 errors:0 dropped:0 overruns:0 frame:0
  15. TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
  16. collisions:0 txqueuelen:0
  17. RX bytes:1728 (1.6 KiB) TX bytes:1728 (1.6 KiB)
  18. tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
  19. inet addr:10.8.0.10 P-t-P:10.8.0.9 Mask:255.255.255.255
  20. UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
  21. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  22. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  23. collisions:0 txqueuelen:100
  24. RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
  25. [root@localhost openvpn]# route -n
  26. Kernel IP routing table
  27. Destination Gateway Genmask Flags Metric Ref Use Iface
  28. 10.8.0.9 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
  29. 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  30. 10.8.0.0 10.8.0.9 255.255.255.0 UG 0 0 0 tun0
  31. 192.168.200.0 10.8.0.9 255.255.255.0 UG 0 0 0 tun0
  32. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  33. 0.0.0.0 192.168.100.200 0.0.0.0 UG 0 0 0 eth0
 

测试企业内网Linux openvpn client与IDC机房内网跳板机的互通

 
  1. [root@localhost openvpn]# ping 192.168.200.200
  2. PING 192.168.200.200 (192.168.200.200) 56(84) bytes of data.
  3. 64 bytes from 192.168.200.200: icmp_seq=1 ttl=63 time=2.02 ms
  4. 64 bytes from 192.168.200.200: icmp_seq=2 ttl=63 time=0.598 ms
  5. 64 bytes from 192.168.200.200: icmp_seq=3 ttl=63 time=0.443 ms
  6. ^C
  7. --- 192.168.200.200 ping statistics ---
  8. 3 packets transmitted, 3 received, 0% packet loss, time 2278ms
  9. rtt min/avg/max/mdev = 0.443/1.021/2.024/0.712 ms

至此openvpn client Linux客户端也就测试成功了。

 
 

多个IDC机房利用VPN互联架构方案应用场景

(1)企业之间互联

(2)多机房互联

a.数据同步,备份数据

b.异地数据读取(北京机房web服务写数据到济南机房的MySQL。是否可读?)

读写比例:几十比一所以远程写问题不大,远程读是禁忌。企业用远程写数据库,然后在本地做一个MySQL Slave,本地读数据库。

同一个业务跨机房集群的架构。通过VPN传数据。尽量远程写,本地读。

OpenVPN,ipsec做机房互联,更多的是功能应用,大数据传输,实时性要求高,不适合。

猜你喜欢

转载自www.cnblogs.com/wangyinuo/p/10015503.html