(一)加密隧道:

(1)概述:{加密隧道解决的是解决2点之间传输数据}

①方案1:专线,但是成本高




②硬件设备3层路由,硬件设备,vpn virtual,private,network虚拟专有网络,深信服vpn




③开源软件:

1、pptp:不推荐,使用简单,不是很稳定,依赖于网络设备的支持



2、openvpn:实现用户、运维、开发、访问网站内网



3、ipsec



4、openswan:用于实现两个局域网内网互通




④场景:

1、运营部门



2、开发



3、运维




⑤加密隧道的原理:

1、客户端和服务端都安装openvpn软件



2、客户端向服务端请求ip



3、客户端拿着这个服务端分配的ip来到了服务端,服务端开启了内核转发



4、数据就被转到了自己要访问的内网机器



5、在内网机器上添加路由之后,然后数据包就顺着添加的路由到了openvpn的服务端



6、然后路由到了服务端之后,因为开启了内核转发,因为进来的时候记录这vpn的地址对应的网卡,所以出去的时候也会按照这个网卡出去



7、最后就把这个数据包发送了用户




(2)加密隧道的创建:

①环境准备:

openvpn_内网

1、清除防火墙规则:

[root@e303-master ~]# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)

target prot opt source destination


Chain INPUT (policy ACCEPT)

target prot opt source destination


Chain OUTPUT (policy ACCEPT)

target prot opt source destination


Chain POSTROUTING (policy ACCEPT)

target prot opt source destination

[root@e303-master ~]# iptables -t filter -nL

Chain INPUT (policy ACCEPT)

target prot opt source destination


Chain FORWARD (policy ACCEPT)

target prot opt source destination


Chain OUTPUT (policy ACCEPT)

target prot opt source destination

[root@e303-master ~]#



2、安装openvpn和证书创建工具:

[root@e303-master ~]# yum -y install openvpn easy-rsa



3、创建ca的证书文件夹

[root@e303-master ~]# mkdir -p /etc/openvpn/easy-rsa



4、复制模板的信息将3.0.8的信息全部放到新建的目录下

[root@e303-master ~]# cp -rf /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa/



5、复制vars的文件到目录下

[root@e303-master ~]# cp -f /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars



6、将vars的没注释的信息拿出来写出来,然后写入ca的证书信息,自定义的

[root@e303-master ~]# cat /etc/openvpn/easy-rsa/vars

if [ -z "" ]; then

echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2

echo "This is no longer necessary and is disallowed. See the section called" >&2

echo "'How to use this file' near the top comments for more details." >&2

return 1

fi


set_var EASYRSA_DN "cn_only"

set_var EASYRSA_REQ_COUNTRY "CN"

set_var EASYRSA_REQ_PROVINCE "Beijing"

set_var EASYRSA_REQ_CITY "Beijing"

set_var EASYRSA_REQ_ORG "itter"

set_var EASYRSA_REQ_EMAIL "981992239@qq.com"

set_var EASYRSA_NS_SUPPOPT "yes"

[root@e303-master ~]#




②创建ca证书:

1、初始化,在当前目录创建PKI目录,用于存储证书

[root@e303-master easy-rsa]# pwd

/etc/openvpn/easy-rsa

[root@e303-master easy-rsa]# ./easyrsa init-pki


Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars //初始化完成,显示创建的CA证书


init-pki complete; you may now create a CA or requests.

Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki //初始化的目录在哪里



2、创建根证书,会提示设置密码,用于ca对之后生成的server和client证书签名时使用,其他可默认:{加上密码}

[root@e303-master easy-rsa]# ./easyrsa build-ca

Enter New CA Key Passphrase:

Re-Enter New CA Key Passphrase:


Common Name (eg: your user, host, or server name) [Easy-RSA CA]:www.ipran.com //输入域名


CA creation complete and you may now import and sign cert requests.

Your new CA certificate file for publishing is at:

/etc/openvpn/easy-rsa/pki/ca.crt

[root@e303-master easy-rsa]#



3、目录结构:

[root@e303-master easy-rsa]# tree -F

.

├── easyrsa* //管理命令

├── openssl-easyrsa.cnf

├── pki/

│   ├── ca.crt //ca证书

│   ├── certs_by_serial/

│   ├── index.txt

│   ├── index.txt.attr

│   ├── issued/

│   ├── openssl-easyrsa.cnf

│   ├── private/

│   │   └── ca.key

│   ├── renewed/

│   │   ├── certs_by_serial/

│   │   ├── private_by_serial/

│   │   └── reqs_by_serial/

│   ├── reqs/

│   ├── revoked/

│   │   ├── certs_by_serial/

│   │   ├── private_by_serial/

│   │   └── reqs_by_serial/

│   ├── safessl-easyrsa.cnf

│   └── serial

├── vars //创建ca证书使用的变量和内容,充当权威机构

└── x509-types/

├── ca

├── client

├── code-signing

├── COMMON

├── email

├── kdc

├── server

└── serverClient


14 directories, 18 files

[root@e303-master easy-rsa]#




③创建server端证书和私钥文件:

1、创建请求文件以服务端私钥,nopass表示不加秘钥文件,其他可默认:{大概意思是准备创建需要报备}

[root@e303-master easy-rsa]# ./easyrsa gen-req server nopass

Common Name (eg: your user, host, or server name) [server]: //不输入直接回车


Keypair and certificate request completed. Your files are:

req: /etc/openvpn/easy-rsa/pki/reqs/server.req //请求文件

key: /etc/openvpn/easy-rsa/pki/private/server.key //私钥

[root@e303-master easy-rsa]#



2、正式创建:根据req文件生成ca证书{通过了就盖章签发的意思}

[root@e303-master easy-rsa]# ./easyrsa sign server server

Request subject, to be signed as a server certificate for 825 days:


subject=

commonName = server


Type the word 'yes' to continue, or any other input to abort.

Confirm request details: yes //确认上面的信息,回答yes或者no

Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-2332.RJS493/tmp.Ztzhr3

Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: //输入密码,这个密码是创建ca根证书的时候所用的密码

Check that the request matches the signature

Signature ok //创建完成的提示

The Subject's Distinguished Name is as follows

commonName :ASN.1 12:'server'

Certificate is to be certified until Sep 1 03:24:37 2024 GMT (825 days)


Write out database with 1 new entries

Data Base Updated


Certificate created at: /etc/openvpn/easy-rsa/pki/issued/server.crt //创建证书完成的server用的证书,存放的位置

[root@e303-master easy-rsa]#




④客户端证书和秘钥:

1、创建客户端证书和私钥文件,nopass表示不加密私钥文件,其他默认:{client这个名字是自定义的,不是固定的}

[root@e303-master easy-rsa]# ./easyrsa gen-req client nopass

You appear to be sourcing an Easy-RSA 'vars' file.

Common Name (eg: your user, host, or server name) [client]: //直接回车,不用写信息

Keypair and certificate request completed. Your files are:

req: /etc/openvpn/easy-rsa/pki/reqs/client.req //请求文件

key: /etc/openvpn/easy-rsa/pki/private/client.key //私钥文件

[root@e303-master easy-rsa]#



2、给client端证书签名,首先是对一些信息的确认,输入yes,然后创建ca根证书时设置的密码

[root@e303-master easy-rsa]# ./easyrsa sign client client

You appear to be sourcing an Easy-RSA 'vars' file.

Certificate created at: /etc/openvpn/easy-rsa/pki/issued/client.crt //创建完成

[root@e303-master easy-rsa]#



3、创建dh-pem算法文件和目录汇总:{创建Diffie-Hellman文件,私钥交换时的Diffie-Hellman算法}

[root@e303-master easy-rsa]# ./easyrsa gen-dh //仅执行一次

DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem //算法文件存放的位置



4、证书和私钥创建完毕:{这是存放的位置}

/etc/openvpn/easy-rsa/pki/issued/client.crt


key: /etc/openvpn/easy-rsa/pki/private/client.key


etc/openvpn/easy-rsa/pki/dh.pem




⑤总结:

1、创建vars文件{伪装ca机构},创建ca证书:

easyrsa build-ca


./easyrsa init-pki



2、创建server证书和秘钥:

easyrsa gen-req server nopass


easyrsa sign server server



3、创建client证书和私钥:

easyrsa gen-req client nopass


easyrsa sign client client



4、dh.pem文件



5、目录结构:{没用的删掉了}

[root@e303-master easy-rsa]# tree -F

.

├── easyrsa* //证书,私钥管理命令

├── openssl-easyrsa.cnf

├── pki/

│   ├── ca.crt //ca证书

│   ├── dh.pem //算法文件

│   ├── issued/ //存放证书

│   │   ├── client.crt //客户端证书

│   │   └── server.crt //服务端证书

│   ├── openssl-easyrsa.cnf

│   ├── private/

│   │   ├── ca.key //ca私钥

│   │   ├── client.key //客户端私钥

│   │   └── server.key //服务端私钥

├── vars //创建ca证书对的时候读取的内容,让我们可以充当权威机构创建证书

[root@e303-master easy-rsa]#





(3)服务端配置文件:

openvpn_内网_02

①服务端的配置文件:

1、指定各个文件的路径

[root@e303-master server]# cat /etc/openvpn/server/server.conf

[root@e303-master server]# cat /etc/openvpn/server/server.conf

port 1194

proto udp

dev tun

ca server/ca.crt

cert server/server.crt

key server/server.key

dh server/dh.pem

server 10.8.0.0 255.255.255.0

push "route 172.1.1.0 255.255.255.0"

#ifconfig-pool-persist ipp.txt

keepalive 10 120

max-clients 100

status /var/log/openvpn-status.log

log /var/log/openvpn.log

verb 6

client-to-client

persist-key

persist-tun

duplicate-cn

[root@e303-master server]#




②复制秘钥等文件到指定的位置中:

[root@e303-master server]# cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/



[root@e303-master server]# cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/



[root@e303-master server]# cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/server/



[root@e303-master server]# cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/server/




③启动:{修改启动文件}

1、修改配置文件的启动路径:{先查看路径}

[root@e303-master server]# systemctl cat openvpn@

# /usr/lib/systemd/system/openvpn@.service

[Unit]

Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I

After=network.target


[Service]

Type=notify

PrivateTmp=true

ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf


[Install]

WantedBy=multi-user.target



2、修改路径:{在修改路径}

[root@e303-master server]# cat /usr/lib/systemd/system/openvpn@.service

[Unit]

Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I

After=network.target


[Service]

Type=notify

PrivateTmp=true

ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i/%i.conf


[Install]

WantedBy=multi-user.target

[root@e303-master server]#



3、重载配置:

[root@e303-master server]# systemctl daemon-reload



4、开机启动:

[root@e303-master server]# systemctl enable openvpn@server



5、启动:{@后面的内容就是百分号i的内容,@后面写server百分号就是server目录下的server.conf,未来要是客户端那就是client,那就是目录下的client下的.conf}

[root@e303-master server]# systemctl start openvpn@server




④检查:

1、[root@e303-master server]# ss -lntup|grep 1194


udp UNCONN 0 0 *:1194 *:* users:(("openvpn",pid=6466,fd=5))



2、[root@e303-master server]# ps -ef|grep openvpn

root 6466 1 0 23:42 ? 00:00:00 /usr/sbin/openvpn --cd /etc/openvpn/ --config server/server.conf

root 6916 6249 0 23:51 pts/2 00:00:00 grep --color=auto openvpn

[root@e303-master server]#



3、会出现一个网卡:

4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100

link/none

inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0

valid_lft forever preferred_lft forever

inet6 fe80::262c:7c41:8e1f:1c2f/64 scope link flags 800

valid_lft forever preferred_lft forever

[root@e303-master server]#



4、开启内核转发:

1.添加配置:

[root@e303-master ~]# cat /etc/sysctl.conf

net.ipv4.ip_forward = 1


2.重新生效:

[root@e303-master ~]# sysctl -p

net.ipv4.ip_forward = 1

[root@e303-master ~]#



5、在内网服务器添加路由:{10.8.0.0是服务器端tun0的网段,172.1.1.10是服务端私网的ip地址}

1.方法1:临时添加路由:

[root@e303-node1 ~]# route add -net 10.8.0.0/24 gw 172.1.1.10


2.方法2:永久添加路由:

[root@e303-node1 ~]# cat /etc/rc.local

route add -net 10.8.0.0/24 gw 172.1.1.10


3.方法3:或者在内网服务器上将内网的网关设置为openvpn服务端的内网的ip



6、可以抓包看看是否有数据包:

[root@e303-master ~]# tcpdump -i ens37 -i tun0 -nnn icmp




⑤总结:服务端文件详解

[root@e303-master server]# grep -v -E '^$|#|;' /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf

port 1194 //端口


proto udp //协议,性能好


dev tun //采用路由隧道模式tun,指定网卡tun网卡


ca ca.crt //ca证书的位置 /etc/openvpn /etc/openvpn/server/ca.crt


cert server.crt //服务端公钥名称/etc/openvpn


key server.key //服务端私钥名称 /etc/openvpn


dh dh2048.pem //算法文件,交换证书,效验算法/etc/openvpn


server 10.8.0.0 255.255.255.0 //给客户端分配地址,但是不能和vpn服务器内网网段有相同的


push "route 172.1.1.0 255.255.255.0" //客户端连接之后,推送客户端的路由规则,让客户端知道如果想访问172.1.1.0,那就需要找openvpn服务端,172.1.1.0这个地址段是服务器内部的私网网段,这里可以追加多条,有几个网段就写几个


ifconfig-pool-persist ipp.txt //地址池文件位置,未来让openvpn客户端固定ip地址使用的


keepalive 10 120 //存活时间,10秒ping一次,120秒如果没收到则视为断线


max-clients 100 //最多允许100个客户端连接


status /var/log/openvpn-status.log //日志记录位置,openvpn状态


log /var/log/openvpn.log //openvpn日志记录位置


verb 3 //日志输出级别,数字越大越详细,最多11


client-to-client //客户端和客户端支持通信


persist-key //通过keeplive检测超时后,重新启动vpn,不重新读取keys,保留第一次使用的keys,对私钥进行缓存


persist-tun //检测超时后,重新启动vpn,一直保持tun是linkup的,否则网络会先linkdown然后再linkup


duplicate-cn //客户端秘钥{证书和私钥}是否可以重复





(4)客户端配置文件:{建议按照网站进行存放}

①windows客户端配置案例:

1、下载openvpn的客户端,安装完成后,会生成一个C:\Program Files\OpenVPN\config的目录



2、新建一个文件夹用来存在某个网站的vpn配置:C:\Program Files\OpenVPN\config\www.ipran.com



3、在C:\Program Files\OpenVPN\config\www.ipran.com的这文件夹下面新建一个文件,文件的名字是client.ovpn的配置文件,内容如下:

client

dev tun

proto udp

remote 172.18.152.50 1194

resolv-retry infinite

nobind

ca ca.crt

cert client.crt

key client.key

verb 3

persist-key



4、将三个文件下载到windows的目录下:

openvpn_服务端_03

[root@e303-master pki]# ls -l /etc/openvpn/easy-rsa/pki/ca.crt


[root@e303-master pki]# ls -l /etc/openvpn/easy-rsa/pki/issued/client.crt


[root@e303-master pki]# ls -l /etc/openvpn/easy-rsa/pki/private/client.key

[root@e303-master pki]#



5、连接:{点击图标进行连接}

openvpn_客户端_04



6、测试:

在客户端pingo penvpn服务端的私网地址看通不通


在客户端ping 私网服务的地址看通不通




②linux客户端:

1、先安装openvpn的软件:

[root@master ~]# yum -y install openvpn easy-rsa



2、修改客户端的启动文件:

[root@master client]# cat /usr/lib/systemd/system/openvpn@.service

[Unit]

Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I

After=network.target


[Service]

Type=notify

PrivateTmp=true

ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i/%i.conf


[Install]

WantedBy=multi-user.target

[root@master client]#



3、配置秘钥ca等的位置:

[root@master client]# cat /etc/openvpn/client/client.conf

client

dev tun

proto udp

remote 172.18.152.50 1194

resolv-retry infinite

nobind

ca client/ca.crt

cert client/client.crt

key client/client.key

verb 3

persist-key

[root@master client]# pwd

/etc/openvpn/client

[root@master client]# ll

-rw-r--r-- 1 root root 1180 May 30 10:55 ca.crt

-rw-r--r-- 1 root root 163 May 31 14:50 client.conf

-rw-r--r-- 1 root root 4440 May 30 11:55 client.crt

-rw-r--r-- 1 root root 1704 May 30 11:48 client.key

[root@master client]#



4、启动:

[root@master client]# systemctl enable openvpn@client


[root@master client]# systemctl start openvpn@client



5、检查:

[root@master client]# ps -ef|grep openvpn

root 2439 1 0 14:50 ? 00:00:00 /usr/sbin/openvpn --cd /etc/openvpn/ --config client/client.conf

root 2456 2293 0 14:52 pts/0 00:00:00 grep --color=auto openvpn

[root@master client]#


[root@master client]# ss -tlupn|grep openvpn

udp UNCONN 0 0 *:59251 *:* users:(("openvpn",pid=2439,fd=3))

[root@master client]#



6、检查是否生成了虚拟网卡:

[root@master client]# ip ad s

3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100

link/none

inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0

valid_lft forever preferred_lft forever

inet6 fe80::6ac6:f159:f8ee:3ff6/64 scope link flags 800

valid_lft forever preferred_lft forever

[root@master client]#



7、ping测试:

[root@master client]# ping 172.1.1.11

PING 172.1.1.11 (172.1.1.11) 56(84) bytes of data.

64 bytes from 172.1.1.11: icmp_seq=1 ttl=63 time=2.01 ms

64 bytes from 172.1.1.11: icmp_seq=2 ttl=63 time=1.22 ms

64 bytes from 172.1.1.11: icmp_seq=3 ttl=63 time=1.39 ms




③客户端连接配置文件详解:

client //指定当前vpn是客户端


dev tun //使用tun隧道传输协议


proto udp //使用udp协议传输数据


remote 10.8.0.1 1194 //openvpn服务器ip地址端口号


resolv-retry infinite //断线自动重新连接在,在网络不稳定的情况下有用


nobind //不绑定本地特定的端口,源端口随机


ca ca.crt //指定ca证书的文件路径


cert client.crt //指定当前客户端的证书文件路径,相对于配置文件


key client.key //指定当前客户端的私钥文件路径


verb 3 //指定日志文件的详细级别,可选0-9,等级越高内容越详细


persist-key //通过keepalive检测超时后,重新启动vpn,不重新读取keys,保留第一次使用的keys





(5)openvpn客户端的认证:

①概述:

1、让客户端连接服务器的时候需要输入用户名和密码



2、实现:在服务端设置脚本,服务端等待客户端连接的时候,调用这个脚本,匹配用户名和密码




②配置服务端:{让服务端支持密码认证}

1、编辑etc/openvpn/server/server.conf增加3行,之前的不要删除:

[root@e303-master ~]# cat /etc/openvpn/server/server.conf

port 1194

proto udp

dev tun

ca server/ca.crt

cert server/server.crt

key server/server.key

dh server/dh.pem

server 10.8.0.0 255.255.255.0

push "route 172.1.1.0 255.255.255.0"

#ifconfig-pool-persist ipp.txt

keepalive 10 120

max-clients 100

status /var/log/openvpn-status.log

log /var/log/openvpn.log

verb 3

client-to-client

persist-key

persist-tun

duplicate-cn


script-security 3

auth-user-pass-verify /etc/openvpn/check.sh via-env

username-as-common-name

[root@e303-master ~]#



2、书写密码脚本文件:

[root@e303-master ~]# cat /etc/openvpn/check.sh

#!/bin/sh

#desc: openvpn uesr check scripts

#author:

###########################################################

PASSFILE="/etc/openvpn/openvpnfile"

LOG_FILE="/var/log/openvpn-password.log"

TIME_STAMP=`date "+%Y-%m-%d %T"`


if [ ! -r "${PASSFILE}" ]; then

echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}

exit 1

fi


CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`


if [ "${CORRECT_PASSWORD}" = "" ]; then

echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}

exit 1

fi

if [ "${password}" = "${CORRECT_PASSWORD}" ]; then

echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}

exit 0

fi

echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}

exit 1


[root@e303-master ~]#



3、书写账号和密码:

[root@e303-master ~]# cat /etc/openvpn/openvpnfile

wuyun 123456

an 123456

[root@e303-master ~]#



4、设置权限:

1.设置etc/openvpn/openvpnfile的密码为600,里面保存的是账户和密码:

[root@e303-master ~]# chmod 600 /etc/openvpn/openvpnfile

[root@e303-master ~]#


2.设置脚本检查的权限:

[root@e303-master ~]# chmod 700 /etc/openvpn/check.sh

[root@e303-master ~]#



5、重启:

[root@e303-master ~]# systemctl restart openvpn@server

[root@e303-master ~]#



6、服务端增加几条配置的含义:

script-security 3 //允许使用自定义脚本


auth-user-pass-verify /etc/openvpn/check.sh via-env //指定认证脚本


username-as-common-name //用户密码登录方式验证




③客户端配置:

1、打开路径:C:\Program Files\OpenVPN\config\www.ipran.com里面的client.ovpn文件{客户端配置文件添加最后一行}

client

dev tun

proto udp

remote 172.18.152.50 1194

resolv-retry infinite

nobind

ca ca.crt

cert client.crt

key client.key

verb 3

persist-key

auth-user-pass



2、重新连接,会弹出账户和密码界面验证

openvpn_服务端_05






(二)自动化实现openvpn:

(1)自动化建议:

①通过shell 脚本




②自动创建证书对




③创建用户名和密码,保存到对应文件




④通过邮件发送这些信息给对应的人员