×××概述:html
×××(Virtual Private NetWork,虚拟专用网络)架设在公共共享的基础设施互联网上,在非信任的网络上创建私有的安全的链接,把分布在不一样地域的办公场所、用户或者商业伙伴互联起来。git
在目前的实践中,常见的×××构建技术:github
PPTP(Point-to-Point Tunneling Protocol,点到点的隧道协议)×××算法
IPSec(Internet Protocol Security,互联网协议安全)×××vim
SSL/TLS(Secure Sockets Layer,安全接口层)×××windows
3种常见×××构建技术对比:安全
PPTP 须要创建2个隧道进行通讯,控制和数据传输分离,其中传输数据使用GRE。在同一个局域网里面的多个内网主机须要创建多条GRE通道链接到同一台×××服务器时,须要在防火墙或者NAT设备上进行特殊设置。bash
IPSec ×××是一个比较成熟的方案,但其配置较复杂,学习成本比较高。IPSec ××× 在商业××× 硬件设备上实现的比较多。服务器
SSL/TLS ××× 工做在用户态,不须要对内核作特殊的修改,可移植性比较高,配置简单,学习成本低(常见:Open×××,Bad×××)。网络
Open××× (当前主流)
功能特性:
对任何IP子网或者虚拟以太网通一个UDP或者TCP端口来创建隧道。
架构一个可扩展的,负载均衡的×××集群系统,同时支持来自上千用户的链接。
使用任意加密算法,能够实现简单的静态密码的传统加密,或者基于证书的公钥私钥加密算法。
对数据流进行实时的压缩。
支持对端节点经过DHCP动态获取IP
NAT 支持,对于面向链接的有状态防火墙,不须要特殊设置。
客户端使用,支持Windows,Mac OS ,Linux
3种实现案例:
Peer-to-Peer ×××,这种场景,将Internet 两台机器(公网地址)使用×××链接起来。
Remote Access ×××(远程访问),该实现方案,旨在解决,移动办公,常常出差不在办公室的,公司生产环境链接。在这个场景种远程访问者通常没有公网IP,他们使用内网地址经过防火墙设备及逆行NAT转换后链接互联网。
SIte-to-Site ××× ,用于链接两个或者多个地域上不一样的局域网LAN,每一个LAN有一台Open××× 服务器做为接入点,组成虚拟专用网络,使得不一样LAN里面的主机和服务器都可以相互通信。
实践案例1:
使用Open××× 建立基于证书验证Remote Access 的×××
物理结构图:
1、安装准备
Open××× 服务器:CetnOS6.8(192.168.1.123,172.16.100.1)
客户端:Windows 10(192.168.1.114) ,Ubuntu 16.0(192.168.0.182)
一、服务端安装依赖库:
OpenSSL,LSZ(一种无损压缩算法),PAM(一种可插入式的身份验证模块)
#安装gcc、openssl、lzo、pam
yum install -y gcc openssl-devel lzo-devel pam-devel
二、网络设置
(1)开启服务器端路由转发功能
# vi /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p 或者: #sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf #sysctl -p
(2)设置nat转发:
注:保证×××地址池可路由出外网 # iptables -t nat -A POSTROUTING -s 172.16.100.0/24 -o eth0 -j MASQUERADE
(3)设置open***端口经过:
# iptables -A INPUT -p UDP --dport 1194 -j ACCEPT # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 重启iptables: 注:这里提一下,INPUT策略是执行后即时生效的,POSTROUTING须要保存并重启服务才能生效 # service iptables saves # service iptables restart
注:此防火墙也能够关闭(则2,3能够不用设置)。
(4)时间同步(重要):
# ntpdate asia.pool.ntp.org
2、安装Open×××服务端
#wget http://swupdate.open***.org/community/releases/open***-2.4.3.tar.gz.asc #tar zxvf open***-2.4.3.tar.gz #cd open***-2.4.3 # ./configure --prefix=/usr/local/open*** # make && make install
3、配置Open×××服务端
配置主要有两个部分:
生成服务器和客户端所需的各类证书。
是编写服务器和客户端所需的配置文件。
(1)下载easy-rsa,建立证书(这部分能够参考"easy-rsa 生成Open×××证书"快速生成全部证书)。
Github 源码2.x
地址:https://github.com/Open×××/easy-rsa/tree/release/2.x
#unzip easy-rsa-release-2.x.zip #cp -rf easy-rsa/ /usr/local/open***/ ########建立CA证书######## #cd /usr/local/open***/easy-rsa/2.0 #source ./vars #初始化命令,用于设置后续命令所需的相关变量信息 NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/open***/easy-rsa/2.0/keys #./clean-all #清除以前建立的全部证书和密钥 #./build-ca #生成CA证书和密钥 Generating a 2048 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) [US]:CN State or Province Name (full name) [California]:SH Locality Name (eg, city) [SanFrancisco]:SH Organization Name (eg, company) [Fort-Funston]:ChangLiang Organizational Unit Name (eg, section) [MyOrganizationalUnit]:DevOps Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:Open×××_CA Name [EasyRSA]: Email Address [me@myhost.mydomain]:liujian@erichfund.com ##咱们的CA证书和密钥就已经生成成功了,生成的证书和密码默认均存放在当前目录keys。 [root@localhost 2.0]#ls keys/ ca.crt ca.key index.txt serial ############建立服务端证书############# 命令./build-key-server ServerName来生成客户端证书和密钥 [root@localhost 2.0]#./build-key-server server#./build-key clientName来生成客户端证书和密钥 Generating a 2048 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) [US]:CN State or Province Name (full name) [California]:SH Locality Name (eg, city) [SanFrancisco]:SH Organization Name (eg, company) [Fort-Funston]:ChangLiang Organizational Unit Name (eg, section) [MyOrganizationalUnit]:DevOps Common Name (eg, your name or your server's hostname) [server]:server Name [EasyRSA]: Email Address [me@myhost.mydomain]:liujian@erichfund.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/local/open***/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:'SH' localityName :PRINTABLE:'SH' organizationName :PRINTABLE:'ChangLiang' organizationalUnitName:PRINTABLE:'DevOps' commonName :PRINTABLE:'server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'liujian@erichfund.com' Certificate is to be certified until Aug 20 05:16:14 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]#ls ./keys/ 01.pem ca.crt ca.key index.txt index.txt.attr index.txt.old serial serial.old server.crt server.csr server.key ############建立客户端证书############### 命令./build-key clientName来生成客户端证书和密钥 [root@localhost 2.0]#./build-key client1 Generating a 2048 bit RSA private key ........................................................+++ ..................................................+++ writing new private key to 'client1.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) [US]:CN State or Province Name (full name) [California]:SH Locality Name (eg, city) [SanFrancisco]:SH Organization Name (eg, company) [Fort-Funston]:ChangLiang Organizational Unit Name (eg, section) [MyOrganizationalUnit]:DevOps Common Name (eg, your name or your server's hostname) [client1]:Open×××_Client Name [EasyRSA]: Email Address [me@myhost.mydomain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/local/open***/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:'SH' localityName :PRINTABLE:'SH' organizationName :PRINTABLE:'ChangLiang' organizationalUnitName:PRINTABLE:'DevOps' commonName :T61STRING:'Open×××_Client' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'me@myhost.mydomain' Certificate is to be certified until Aug 20 05:34:01 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]#ls ./keys/ 01.pem 02.pem ca.crt ca.key client1.crt client1.csr client1.key index.txt index.txt.attr index.txt.attr.old index.txt.old serial serial.old server.crt server.csr server.key ##########生成迪菲·赫尔曼交换密钥########### 命令为./build-dh(无需额外输入,耐心等待生成完毕便可)。迪菲·赫尔曼交换密钥是一种安全协议,用以对数据进行加密。 #./build-dh ###########生成TLS-auth密钥############ 这一步骤是可选操做。Open×××提供了TLS-auth功能,能够用来抵御Dos、UDP端口淹没***。出于安全考虑,你能够启用该功能;启用该功能,你须要执行命令open*** --genkey --secret keys/ta.key来生成TLS-auth所需的密钥文件。 #/usr/local/open***/sbin/open*** --genkey --secret keys/ta.key 到这里,咱们的证书生成就告一段落了。若是你之后想要生成新的客户端或执行其余操做,只须要先执行命令. ./vars,而后执行相应的命令便可,例如./build-key client2。
证书到这建立完成,看看有哪些证书:
1:CA证书和密钥
2:服务器端证书和密钥。
3:客户端client1的证书和密钥,
4:迪菲·赫尔曼交换密钥 (若是你的KEY_SIZE=1024,则该文件名称为dh1024.pem)。
5:启用tls-auth所需的文件。
其中,服务器端须要用到的文件有:
ca.crt ca.key dh2048.pem (若是最初的变量KEY_SIZE设为1024,这里就是dh1024.pem) server.crt server.key ta.key (若是不开启tls-auth,则无需该文件)
客户端client1须要用到的文件有:
ca.crt client1.crt client1.key (名称client1根据我的设置可能有所不一样) ta.key (若是不开启tls-auth,则无需该文件)
(2)编辑服务器所需的配置文件。
#mkdir -p /usr/local/open***/config #cd /usr/local/open***/config #cp /usr/local/open***/easy-rsa/2.0/keys/{ca.crt,ca.key,server.crt,server.key,ta.key,dh2048.pem} . #ls ca.crt ca.key dh2048.pem server.crt server.key ta.key #cp /opt/open***-2.4.3/sample/sample-config-files/server.conf . #mkdir -p /var/log/open***#建立日志目录 #vim server.conf
local 192.168.1.123 #指定监听的本机IP(由于有些计算机具有多个IP地址),该命令是可选的,默认监听全部IP地址。 port 1194 #指定监听的本机端口号 proto udp #指定采用的传输协议,能够选择tcp或udp ;proto tcp dev tun #指定建立的通讯隧道类型,可选tun或tap,前者工做在三层(TCP/IP),后者工做2层(链路层) ca /usr/local/open***/config/ca.crt #指定CA证书的文件路径 cert /usr/local/open***/config/server.crt #指定服务器端的证书文件路径 key /usr/local/open***/config/server.key #指定服务器端的私钥文件路径 dh /usr/local/open***/config/dh2048.pem #指定迪菲赫尔曼参数的文件路径 server 172.16.100.0 255.255.255.0 #指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.0.0.1。 ifconfig-pool-persist ipp.txt #服务器自动给客户端分配IP后,客户端下次链接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。 push "redirect-gateway def1 bypass-dhcp" #若是启用,该命令将配置全部客户端经过×××重定向其默认 #网络网关,致使全部IP流量(如Web浏览和#和DNS查找)经过××× push "dhcp-option DNS 202.96.209.5" #给客户端推送DNS push "dhcp-option DNS 8.8.8.8" tls-auth /usr/local/open***/config/ta.key 0 #开启TLS-auth,使用ta.key防护***。服务器端的第二个参数值为0,客户端的为1。 keepalive 10 120 #每10秒ping一次,链接超时时间设为120秒。 comp-lzo #开启×××链接压缩,若是服务器端开启,客户端也必须开启 client-to-client #容许客户端与客户端相链接,默认状况下客户端只能与服务器相链接 persist-key persist-tun #持久化选项能够尽可能避免访问在重启时因为用户权限下降而没法访问的某些资源。 status /var/log/open***/open***-status.log log /var/log/open***/open***.log log-append /var/log/open***/open***.log #日志保存路径 verb 4 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 explicit-exit-notify 2 #服务端重启,客户端自动重连 |
注意1(能够不作配置。):
push "redirect-gateway def1 bypass-dhcp" 若是启用,该命令将配置全部客户端经过×××重定向其默认 #网络网关,致使全部IP流量(如Web浏览和#和DNS查找)经过××× push "dhcp-option DNS 202.96.209.5" #给客户端推送DNS client-config-dir ccd #指定文件,对客户端进行细粒度配置(单独给某个客户端推送路由等)。 |
(3)启动Open×××
#/usr/local/open***/sbin/open*** /usr/local/open***/config/server.conf &
#这里要加载server.conf 配置文件启动。
注:启停脚本:
#cp -a /opt/open***-2.4.3/distro/rpm/open***.init.d.rhel /etc/init.d/open*** #建立启动脚本 #ln -sv /usr/local/open***/sbin/open*** /usr/sbin/open*** #启动脚本中会用到,也能够不执行此命令,直接在启动脚本中修改 #vi /etc/init.d/open*** #在85行,修改成:work=/usr/local/open***/config [root@localhost config]#service open*** stop Shutting down open***: [ OK ] [root@localhost config]#service open*** start Starting open***: [ OK ] #添加开机启动 [root@localhost config]#chkconfig --add open*** [root@localhost config]#chkconfig open*** on [root@localhost config]#chkconfig --list | grep 3:on crond 0:off1:off2:on3:on4:on5:on6:off network 0:off1:off2:on3:on4:on5:on6:off open*** 0:off1:off2:on3:on4:on5:on6:off rsyslog 0:off1:off2:on3:on4:on5:on6:off sshd 0:off1:off2:on3:on4:on5:on6:off
4、Open×××客户端安装配置:
一、Linux客户端(Ubuntu16 ):
(1)依赖环境配置:
# apt-get install libpam0g-dev libssl-dev #wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz #tar zxvf lzo-2.06.tar.gz #cd lzo-2.06/ #./configure --prefix=/usr/local/ #make && make install
(2)其下载安装同服务端同样,可是配置文件及证书文件以下:
#mkdir -p /usr/local/open***/config #cd /usr/local/open***/config #scp root@192.168.1.123:/usr/local/open***/easy-rsa/2.0/keys/{client1.crt,client1.key,ca.crt,ca.key,ta.key,dh2048.pem} . # ls ca.crt ca.key client1.crt client1.key client.conf dh2048.pem ta.key #vim client.conf
client #指定当前×××是客户端 dev tun #必须与服务器端的保持一致 proto udp #必须与服务器端的保持一致 remote 192.168.1.123 1194 #指定链接的远程服务器的实际IP地址和端口号 resolv-retry infinite #断线自动从新链接,在网络不稳定的状况下(例如:笔记本电>脑无线网络)很是有用。 nobind #不绑定特定的本地端口号 persist-key persist-tun ca ca.crt #指定CA证书的文件路径 cert client1.crt #指定当前客户端的证书文件路径 key client1.key #指定当前客户端的私钥文件路径 ns-cert-type server #指定采用服务器校验方式 tls-auth ta.key 1 #若是服务器设置了防护DoS等***的ta.key,则必须每一个客户端开 启;若是未设置,则注释掉这一行,同服务端一致。 comp-lzo #启用压缩,与服务器保持一致 log-append /var/log/open***/open***.log verb 4 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 |
(3)启动客户端:
#/usr/local/open***/sbin/open*** /usr/local/open***/config/client.conf &
#客户端一样可使用服务端的启动脚本,只须要修改配置文件为:client.conf
root@ljohn:/usr/local/open***/config# ping 172.16.100.1
PING 172.16.100.1 (172.16.100.1) 56(84) bytes of data.
64 bytes from 172.16.100.1: icmp_seq=1 ttl=64 time=0.477 ms
64 bytes from 172.16.100.1: icmp_seq=2 ttl=64 time=1.09 ms
客户端尝试ping服务器的虚拟IP地址172.16.100.1,顺利ping通。
二、Windows客户端安装配置
windows中只须要安装Open××× GUI,并部署配置文件及客户端证书。
(1)客户端下载地址:https://swupdate.open***.org/community/releases/open***-install-2.4.3-I602.exe
安装过程当中,遇到网络设配器请点击安装,其他默认"Next"便可:
(2)安装完成后在“C:\Program Files\Open×××\config”目录中部署文件:配置文件同上(但后缀名.o***)
(3)启动客户端:
右击桌面 "Opne××× GUI" 以管理员身份运行,再双击任务栏"Opne××× GUI" 图标(或者任务栏右击 "Opne××× GUI",点击 "connect" 链接),链接成功以下图显示。
ping一下Open××× 服务器虚拟IP:172.16.100.1
至此完成基于证书验证Remote Access Open×××的配置,至此客户端能够链接上Open××× Server。
4、客户端访问内网地址配置
方案一:
以上4个步骤已经完成Open×××的配置,可是还不能与内网(192.168.1.198)通讯,地址映射(虚拟主机 ,DMZ均可以,建议用)须要给内网机器添加静态路由:
Linux平台:
[root@CLJJ-10 ~]#route add -net 172.16.100.0/24 gw 192.168.1.123
Windows平台:
C:\WINDOWS\system32>route add -p 172.16.100.0 mask 255.255.255.0 192.168.1.123 metric 3 if 1
Ping 内网环境的IP:192.168.1.198
方案二:
给路由器配置一条静态路由,以下图所示:
注意:若是是3层交换机加一条静态路由,有防火墙还须要开启端口映射及相关策略。
终于完成全部配置,对于出差在外,运维小伙伴,能够躺在家办公了(想得美)。
*****************************FAQ******************************
一、Authenticate/Decrypt packet error: cipher final failed
编辑server.conf 配置文件
注释:cipher AES-256-CBC
二、
Authenticate/Decrypt packet error: packet HMAC authentication failed
TLS Error: incoming packet authentication failed
TLS Error: cannot locate HMAC in incoming packet from [AF_INET]192.168.1.123:1194
注:这三个错误都源于这个tls-auth 认证问题,只须要服务端和客户端关闭此功能便可解决:在此行加上; 分号。若是须要开启能够关闭后再尝试开启
参考资料: