Linux实战教学笔记48:openvpn架构实施方案(一)跨机房异地灾备

第一章VPN介绍

1.1 VPN概述

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

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

QQ截图20171107210724.png-84.2kB

1.2 VPN的作用

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

QQ截图20171107220916.png-299kB

1.3 VPN的分类

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

(1)远程访问VPN服务

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

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

QQ截图20171107224921.png-28.9kB

  • 对于运维人员来说就是需要个人电脑远程拨号到企业网站IDC机房,远程维护IDC服务器。
  • 此点是技术人员特别是运维人员在工作中会经常用这个方法维护大量的机房内无外网的服务器及网络设备。

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

  • 在公司的分支机构的局域网和公司总部LAN之间的VPN连接。通过公网Internet建立VPN将公司在各地的分支机构的LAN链接到公司总部的LAN。例如:各大超市之间业务结算等。
  • 这是由于地域的原因而产生的VPN的需求,通过VPN让不同地域内的机器可以互相访问,就好像是一个局域网一样。例如:办公室互联协同办公,机房互联数据同步及业务访问等。

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

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

(4)企业外部VPN服务

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

(5)访问国外的网站

FQ业务应用

1.4 常见隧道协议介绍

(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客户端。

QQ截图20171108134332.png-343.6kB

1.5 实现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不间断按需连接,并且在部署使用上更简单方便。

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

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

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

  • [x] :对于开源的产品,Mr.chen建议:
    • 个人拨号选择openvpn,功能强大,稳定可靠。
    • 如果不希望单独安装客户端拨号,则可选择PPTP
    • 多个企业之间或者多个IDC机房直接互联,选择ipsecvpn或openvpn。
  • [x] :本课程所讲解的:openvpn,ipsec vpn的完整企业实现。可以满足各种企业需求。

第二章 openvpn开源产品

2.1 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软件包兼容。

2.2 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)和消息伪造。

2.3 openvpn的加密通信原理过程

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

2.4 openvpn的多种身份验证方式

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

2.5 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,网络堆栈把数据传给上层真实的应用程序。

2.6 openvpn生产环境常用场景

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

用的最多的场景

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

QQ截图20171110115258.png-63.3kB

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

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

(4)企业外部VPN服务

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

2.7 企业生产场景常用VPN工作结构图

(1)企业vpn远程拨号访问场景逻辑图(OpenVPN)

QQ截图20171117234117.png-62.5kB

  • 当用户从家里拨号上网后,通过OpenVPN Client软件可以拨号到OpenVPN Server(ip:124.43.12.115)上,此时,在个人笔记本和OpenVPN Server之间会建立一个加密的专用隧道(默认会使用10.6.27.0段的IP),使得个人笔记本可以访问得到OpenVPN Server的内网卡IP地址(172.16.1.7),但是,此时通过笔记本直接访问和OpenVPN Server相同的内部局域网中的其他Server(ip:172.16.1.8)是访问不到的,因为,OpenVPN Server不知道如何帮你转发这个访问请求。
  • 在生产环境中的常用做法是,当个人笔记本连接上OpenVPN Server之后,在OpenVPN Server上加入一条防火墙NAT规则(部署时人工增加),使得当笔记本(来源地址段为10.6.27.0)访问和OpenVPN Server相同的内部局域网Server(ip:172.16.1.9)时,把笔记本的访问去请求伪装成OpenVPN Server的请求(即把笔记本的访问来源地址更改为OpenVPN Server的内网卡IP地址,本文为172.16.1.7),这样,从笔记本就可以轻松访问和OpenVPN Server相同的内部局域网的其它Server(ip:172.16.1.9)了,因为经过NAT转换后,二者看起来是在同一个局域网网段内。在访问请求时,笔记本的IP已经转换为OpenVPN Server的内网卡IP地址,本文为172.16.1.7,而和OpenVPN Server相同的内部局域网的所有Server的IP段都在172.16.1.0/24段,这样家里的笔记本也就相当于在172.16.1.0/24了,从而实现局域网互相访问的效果。
  • 当然,OpenVPN的功能及应用不仅仅是我上面描述的,在生产环境中,还可以有其它的使用方案,例如:配置VPN实现“FQ”功能。

(2)企业或IDC机房网络互联场景逻辑图(IPsec)

QQ截图20171110214914.png-60.6kB

第三章 OpenVPN生产环境需求及环境模拟

3.1 环境需求

设备/项目 IP
模拟公网VPN客户端(笔记本或PC) 192.168.0.100/24(模拟公网IP)
OpenVPN Server(双网卡) eth0:192.168.0.200/24(公网) eth1:192.168.200.100/24(内网)
IDC机房内部局域网服务器 192.168.200.200/24(模拟内网服务器无公网IP)

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

QQ截图201711102+340.png-38kB

3.2 大规模集群环境VPN逻辑架构

QQ截图20171113200125.png-133kB

3.3 openvpn实验初始环境搭建

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

网卡名称 IP 网关设置
eth0 192.168.0.200 无网关信息
eth1 192.168.100.200 无网关信息
  • 模拟网关的ADSL,并没有设置网关,因为它的eth0网卡,模拟的本身就是公网的IP了。因为是测试环境所以网关ADSL的eth0网卡可以直接ping到VPNServer的eth0(同网段),因此ADSL就不需要在设置网关了。在真实环境中,它是需要设置网关(上级路由器的),但由于VPNServer的eth0网卡在真实环境中也是公网IP,也会设置网关(上级路由器)。因此,在公网环境中就算ADSL的公网IP和VPNServer的公网IP不在同一网段,那么上级路由器仍旧可以帮你将数据包发给对方(路由转发规则)。
  • 综上,我们模拟的公网环境直接设置成同网段即可。
[root@ADSL ~]# ifconfig eth0        #查看eth0网卡IP
eth0      Link encap:Ethernet  HWaddr 00:0C:29:B5:8C:08  
          inet addr:192.168.0.200  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feb5:8c08/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1969 errors:0 dropped:0 overruns:0 frame:0
          TX packets:123 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:144896 (141.5 KiB)  TX bytes:12435 (12.1 KiB)

[root@ADSL ~]# ifconfig eth1        #查看eth1网卡IP
eth1      Link encap:Ethernet  HWaddr 00:0C:29:B5:8C:12  
          inet addr:192.168.100.200  Bcast:192.168.100.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feb5:8c12/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:479 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:43346 (42.3 KiB)  TX bytes:2302 (2.2 KiB)

[root@ADSL ~]# route -n         #查看路由规则(没有GW)
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
[root@ADSL ~]# sysctl -p        #开启Linux网卡转发
net.ipv4.ip_forward = 1     #已经开启
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

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

网卡名称 IP 网关设置
eth0 192.168.0.100 无网关信息
eth1 192.168.200.100 无网关信息
  • 模拟IDC机房的VPNServer,也没有设置网关,因为它的eth0网卡,模拟的本身就是公网的IP了。所以,设置同网段即可。
  • 至于eth1网卡模拟的是IDC机房的内网环境,由于VPNServer并不是正常的网关内网出口,用户的URL请求是不会通过VPNServer的公网网卡进来的,所以我们的模拟环境就不需要设置网关了。在真实环境中,IDC机房的内网环境是会有真正的网关出口的(会有一台作为内网出到公网的出口。用户URL也是从那里进来的)
[root@localhost ~]# ifconfig eth0   #查看eth0网卡IP
eth0      Link encap:Ethernet  HWaddr 00:0C:29:87:B8:AF  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe87:b8af/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2136 errors:0 dropped:0 overruns:0 frame:0
          TX packets:154 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:157244 (153.5 KiB)  TX bytes:13765 (13.4 KiB)

[root@localhost ~]# ifconfig eth1   #查看eth1网卡IP
eth1      Link encap:Ethernet  HWaddr 00:0C:29:87:B8:B9  
          inet addr:192.168.200.100  Bcast:192.168.200.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe87:b8b9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2544 errors:0 dropped:0 overruns:0 frame:0
          TX packets:86 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:171207 (167.1 KiB)  TX bytes:7121 (6.9 KiB)

[root@localhost ~]# route -n        #查看路由规则(没有网关)
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
[root@localhost ~]# sysctl -p       #查看网卡转发情况
net.ipv4.ip_forward = 1     #已开启转发
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

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

网卡名称 IP 网关设置
eth0 192.168.100.100 GW:192.168.100.200

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

QQ截图20171117004102.png-59.7kB

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

(4)IDC内网跳板机

网卡名称 IP 网关设置
eth0 192.168.200.200 没有网关信息

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

[root@localhost ~]# ifconfig eth0   #查看网卡IP
eth0      Link encap:Ethernet  HWaddr 00:0C:29:F6:3F:B5  
          inet addr:192.168.200.200  Bcast:192.168.200.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fef6:3fb5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3350 errors:0 dropped:0 overruns:0 frame:0
          TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:225903 (220.6 KiB)  TX bytes:11485 (11.2 KiB)

[root@localhost ~]# route -n        #查看路由规则(无GW信息)
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0

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

#给VPN服务器的外网网卡添加网关和DNS信息
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.0.100
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1

[root@localhost ~]# ifdown eth0;ifup eth0       #重启网卡
Determining if ip address 192.168.0.100 is already in use for device eth0...
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0    #网关信息
[root@localhost ~]# cat /etc/resolv.conf    #查看DNS信息
nameserver 192.168.0.1

[root@localhost ~]# mount /dev/sr0 /media/cdrom/    #挂载光盘
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# yum -y install ntpdate  #安装ntpdate

#手动执行如下命令:
[root@localhost ~]# /usr/sbin/ntpdate ntp1.aliyun.com   #时间同步
[root@localhost ~]# date +%Y-%m-%d-%H-%M        #查看系统时间

#写入定时任务
[root@localhost ~]# echo "* * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null" >> /var/spool/cron/root
[root@localhost ~]# crontab -l
* * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null

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

第四章 openvpn生产环境实战

4.1 OpenVPN所需软件

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

4.2 安装lzo压缩模块

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

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

4.3 安装openvpn软件

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

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

初始化配置命令:

[root@localhost ~]# cd /usr/src/openvpn-2.2.2/easy-rsa/2.0/
[root@localhost 2.0]# cp vars vars.bak.2017-11-14

#修改证书文件vars最后的11行信息
[root@localhost 2.0]# tail -11 vars
export KEY_COUNTRY="US"     #国家
export KEY_PROVINCE="CA"    #省份
export KEY_CITY="SanFrancisco"  #城市
export KEY_ORG="Fort-Funston"   #组织
export KEY_EMAIL="[email protected]"   #邮件地址
export [email protected]       #邮件地址
export KEY_CN=changeme          #国家
export KEY_NAME=changeme        #名字
export KEY_OU=changeme          #名字
export PKCS11_MODULE_PATH=changeme 
export PKCS11_PIN=1234

#修改成如下信息即可
[root@localhost 2.0]# tail -11 vars
export KEY_COUNTRY="CN"
export KEY_PROVINCE="BJ"
export KEY_CITY="Beijing"
export KEY_ORG="yunjisuan"
export KEY_EMAIL="[email protected]"     #换成同学们的邮箱
export [email protected]       #换成同学们的邮箱
export KEY_CN=CN
export KEY_NAME=yunjisuan
export KEY_OU=yunjisuan
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

#提示:下面在建立证书时,会提示上面配置的内容,直接回车即可

#让vars文件,source vars生效一下
[root@localhost 2.0]# source vars
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
[root@localhost 2.0]# ./clean-all   #根据提示清空所有证书相关
[root@localhost 2.0]# ./build-ca
Generating a 1024 bit RSA private key
..............++++++
...........................++++++
writing new private key to 'ca.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) [Beijing]: #直接回车
Organization Name (eg, company) [yunjisuan]:    #直接回车
Organizational Unit Name (eg, section) [yunjisuan]: #直接回车
Common Name (eg, your name or your server's hostname) [CN]:yunjisuan    #输入yunjisuan
Name [yunjisuan]:   #直接回车
Email Address [[email protected]]:   #直接回车

[root@localhost 2.0]# ll keys/  #查看证书
total 12
-rw-r--r--. 1 root root 1334 Nov 14 00:20 ca.crt    #证书
-rw-------. 1 root root  916 Nov 14 00:20 ca.key    #私钥
-rw-r--r--. 1 root root    0 Nov 14 00:20 index.txt
-rw-r--r--. 1 root root    3 Nov 14 00:20 serial

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

[root@localhost 2.0]# ./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) [Beijing]: #直接回车
Organization Name (eg, company) [yunjisuan]:    #直接回车
Organizational Unit Name (eg, section) [yunjisuan]: #直接回车
Common Name (eg, your name or your server's hostname) [server]: #直接回车     
Name [yunjisuan]:       #直接回车
Email Address [[email protected]]:   #直接回车

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:666666      #输入验证密码
An optional company name []:yunjisuan   #输入公司名
Using configuration from /usr/src/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.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:'Beijing'
organizationName      :PRINTABLE:'yunjisuan'
organizationalUnitName:PRINTABLE:'yunjisuan'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'yunjisuan'
emailAddress          :IA5STRING:'[email protected]'
Certificate is to be certified until Nov 11 16:33:24 2027 GMT (3650 days)
Sign the certificate? [y/n]:y   #输入y


1 out of 1 certificate requests certified, commit? [y/n]y   #输入y
Write out database with 1 new entries
Data Base Updated

#查看生成的证书信息
[root@localhost 2.0]# ll keys/
total 40
-rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
-rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
-rw-------. 1 root root  916 Nov 14 00:29 ca.key
-rw-r--r--. 1 root root  130 Nov 14 00:33 index.txt7
-rw-r--r--. 1 root root   21 Nov 14 00:33 index.txt.attr
-rw-r--r--. 1 root root    0 Nov 14 00:29 index.txt.old
-rw-r--r--. 1 root root    3 Nov 14 00:33 serial
-rw-r--r--. 1 root root    3 Nov 14 00:29 serial.old
-rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt    #服务器端证书
-rw-r--r--. 1 root root  785 Nov 14 00:33 server.csr    #服务器端证书
-rw-------. 1 root root  916 Nov 14 00:33 server.key    #服务器端密钥

4.6 生成客户端证书和key文件

  • 生成client证书和key文件。若建立多个客户证书,则重复如下步骤即可。只需要修改Common Name项yunjisuan的名称。
  • 在openvpn中,这种配置方法是每一个登录的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接(如果有两个机器安装相同证书,同时拨服务器,都能拨上,但是只有第一个拨上的才能连通网络)。所以,如果有多个人,每个人需要建立一份证书(建立一7份证书多人使用的情况在后文中会讲到)。

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

[root@localhost 2.0]# ./build-key chensiqi  #生成客户端私钥,chensiqi为私钥的文件名
Generating a 1024 bit RSA private key
.....++++++
.....++++++
writing new private key to 'chensiqi.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) [Beijing]: #直接回车
Organization Name (eg, company) [yunjisuan]:    #直接回车
Organizational Unit Name (eg, section) [yunjisuan]: #直接回车
Common Name (eg, your name or your server's hostname) [chensiqi]:   #直接回车
Name [yunjisuan]:   #直接回车
Email Address [[email protected]]:   #直接回车

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:666666      #设定密码
An optional company name []:yunjisuan   #设定公司名称                              
Using configuration from /usr/src/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.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:'Beijing'
organizationName      :PRINTABLE:'yunjisuan'
organizationalUnitName:PRINTABLE:'yunjisuan'
commonName            :PRINTABLE:'chensiqi'
name                  :PRINTABLE:'yunjisuan'
emailAddress          :IA5STRING:'[email protected]'
Certificate is to be certified until Nov 12 12:48:43 2027 GMT (3650 days)
Sign the certificate? [y/n]:y   #输入y


1 out of 1 certificate requests certified, commit? [y/n]y   #输入y
Write out database with 1 new entries
Data Base Updated
[root@localhost 2.0]# ll keys/
total 64
-rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
-rw-r--r--. 1 root root 3964 Nov 14 20:48 02.pem
-rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
-rw-------. 1 root root  916 Nov 14 00:29 ca.key
-rw-r--r--. 1 root root 3964 Nov 14 20:48 chensiqi.crt  #用户私钥文件
-rw-r--r--. 1 root root  790 Nov 14 20:48 chensiqi.csr  #用户私钥文件
-rw-------. 1 root root  916 Nov 14 20:48 chensiqi.key  #用户私钥文件
-rw-r--r--. 1 root root  262 Nov 14 20:48 index.txt
-rw-r--r--. 1 root root   21 Nov 14 20:48 index.txt.attr
-rw-r--r--. 1 root root   21 Nov 14 00:33 index.txt.attr.old
-rw-r--r--. 1 root root  130 Nov 14 00:33 index.txt.old
-rw-r--r--. 1 root root    3 Nov 14 20:48 serial
-rw-r--r--. 1 root root    3 Nov 14 00:33 serial.old
-rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt
-rw-r--r--. 1 root root  785 Nov 14 00:33 server.csr
-rw-------. 1 root root  916 Nov 14 00:33 server.key

#继续生成benet用户的私钥
[root@localhost 2.0]# ./build-key benet #私钥名称benet
Generating a 1024 bit RSA private key
.........................++++++
.......++++++
writing new private key to 'benet.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) [Beijing]:
Organization Name (eg, company) [yunjisuan]:
Organizational Unit Name (eg, section) [yunjisuan]:
Common Name (eg, your name or your server's hostname) [benet]:
Name [yunjisuan]:
Email Address [[email protected]]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:666666
An optional company name []:yunjisuan
Using configuration from /usr/src/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.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:'Beijing'
organizationName      :PRINTABLE:'yunjisuan'
organizationalUnitName:PRINTABLE:'yunjisuan'
commonName            :PRINTABLE:'benet'
name                  :PRINTABLE:'yunjisuan'
emailAddress          :IA5STRING:'[email protected]'
Certificate is to be certified until Nov 12 15:02:37 2027 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@localhost 2.0]# ll /keys
ls: cannot access /keys: No such file or directory
[root@localhost 2.0]# ll keys/
total 80
-rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
-rw-r--r--. 1 root root 3964 Nov 14 20:48 02.pem
-rw-r--r--. 1 root root 3957 Nov 14 23:02 03.pem
-rw-r--r--. 1 root root 3957 Nov 14 23:02 benet.crt
-rw-r--r--. 1 root root  785 Nov 14 23:02 benet.csr
-rw-------. 1 root root  916 Nov 14 23:02 benet.key
-rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
-rw-------. 1 root root  916 Nov 14 00:29 ca.key
-rw-r--r--. 1 root root 3964 Nov 14 20:48 chensiqi.crt
-rw-r--r--. 1 root root  790 Nov 14 20:48 chensiqi.csr
-rw-------. 1 root root  916 Nov 14 20:48 chensiqi.key
-rw-r--r--. 1 root root  391 Nov 14 23:02 index.txt
-rw-r--r--. 1 root root   21 Nov 14 23:02 index.txt.attr
-rw-r--r--. 1 root root   21 Nov 14 20:48 index.txt.attr.old
-rw-r--r--. 1 root root  262 Nov 14 20:48 index.txt.old
-rw-r--r--. 1 root root    3 Nov 14 23:02 serial
-rw-r--r--. 1 root root    3 Nov 14 20:48 serial.old
-rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt
-rw-r--r--. 1 root root  785 Nov 14 00:33 server.csr
-rw-------. 1 root root  916 Nov 14 00:33 server.key

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

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

[root@localhost 2.0]# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
....................................+...........................+............................................................+.................................+.......+........................+................................................................................+.....+................+..........................................+................................................+.........+...........................................+..........+................................+................................................................+............................................+...........................+.................................................................+............................++*++*++*

#查看生成的文件
[root@localhost 2.0]# ll keys/dh1024.pem 
-rw-r--r--. 1 root root 245 Nov 14 23:15 keys/dh1024.pem

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

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

[root@localhost 2.0]# pwd
/usr/src/openvpn-2.2.2/easy-rsa/2.0
[root@localhost 2.0]# ll keys/
total 84
-rw-r--r--. 1 root root 4080 Nov 14 00:33 01.pem
-rw-r--r--. 1 root root 3964 Nov 14 20:48 02.pem
-rw-r--r--. 1 root root 3957 Nov 14 23:02 03.pem
-rw-r--r--. 1 root root 3957 Nov 14 23:02 benet.crt
-rw-r--r--. 1 root root  785 Nov 14 23:02 benet.csr
-rw-------. 1 root root  916 Nov 14 23:02 benet.key
-rw-r--r--. 1 root root 1363 Nov 14 00:29 ca.crt
-rw-------. 1 root root  916 Nov 14 00:29 ca.key
-rw-r--r--. 1 root root 3964 Nov 14 20:48 chensiqi.crt
-rw-r--r--. 1 root root  790 Nov 14 20:48 chensiqi.csr
-rw-------. 1 root root  916 Nov 14 20:48 chensiqi.key
-rw-r--r--. 1 root root  245 Nov 14 23:15 dh1024.pem
-rw-r--r--. 1 root root  391 Nov 14 23:02 index.txt
-rw-r--r--. 1 root root   21 Nov 14 23:02 index.txt.attr
-rw-r--r--. 1 root root   21 Nov 14 20:48 index.txt.attr.old
-rw-r--r--. 1 root root  262 Nov 14 20:48 index.txt.old
-rw-r--r--. 1 root root    3 Nov 14 23:02 serial
-rw-r--r--. 1 root root    3 Nov 14 20:48 serial.old
-rw-r--r--. 1 root root 4080 Nov 14 00:33 server.crt
-rw-r--r--. 1 root root  785 Nov 14 00:33 server.csr
-rw-------. 1 root root  916 Nov 14 00:33 server.key

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

filename Needed By Purpose Secret
ca.crt server+all clients Root CA certificate NO
ca.key key signing machine only Root CA key YES
dh{n}.pem server only Diffie Hellman parameters NO
server.crt server only Server Certificate NO
server.key server only Server Key YES
chensiqi.crt chensiqi only chensiqi Certificate NO
chensiqi.key chensiqi only chensiqi Key YES
benet.crt benet only benet Certificate NO
benet.key benet only benet Key YES

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

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

[root@localhost ~]# mkdir -p /etc/openvpn
[root@localhost ~]# cd /usr/src/openvpn-2.2.2/easy-rsa/2.0/
[root@localhost 2.0]# /bin/cp -ap keys /etc/openvpn/
[root@localhost 2.0]# cd /usr/src/openvpn-2.2.2/sample-config-files/
[root@localhost sample-config-files]# cp client.conf server.conf /etc/openvpn/
[root@localhost sample-config-files]# tree /etc/openvpn/
/etc/openvpn/
├── client.conf     #客户端配置文件
├── keys
│   ├── 01.pem
│   ├── 02.pem
│   ├── 03.pem
│   ├── benet.crt
│   ├── benet.csr
│   ├── benet.key
│   ├── ca.crt
│   ├── ca.key
│   ├── chensiqi.crt
│   ├── chensiqi.csr
│   ├── chensiqi.key
│   ├── dh1024.pem
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── serial
│   ├── serial.old
│   ├── server.crt
│   ├── server.csr
│   └── server.key
└── server.conf     #服务端配置文件

1 directory, 23 files

(2)server.conf样例

#查看服务器端默认配置文件
[root@localhost openvpn]# pwd
/etc/openvpn
[root@localhost openvpn]# grep -vE ";|#|^$" server.conf 
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

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

配置参数 参数说明
local 124.43.12.115 哪一个本地地址要被OpenVPN进行监听(Which local IP address should OpenVPN)
port 52115 监听的端口,默认是1194,这里为了安全起见,修改为52115
proto udp 指定监听的协议,当并发访问多时,推荐tcp
dev tun vpn server 的模式采用路由模式。可选tap或tun
ca ca.crt ca证书,注意此文件和server.conf在一个目录下,否则要用绝对路径调用
cert server.crt
key server.key This file should be kept secret
dh dh1024.pem
Server 10.8.0.0 255.255.255.0 这个是VPN Server动态分配给VPN CLIENT的地址池,一般不需要更改。这个段不要和任何网络地址段冲突或者重复
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.255.255.0" 这是VPN SERVER所在的内网网段,如果有多个可以写多个push,注意,此命令实际作用是在vpn客户端本地生成VPN SERVER所在的内网网段路由,确保能够和VPN Server所在的内网网段通信。路由条目类似:10.0.0.0 255.255.255.0 10.8.0.9 10.8.0.10 1
client-to-client 允许拨号的多个vpn client互相通信
duplicate-cn 允许多个客户端使用同一个账号连接
keepalive 10 120 每10秒ping一次,若是120秒未收到包,即认定客户端断线
comp-lzo 开启压缩功能
persist-key 当vpn超时后,当重新启动VPN后,保持上一次使用的私钥,而不重新读取私钥。
persist-tun 通过keepalive检测vpn超时后,当重新启动VPN后,保持tun或者tap设备自动连接状态
status openvpn-status.log openvpn日志状态信息
log /var/log/openvpn.log 日志文件
verb 3 指定日志文件冗余

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

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

#生成默认的服务器端配置文件
[root@localhost openvpn]# cd /etc/openvpn/
[root@localhost openvpn]# cp server.conf{,.bak}
[root@localhost openvpn]# egrep -v "#|^$|;" server.conf.bak > server.conf
[root@localhost openvpn]# cat server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3


#将默认的服务器配置文件修改成如下所示:
[root@localhost openvpn]# cat server.conf
local 192.168.0.100         #添加本行(监听的公网网卡IP)
push "route 192.168.200.0 255.255.255.0" #添加本行(VPN内网路由规则)
client-to-client    #添加本行
duplicate-cn    #添加本行
log /var/log/openvpn.log    #添加本行
port 52115  #修改端口
proto tcp   #换成tcp
dev tun
ca /etc/openvpn/keys/ca.crt     #修改本行
cert /etc/openvpn/keys/server.crt   #修改本行
key /etc/openvpn/keys/server.key    #添加本行
dh /etc/openvpn/keys/dh1024.pem     #修改本行
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

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

(1)关闭VPNServer的防火墙

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

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

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

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

(1)启动VPN服务

#启动vpn服务
[root@localhost openvpn]# /usr/local/sbin/openvpn --config /etc/openvpn/server.conf &
[1] 29935
[root@localhost openvpn]# 

#查看vpn端口
[root@localhost openvpn]# netstat -antup | grep vpn
tcp        0      0 192.168.0.100:52115         0.0.0.0:*                   LISTEN      29935/openvpn       

#设置开机自启动
[root@localhost openvpn]# echo "#startup openvpn service by oldboy" >> /etc/rc.local 
[root@localhost openvpn]# echo "/usr/local/sbin/openvpn --config /etc/openvpn/server.conf &" >> /etc/rc.local 
[root@localhost openvpn]# tail -2 /etc/rc.local
tail: inotify cannot be used, reverting to polling
#startup openvpn service by oldboy
/usr/local/sbin/openvpn --config /etc/openvpn/server.conf &

(2)查看VPN启动日志

[root@localhost openvpn]# tail /var/log/openvpn.log 
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
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 ]
Thu Nov 16 23:47:46 2017 Listening for incoming TCP connection on 192.168.0.100:52115
Thu Nov 16 23:47:46 2017 TCPv4_SERVER link local (bound): 192.168.0.100:52115
Thu Nov 16 23:47:46 2017 TCPv4_SERVER link remote: [undef]
Thu Nov 16 23:47:46 2017 MULTI: multi_init called, r=256 v=256
Thu Nov 16 23:47:46 2017 IFCONFIG POOL: base=10.8.0.4 size=62
Thu Nov 16 23:47:46 2017 IFCONFIG POOL LIST
Thu Nov 16 23:47:46 2017 MULTI: TCP INIT maxclients=1024 maxevents=1028
Thu Nov 16 23:47:46 2017 Initialization Sequence Completed

(3)查看VPNserver路由信息

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

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

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

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

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

第五章 安装WindowsVPN客户端配置VPN连接

5.1 下载并安装openvpn客户端

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

5.2 配置并下载客户端证书

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

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

#建立client.conf配置文件
[root@localhost openvpn]# cp client.conf{,.bak}
[root@localhost openvpn]# egrep -v "#|^$|;" client.conf.bak > client.conf 
[root@localhost openvpn]# cat client.conf
client
dev tun
proto udp
remote my-server-1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
verb 3

#将上述配置文件内容,修改成如下所示:
[root@localhost openvpn]# cat client.conf
client
dev tun
proto tcp                       #修改成tcp
remote 192.168.0.100 52115      #修改成VPNserver的外网IP
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert chensiqi.crt               #修改成你的客户端证书名字
key chensiqi.key                #修改成你的客户端证书密码
ns-cert-type server
comp-lzo
verb 3

(3)将ca.crt,chensiqi.crt,chensiqi.key,client.conf 复制到C:\Program Files\OpenVPN\config\chensiqi目录下

QQ截图20171117011626.png-46.4kB

(4)将C:\Program Files\OpenVPN\config\chensiqi\client.conf复制一份,并改名为chensiqi.ovpn放在同路径下。

QQ截图20171117011832.png-233.4kB

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

(1)启动VPN client

双击图标启动openvpn客户端QQ截图20171117012336.png-10kB

在windows虚拟机右下角,出现图标QQ截图20171117012528.png-16.3kB

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

#在网关ADSL上操作
[root@ADSL ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j SNAT --to-source 192.168.0.200   #添加SNAT规则
[root@ADSL ~]# iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 7 packets, 646 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 2 packets, 144 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    60 SNAT       all  --  *      eth0    192.168.100.0/24     0.0.0.0/0           to:192.168.0.200 

Chain OUTPUT (policy ACCEPT 2 packets, 144 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

QQ截图20171117015015.png-12.3kB

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

QQ截图20171117012707.png-15kB

QQ截图20171117015523.png-3.8kB

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

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

QQ截图20171117015807.png-156.8kB

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

(6)查看OpenVPN client端日志

右键点击绿电脑--->View log 如下图所示:

QQ截图20171117020048.png-268.5kB

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

QQ截图20171117020445.png-17.1kB

  • 正常来说,企业内网的ADSL(192.168.0.200)只能转发给同网段VPNServer的外网网卡(192.168.0.100)而找不到VPNServer的内网网卡的网段(192.168.200.100)。
  • 但我们测试的结果却能成功ping通,这说明VPNServer搭建成功了。

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

QQ截图20171117021108.png-21.1kB

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

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

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

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

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

QQ截图20171117022833.png-42.5kB

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

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

#在VPNServer上操作
[root@localhost openvpn]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT --to-source 192.168.200.100
[root@localhost openvpn]# iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 1 packets, 78 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 1 packets, 152 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      eth1    10.8.0.0/24          0.0.0.0/0           to:192.168.200.100 

Chain OUTPUT (policy ACCEPT 1 packets, 152 bytes)
 pkts bytes target     prot opt in     out     source               destination    

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

QQ截图20171117024926.png-9.8kB

OK!我们再次试验成功。

第七章 配置Linux下openvpn客户端

QQ截图20171117205938.png-52.4kB

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

[root@localhost ~]# hostname -I
192.168.100.50 
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.100.200 0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]# service iptables stop
[root@localhost ~]# setenforce 0

7.2 安装openvpn client客户端

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

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

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

(2)安装openvpn软件

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

(3)配置openvpn client


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

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

QQ截图20171117212350.png-6.1kB

[root@localhost openvpn]# pwd
/etc/openvpn
[root@localhost openvpn]# ll
total 20
-rw-r--r--. 1 root root 1363 Nov 17 16:25 ca.crt
-rw-r--r--. 1 root root 3964 Nov 17 16:25 chensiqi.crt
-rw-r--r--. 1 root root  916 Nov 17 16:25 chensiqi.key
-rw-r--r--. 1 root root  186 Nov 17 16:25 chensiqi.ovpn #windows用
-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客户端

[root@localhost openvpn]# /usr/local/sbin/openvpn --config /etc/openvpn/client.conf &

..以下内容省略若干..
Fri Nov 17 16:34:18 2017 /sbin/ifconfig tun0 10.8.0.10 pointopoint 10.8.0.9 mtu 1500
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
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
Fri Nov 17 16:34:18 2017 Initialization Sequence Completed  #出现这个表示成功!
[root@localhost openvpn]# ps -ef | grep openvpn | grep -v grep
root      10556   1274  0 16:34 pts/1    00:00:00 /usr/local/sbin/openvpn --config /etc/openvpn/client.conf

(5)查看网卡信息

[root@localhost openvpn]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:B5:3E:32  
          inet addr:192.168.100.50  Bcast:192.168.100.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feb5:3e32/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3746 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2476 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1803602 (1.7 MiB)  TX bytes:364324 (355.7 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1728 (1.6 KiB)  TX bytes:1728 (1.6 KiB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@localhost openvpn]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.9        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.100.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.8.0.0        10.8.0.9        255.255.255.0   UG    0      0        0 tun0
192.168.200.0   10.8.0.9        255.255.255.0   UG    0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.100.200 0.0.0.0         UG    0      0        0 eth0

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

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

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

7.4 Linux openvpn client 应用场景

(1)多机房或者多个企业网络互联时

(2)办公室的Linux(例如:svn)同步数据到机房某一个内网的机器

QQ截图20171117214929.png-75.6kB

(3)跨机房的重要数据的备份和管理(CDN公司的各个节点数据同步和运维管理)

QQ截图20171110214914.png-60.6kB

第八章 多个IDC机房利用VPN互联架构方案

8.1 多个IDC机房利用VPN互联架构方案逻辑图

QQ截图20171117220842.png-50.9kB

8.2 多个IDC机房利用VPN互联架构方案环境搭建(项目经验-企业灾备之异地跨机房数据备份策略)

搭建过程不提供

  • [x] :知识和原理已经学了,在工作中,我们经常需要自己动手,举一反三的解决架构设计和实施方面的难题。
  • [x] :我不希望同学们学了半天学的都还只是机械化的看文档敲键盘,这真的没有多少意义。
  • [x] :根据知识和原理,举一反三的进行实践,才是运维学习的真正目的。
  • [x] :希望同学们可以通过对于知识的理解,自己自行完成整个项目经验的搭建实验操作。

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

(1)企业之间互联
(2)多机房互联
a.数据同步,备份数据
b.异地数据读取(北京机房web服务写数据到济南机房的MySQL。是否可读?)

  • 读写比例:几十比一所以远程写问题不大,远程读是禁忌。企业用远程写数据库,然后在本地做一个MySQL Slave,本地读数据库。
  • 同一个业务跨机房集群的架构。通过VPN传数据。尽量远程写,本地读。
  • OpenVPN,ipsec做机房互联,更多的是功能应用,大数据传输,实时性要求高,不适合。

QQ截图20171117223858.png-30.1kB

猜你喜欢

转载自www.cnblogs.com/chensiqiqi/p/9162981.html