VPN简介
VPN(全称:Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信的网络技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的链接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现的。
VPN应用场景
VPN的作用
VPN的功能是帮助公司的远程用户(出差,在家)、公司的分支机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者是局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网来处理相关事宜。
VPN的分类
根据不同的划分标准,VPN可以按几个标准进行分类划分:
L2TP(第2等隧道协议)
IPSec(三层隧道协议)
SSL VPN
Open VPN介绍
专用网: 专用网就是在两个网络(例如,北京和上海)之间假设一条专用线路,但是它并不需要真正的去铺设光缆之类的物理线路。虽然没有亲自去铺设,但是需要向电信运营商申请租用专线,在这条专用的线路上只传输自己的信息,所以安全稳定,同时费用也高昂。
Open VPN是Linux开源VPN的经典产品,他提供了良好的访问性能和友好的用户GUI(用户界面)。Open VPN是一个用于创建虚拟专用网络加密通道的软件包。一个实现VPN的开源软件,Opne VPN是一个高度灵活的VPN守护进程。它支持SSL/TLS安全、Ethernet bridging、经由代理的TCP或者UDP隧道和NAT。另外,它也支持动态IP地址以及DHCP,可伸缩性足以支持数百或者数千用户的使用场景,同时可移植至大多数主流操作系统平台上。
OpenVPN依赖的SSL与TLS协议介绍
SSL(Secure Socket Layer)协议
即安全套接字层协议
,TLS(Transport Layer Security)协议
即安全传输层协议
。在内网中部署Open VPN
公网ip 内网ip 主机名
192.168.15.61 172.16.1.61 m01
1. 安装Open VPN和证书生成工具
1. 添加Open VPN的epel源
vim /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
2. 重载yum缓存
yum clean all
yum makecache
3. 安装open
yum -y install open
4. 安装证书生成工具
yum -y install easy-rsa
2. 准备服务端相关的配置文件
1. 生成服务器配置文件
cp /usr/share/doc/open-2.4.11/sample/sample-config-files/server.conf /etc/open/
2. 准备证书签发相关文件(服务端)
cp -r /usr/share/easy-rsa/ /etc/open/easy-rsa-server
3. 准备签发证书相关变量的配置文件(服务端)
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/open/easy-rsa-server/3/vars
4. 建议修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长
vim /etc/open/easy-rsa-server/3/vars
...
# CA的证书有效期默为为10年,可以适当延长,比如:36500天
set_var EASYRSA_CA_EXPIRE 36500
# 服务器证书默为为825天,可适当加长,比如:3650天
set_var EASYRSA_CERT_EXPIRE 3650
...
3. 创建服务端证书
1. 初始化PKI生成PKI相关目录和文件
cd /etc/open/easy-rsa-server/3
# 执行该命令,会在当前目录下生成一个pki目录
./easyrsa init-pki
2. 生成CA证书
# 执行该命令,会在当前pki目录下生成ca证书文件ca.crt
./easyrsa build-ca nopass
3. 通过CA证书申请服务端证书
./easyrsa gen-req server nopass
# Keypair and certificate request completed. Your files are:
# req: /etc/open/easy-rsa-server/3/pki/reqs/server.req 生成请求文件
# key: /etc/open/easy-rsa-server/3/pki/private/server.key 生成私钥文件
4. 签发服务端证书
./easyrsa sign server server
# Confirm request details: yes
5. 查看证书相关的文件
cat pki/serial
# 3E304DE51FF8CAA28FB9395C314DA59E
cat pki/index.txt 需要pki/serial文件一样
# V 310607080001Z 3E304DE51FF8CAA28FB9395C314DA59D unknown /CN=server
6. 对服务端证书进行加密
./easyrsa gen-dh
# DH parameters of size 2048 created at /etc/open/easy-rsa-server/3/pki/dh.pem
4. 准备客户端相关的配置文件
1. 准备证书签发相关文件(客户端)
cp -r /usr/share/easy-rsa/ /etc/open/easy-rsa-client
2. 准备签发证书相关变量的配置文件(客户端)
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/open/easy-rsa-client/3/varsa
3. 建议修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长
vim /etc/open/easy-rsa-client/3/varsa
...
# CA的证书有效期默为为10年,可以适当延长,比如:36500天
set_var EASYRSA_CA_EXPIRE 36500
# 服务器证书默为为825天,可适当加长,比如:3650天
set_var EASYRSA_CERT_EXPIRE 3650
...
5. 创建客户端证书
1. 初始化PKI生成PKI相关目录和文件
cd /etc/open/easy-rsa-client/3
# 执行该命令,会在当前目录下生成一个pki目录
./easyrsa init-pki
2. 通过CA证书申请客户端证书
./easyrsa gen-req nana nopass
# Keypair and certificate request completed. Your files are:
# req: /etc/open/easy-rsa-client/3/pki/reqs/nana.req 生成请求文件
# key: /etc/open/easy-rsa-client/3/pki/private/nana.key 生成私钥文件
3. 将客户端证书请求文件复制到CA的工作目录
cd /etc/open/easy-rsa-server/3
./easyrsa import-req /etc/open/easy-rsa-client/3/pki/reqs/nana.req lala
4. 签发客户端证书
./easyrsa sign client lala
# Confirm request details: yes
5. 查看证书相关的文件
cat pki/index.txt
# V 310607080001Z 3E304DE51FF8CAA28FB9395C314DA59D unknown /CN=server
# V 310607091522Z 670BF79D5806DF4CCE973EFA77D7AA3A unknown /CN=nana
ll pki/certs_by_serial/
# total 16
# -rw------- 1 root root 4547 Jun 9 16:00 3E304DE51FF8CAA28FB9395C314DA59D.pem
# -rw------- 1 root root 4426 Jun 9 17:15 670BF79D5806DF4CCE973EFA77D7AA3A.pem
ll pki/issued/
# total 16
# -rw------- 1 root root 4426 Jun 9 17:15 lala.crt 客户端证书
# -rw------- 1 root root 4547 Jun 9 16:00 server.crt 服务端证书
OpenVPN 配置文件说明
grep -Ev "^#|^$" /etc/open/server.conf
;local a.b.c.d #本机监听IP,默认为本机所有IP
port 1194 #端口
;proto tcp #协议,生产推荐使用TCP
proto udp #默认协议
;dev tap #创建一个以太网隧道,以太网使用tap,一个tap设备允许完整的以太网帧通过Open隧道,可提供非ip协议的支持,比如IPX协议和AppleTalk协议,tap等同于一个以太网设备,它操作第二层数据包如以太网数据帧。
dev tun #创建一个路由IP隧道,生产推存使用tun.互联网使用tun,一个tun设备大多时候,被用于基于IP协议的通讯。tun模拟了网络层设备,操作第三层数据包比如IP数据封包。
;dev-node MyTap #TAP-Win32适配器。非windows不需要配置
ca ca.crt #ca证书文件
cert server.crt #服务器证书文件
key server.key #服务器私钥文件
dh dh2048.pem #dh参数文件
;topology subnet
server 10.8.0.0 255.255.255.0 #客户端连接后分配IP的地址池,服务器默认会占用第一个IP 10.8.0.1将做为客户端的网关
ifconfig-pool-persist ipp.txt #为客户端分配固定IP,不需要配置,建议注释
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 #配置网桥模式,不需要配置,建议注释
;server-bridge
;push "route 192.168.10.0 255.255.255.0" #给客户端生成的到达服务器后面网段的静态路由,下一跳为open服务器的10.8.0.1
;push "route 192.168.20.0 255.255.255.0" #推送路由信息到客户端,以允许客户端能够连接到服务器背后的其它私有子网
;client-config-dir ccd #为指定的客户端添加路由,此路由通常是客户端后面的内网网段而不是服务端的,也不需要设置
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script #运行外部脚本,创建不同组的iptables规则,无需配置
;push "redirect-gateway def1 bypass-dhcp" #启用后,客户端所有流量都将通过VPN服务器,因此生产一般无需配置此项
;push "dhcp-option DNS 208.67.222.222" #推送DNS服务器,不需要配置
;push "dhcp-option DNS 208.67.220.220"
;client-to-client #允许不同的client直接通信,不安全,生产环境一般无需要配置
;duplicate-cn #多个用户共用一个证书,一般用于测试环境,生产环境都是一个用户一个证书,无需开启
keepalive 10 120 #设置服务端检测的间隔和超时时间,默认为每10秒ping一次,如果 120 秒没有回应则认为对方已经down
tls-auth ta.key 0 #访止DoS等攻击的安全增强配置,可以使用以下命令来生成:open --
genkey --secret ta.key #服务器和每个客户端都需要拥有该密钥的一个拷贝。第二个参数在服务器端应该为’0’,在客户端应该为’1’
cipher AES-256-CBC #加密算法
;compress lz4-v2 #启用Open2.4.X新版压缩算法
;push "compress lz4-v2" #推送客户端使用新版压缩算法,和下面的comp-lzo不要同时使用
;comp-lzo #旧户端兼容的压缩配置,需要客户端配置开启压缩,open2.4.X等新版可以不用开启
;max-clients 100 #最大客户端数
;user nobody #运行open服务的用户和组
;group nobody
persist-key #重启VPN服务时默认会重新读取key文件,开启此配置后保留使用第一次的key文件,生产环境无需开启
persist-tun #启用此配置后,当重启服务时,一直保持tun或者tap设备是up的,否则会先down然后再up,生产环境无需开启
status open-status.log #openVPN状态记录文件,每分钟会记录一次
;log open.log #第一种日志记录方式,并指定日志路径,log会在open启动的时候清空日志文件,不建议使用
;log-append open.log #第二种日志记录方式,并指定日志路径,重启open后在之前的日志后面追加新的日志,生产环境建议使用
verb 3 #设置日志级别,0-9,级别越高记录的内容越详细,0 表示静默运行,只记录致命错误,4 表示合理的常规用法,5 和 6 可以帮助调试连接错误。9 表示极度冗余,输出非常详细的日志信息
;mute 20 #相同类别的信息只有前20条会输出到日志文件中
explicit-exit-notify 1 #通知客户端,在服务端重启后自动重新连接,仅能用于udp模式,tcp模式不需要配置即可实现断开重新连接,且开启此项后tcp配置后将导致open服务无法启动,所以tcp时必须不能开启此项
启动open 服务
1. 修改服务端配置文件
> /etc/open/server.conf
vim /etc/open/server.conf
port 1194
proto tcp
dev tun
ca /etc/open/certs/ca.crt
cert /etc/open/certs/server.crt
key /etc/open/certs/server.key
dh /etc/open/certs/dh.pem
server 10.8.0.0 255.255.255.0
push "route 172.16.1.0 255.255.255.0" # 内网网段
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user open
group open
status /var/log/open/open-status.log
log-append /var/log/open/open.log
verb 3
mute 20
2. 创建open用户
getent passwd open
# open:x:998:996:OpenVPN:/etc/open:/sbin/nologin
3. 创建open日志文件,并修改属主属组
mkdir /var/log/open
chown open.open /var/log/open
ll -d /var/log/open
# drwxr-xr-x 2 open open 6 Jun 9 18:45 /var/log/open
4. 将服务端证书密钥文件移动到open配置文件指定的目录下
mkdir /etc/open/certs
cp /etc/open/easy-rsa-server/3/pki/ca.crt /etc/open/certs
cp /etc/open/easy-rsa-server/3/pki/dh.pem /etc/open/certs
cp /etc/open/easy-rsa-server/3/pki/issued/server.crt /etc/open/certs
cp /etc/open/easy-rsa-server/3/pki/private/server.key /etc/open/certs
5. 服务端开启防火墙转发功能
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf # 开启网卡转发功能,写入内核配置文件
sysctl -p # 重载网卡内核配置文件
yum install iptables-services -y # 下载iptables命令
systemctl disable --now firewalld # 关闭防火墙
systemctl start iptables # 启动iptables防火墙,需要通过iptables防火墙进行转发
iptables -F # 清除防火墙配置,允许所有的IP地址进行访问
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE # 将10.8.0.0/24网段添加到NAT链路列表中
iptables -vnL -t nat # 查看NAT链路列表
6. 启动open服务
systemctl daemon-reload
systemctl enable --now open@server
7. 查看端口号和ip地址
netstat -lntp
# tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 18589/open
ip a
# tun0: 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
创建open 客户端配置文件
1. 修改客户端配置文件
mkdir -p /etc/open/client/nana/
vim /etc/open/client/nana/client.o
client
dev tun
proto tcp
remote 192.168.15.61 1194 #生产中为OpenVPN公网IP
resolv-retry infinite
nobind
ca ca.crt
cert lala.crt
key nana.key
remote-cert-tls server
cipher AES-256-CBC
verb 3 #此值不能随意指定,否则无法通信
compress lz4-v2 #此项在OpenVPN2.4.X版本使用,需要和服务器端保持一致,如不指定,默认使用comp-lz压缩
2. 将客户端证书密钥文件移动到open配置文件指定的目录下
cp /etc/open/easy-rsa-client/3/pki/private/nana.key /etc/open/client/nana/
cp /etc/open/easy-rsa-server/3/pki/issued/lala.crt /etc/open/client/nana/
cp /etc/open/easy-rsa-server/3/pki/ca.crt /etc/open/client/nana/
3. 查看open客户端目录
ll /etc/open/client/nana/
# -rw------- 1 root root 1176 Jun 9 20:37 ca.crt
# -rw-r--r-- 1 root root 206 Jun 9 20:24 client.o
# -rw------- 1 root root 4426 Jun 9 20:33 lala.crt
# -rw------- 1 root root 1704 Jun 9 20:31 nana.key
在windows电脑安装open软件
链接:open软件网盘链接
提取码:1234
测试Open
服务端脚本
执行脚本需要先安装好open服务和证书生成工具easy-rsa,并且需要先安装expect(免交互
)命令。
#!/bin/bash
#********************************************************************
# server *
#********************************************************************
# 准备相关配置文件
echo "生成服务器配置文件"
cp /usr/share/doc/open-2.4.11/sample/sample-config-files/server.conf /etc/open/
echo "准备证书签发相关文件"
cp -r /usr/share/easy-rsa/ /etc/open/easy-rsa-server
echo "准备签发证书相关变量的配置文件"
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/open/easy-rsa-server/3/vars
echo "建议修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长"
echo "初始化服务端PKI生成PKI相关目录和文件"
cd /etc/open/easy-rsa-server/3
./easyrsa init-pki
echo "创建CA证书"
# ./easyrsa build-ca nopass
expect <./easyrsa build-ca nopass
expect {
"Easy-RSA" {send "\n"}
}
expect eof
EOF
cat pki/serial
echo "生成服务端证书"
# ./easyrsa gen-req server nopass
expect <./easyrsa gen-req server nopass
expect {
"server" {send "\n"}
}
expect eof
EOF
echo "签发服务端证书"
# ./easyrsa sign server server
expect <./easyrsa sign server server
expect {
"*details:" {send "yes\n"}
}
expect eof
EOF
echo "创建 Diffie-Hellman 密钥"
./easyrsa gen-dh
cat > /etc/open/server.conf </etc/open/certs/ca.crt
cert /etc/open/certs/server.crt
key /etc/open/certs/server.key # This file should be kept secret
dh /etc/open/certs/dh.pem
server 10.8.0.0 255.255.255.0
push "route 172.16.1.0 255.255.255.0"
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user open
group open
status /var/log/open/open-status.log
log-append /var/log/open/open.log
verb 3
mute 20
EOF
echo "添加防火墙"
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p
yum install iptables-services -y
systemctl disable --now firewalld
systemctl start iptables
iptables -F
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
iptables -vnL -t nat
mkdir -p /var/log/open
mkdir -p /etc/open/certs
cp /etc/open/easy-rsa-server/3/pki/issued/server.crt /etc/open/certs/
cp /etc/open/easy-rsa-server/3/pki/private/server.key /etc/open/certs/
cp /etc/open/easy-rsa-server/3/pki/ca.crt /etc/open/certs/
cp /etc/open/easy-rsa-server/3/pki/dh.pem /etc/open/certs/
echo "重启OpenVpn"
systemctl daemon-reload
systemctl enable --now open@server
systemctl restart open@server
客户端脚本
#!/bin/bash
#********************************************************************
# client *
#********************************************************************
read -p "请输入用户的姓名拼音(如:${NAME}): " NAME
read -p "请输入VPN服务端的公网IP(如:${IP}): " IP
echo "客户端证书环境"
cp -r /usr/share/easy-rsa/ /etc/open/easy-rsa-client
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/open/easy-rsa-client/3/varsa
cd /etc/open/easy-rsa-client/3
echo "初始化pki证书目录"
# ./easyrsa init-pki
expect << EOF
spawn ./easyrsa init-pki
expect {
"removal" {send "yes\n"}
}
expect eof
EOF
echo "生成客户端证书"
# ./easyrsa gen-req ${NAME} nopass
expect << EOF
spawn ./easyrsa gen-req ${NAME} nopass
expect {
"${NAME}" {send "\n"}
}
expect eof
EOF
echo "将客户端证书同步到服务端"
cd /etc/open/easy-rsa-server/3
./easyrsa import-req /etc/open/easy-rsa-client/3/pki/reqs/${NAME}.req ${NAME}
echo "查看客户端证书"
ll pki/reqs/${NAME}.req /etc/open/easy-rsa-client/3/pki/reqs/${NAME}.req
echo "签发客户端证书,请输入:yes"
# ./easyrsa sign client ${NAME}
expect << EOF
spawn ./easyrsa sign client ${NAME}
expect {
"*details" {send "yes\n"}
}
expect eof
EOF
echo "查看证书"
cat pki/index.txt
ll pki/certs_by_serial/
cat pki/issued/${NAME}.crt
echo "创建客户端配置文件"
mkdir -p /etc/open/client/${NAME}
cd /etc/open/client/${NAME}
cat > /etc/open/client/${NAME}/${NAME}.o <{IP} 1194
resolv-retry infinite
nobind
ca ca.crt
cert ${NAME}.crt
key ${NAME}.key
remote-cert-tls server
cipher AES-256-CBC
verb 3
EOF
cp /etc/open/easy-rsa-client/3/pki/private/${NAME}.key .
cp /etc/open/easy-rsa-server/3/pki/issued/${NAME}.crt .
cp /etc/open/easy-rsa-server/3/pki/ca.crt .
echo "打包用户证书"
tar -czvf ${NAME}.tar.gz ./
echo "重启OpenVpn"
systemctl daemon-reload
systemctl enable --now open@server
systemctl restart open@server