# VPN是虚拟专用网络的缩写,它是两个或多个物理网络(或设备)之间沟通互联网/公共网络创建的虚拟网络,可以为企业之间或者个人与企业之间提供安全(加密)的数据传输隧道服务。
# vpn的功能主要就是帮助不在公司内部局域网内的人员可以通过数据加密的方式远程访问公司内部资源
1. 远程访问vpn
允许用户远程连接到专用网络,通过完全安全的internet连接进行连接
2. 站点到站点vpn
最常用的为公司与公司之间使用vpn,即可实现设在不同地点的公司之间进行数据共享
PPTP(点对点隧道协议)
优:windows自带,无需安装,网络连接较为稳定
缺:安全性低,可以被防火墙阻止(不建议用于公司或商业用途)
L2TP/IPsec------PPTP升级版
优:安全性较之pptp高,windows自带,无需安装,可用于具有相同vpn配置的多个设备
缺:速度较慢(加密算法导致),不建议用于cpu性能较低的计算机。
IKEv2/IPsec
优:速度加快;安全性较高;重连速度较快;与手机兼容性也较强(较适合用于手机)
缺:搭建较为困难,暂时支持的平台不是很多
OpenVPN
优:安全性较高;可配置性较强;可以绕过防火墙
缺:需要安装第三方软件;安装过程较为复杂;移动端支持较差(手机)
实验环境如下
公网IP:192.168.5.3
内网IP:172.16.5.3
主机名:server
---------------------------'openvpn安装'-------------------------------
# 下载安装OpenVPN以及证书管理工具
[root@server ~]# yum -y install openvpn
[root@server ~]# yum -y install easy-rsa
---------------------------'准备相关配置文件'-------------------------------
# 生成服务器配置文件
[root@server ~]# cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
# 准备证书签发相关文件
[root@server ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
# 准备签发证书相关变量的配置文件
[root@server ~]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/vars
# 注意默认ca证书以及服务器证书有效期分别为3650天以及825天,可修改以下文件
# ca证书修改
#set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CA_EXPIRE 36500
# 服务器证书修改
#set_var EASYRSA_CERT_EXPIRE 825
set_var EASYRSA_CERT_EXPIRE 3650
---------------------------'初始化PKI并生成PKi相关目录和文件'-------------------------------
[root@server ~]# cd /etc/openvpn/easy-rsa-server/3
[root@server 3]# ./easyrsa init-pki
---------------------------'生成CA证书'-------------------------------
[root@server 3]# pwd
/etc/openvpn/easy-rsa-server/3
# nopass代表不加密私钥,主要方便后面导出公钥与颁发服务器证书
# 此步骤做完即在/etc/openvpn/easy-rsa-server/3/pki下生成了ca.crt证书
[root@server 3]# ./easyrsa build-ca nopass
# openssl x509主要用于输出证书信息,也能签署证书请求文件、自签署、转换证书格式等
# -in 指定证书输入文件
# -noount 默认out选项为指定输出文件,noout为默认不输出到文件
# -text 以text格式输出证书内容,即以最全格式输出
# 所以此项的内容为 格式化输出证书内容..
[root@server 3]# openssl x509 -in pki/ca.crt -noout -text
---------------------------'创建服务端证书申请'-------------------------------
[root@server 3]# ./easyrsa gen-req server nopass
'会有以下输出'
Common Name (eg: your user, host, or server name) [server]: # 直接回车
req: /etc/openvpn/easy-rsa-server/3/pki/reqs/server.req # 生成请求文件
key: /etc/openvpn/easy-rsa-server/3/pki/private/server.key # 生成私钥文件
---------------------------'签发服务端证书'-------------------------------
[root@server 3]# ./easyrsa sign server server
'会有以下输出'
Confirm request details: # 输入yes回车
# 生成服务器证书文件(server.crt)
Certificate created at: /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt
[root@server 3]# diff pki/certs_by_serial/C27FBCEF83E7E2370D5E923F48618049.pem pki/issued/server.crt
---------------------------'创建Diffie-Hellman密钥'-------------------------------
'以下方法二选一'
方法一:
[root@server 3]# pwd
/etc/openvpn/easy-rsa-server/3
# 此命令会生成/etc/openvpn/easy-rsa-server/3/pki/dh.pem文件
[root@server 3]# ./easyrsa gen-dh
方法二:
# 此命令会生成/etc/openvpn/dh2048.pem文件
[root@server 3]# openssl dhparam -out /etc/openvpn/dh2048.pem 2048
---------------------------'客户端证书环境'-------------------------------
[root@server pki]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client
[root@server pki]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/varsa
[root@server pki]# cd /etc/openvpn/easy-rsa-client/3
# 初始化证书目录----client环境下
[root@server 3]# pwd
/etc/openvpn/easy-rsa-client/3
[root@server 3]# ./easyrsa init-pki
# 生成证书
# 生成用户shilin的req以及key文件
[root@server 3]# ./easyrsa gen-req shilin nopass
'会有以下输出'
Common Name (eg: your user, host, or server name) [shilin]: # 直接默认回车即可
req: /etc/openvpn/easy-rsa-client/3/pki/reqs/shilin.req # 生成shilin.req文件
key: /etc/openvpn/easy-rsa-client/3/pki/private/shilin.key # 生成shilin.key文件
# 将客户端证书请求文件复制到CA的工作目录
[root@server 3]# cd /etc/openvpn/easy-rsa-server/3
[root@server 3]# ./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/shilin.req shilin
[root@server 3]# pwd
/etc/openvpn/easy-rsa-server/3
# 签发客户端证书,会生成/etc/openvpn/easy-rsa-server/3/pki/issued/shilin.crt文件,需输入yes
[root@server 3]# ./easyrsa sign client shilin
---------------------------'将ca和服务器证书相关文件复制到服务器响应目录'-------------------------------
[root@server 3]# mkdir /etc/openvpn/certs
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
[root@server 3]# ls /etc/openvpn/certs/
ca.crt dh.pem server.crt server.key
---------------------------'将客户端私钥与证书相关文件复制到服务器相关的目录'-------------------------------
[root@server 3]# mkdir /etc/openvpn/client/shilin
[root@server 3]# find /etc/openvpn/ ( -name "shilin.key" -o -name "shilin.crt" -o -name ca.crt ) -exec cp {} /etc/openvpn/client/shilin ;
[root@server 3]# cd /etc/openvpn/client/shilin/
[root@server shilin]# ls
ca.crt shilin.crt shilin.key
以下为默认配置文件说明信息
#server.conf文件中以#或;开头的行都为注释
[root@server ~]# grep -Ev "^#|^$" /etc/openvpn/server.conf
;local a.b.c.d #本机监听IP,默认为本机所有IP
port 1194 #端口
;proto tcp #协议,生产推荐使用TCP
proto udp #默认协议
;dev tap #创建一个以太网隧道,以太网使用tap,一个tap设备允许完整的以太网帧通过Openvpn隧道,可提供非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" #给客户端生成的到达服务器后面网段的静态路由,下一跳为openvpn服务器的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等攻击的安全增强配置,可以使用以下命令来生成:openvpn --
genkey --secret ta.key #服务器和每个客户端都需要拥有该密钥的一个拷贝。第二个参数在服务器端应该为’0’,在客户端应该为’1’
cipher AES-256-CBC #加密算法
;compress lz4-v2 #启用Openvpn2.4.X新版压缩算法
;push "compress lz4-v2" #推送客户端使用新版压缩算法,和下面的comp-lzo不要同时使用
;comp-lzo #旧户端兼容的压缩配置,需要客户端配置开启压缩,openvpn2.4.X等新版可以不用开启
;max-clients 100 #最大客户端数
;user nobody #运行openvpn服务的用户和组
;group nobody
persist-key #重启VPN服务时默认会重新读取key文件,开启此配置后保留使用第一次的key文件,生产环境无需开启
persist-tun #启用此配置后,当重启vpn服务时,一直保持tun或者tap设备是up的,否则会先down然后再up,生产环境无需开启
status openvpn-status.log #openVPN状态记录文件,每分钟会记录一次
;log openvpn.log #第一种日志记录方式,并指定日志路径,log会在openvpn启动的时候清空日志文件,不建议使用
;log-append openvpn.log #第二种日志记录方式,并指定日志路径,重启openvpn后在之前的日志后面追加新的日志,生产环境建议使用
verb 3 #设置日志级别,0-9,级别越高记录的内容越详细,0 表示静默运行,只记录致命错误,4 表示合理的常规用法,5 和 6 可以帮助调试连接错误。9 表示极度冗余,输出非常详细的日志信息
;mute 20 #相同类别的信息只有前20条会输出到日志文件中
explicit-exit-notify 1 #通知客户端,在服务端重启后自动重新连接,仅能用于udp模式,tcp模式不需要配置即可实现断开重新连接,且开启此项后tcp配置后将导致openvpn服务无法启动,所以tcp时必须不能开启此项
以下为实验环境配置文件信息
[root@server ~]# cat /etc/openvpn/server.conf
# 指定默认端口号
port 1194
# 指定vpn使用的协议为tcp,生产环境推荐使用
proto tcp
# 创建一个路由IP隧道,生产环境推荐使用tun
dev tun
# 指定证书文件
ca /etc/openvpn/certs/ca.crt
# 指定服务器证书文件
cert /etc/openvpn/certs/server.crt
# 指定服务器私钥文件
key /etc/openvpn/certs/server.key
# 指定dh参数文件
dh /etc/openvpn/certs/dh.pem
# 指定客户端连接后分配ip的地址池,服务器默认会占用第一个ip作为网关
server 10.8.0.0 255.255.255.0
# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网
push "route 172.30.0.0 255.255.255.0"
# 设置服务端检测的间隔和超时时间,10秒ping一次,120秒没回应则认为对方down
keepalive 10 120
# 加密算法
cipher AES-256-CBC
# 启用openvpn新版压缩算法
compress lz4-v2
# 推送客户端使用新版压缩算法,不能和comp-lzo同时使用
push "compress lz4-v2"
# 最大客户端数
max-clients 2048
# 运行openvpn服务的用户和组
user openvpn
group openvpn
# openvpn状态记录文件,每分钟记录一次
status /var/log/openvpn/openvpn-status.log
# 指定日志路径,生产环境建议使用
log-append /var/log/openvpn/openvpn.log
# 设置日志级别,数字越大记录的内容越详细
verb 3
# 相同类别信息只有前20条会输出到日志文件中
mute 20
--------------------------'以上为server.conf配置'-----------------------------
[root@server ~]# getent passwd openvpn
[root@server ~]# mkdir -p /var/log/openvpn/
[root@server ~]# chown openvpn.openvpn /var/log/openvpn
# 修改内核参数
[root@server ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server ~]# sysctl -p
# 安装防火墙
[root@server ~]# yum -y install iptables-services
# 清空防火墙默认规则
[root@server ~]# iptables -F
# 关闭firewalld防火墙
[root@server ~]# systemctl disable --now firewalld
# 启动iptables防火墙
[root@server ~]# systemctl start iptables
# 添加vpn网络转发规则
[root@server ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
# 查看iptables规则
[root@server ~]# iptables -nvL -t nat
------------------------------'启动openvn'---------------------------------
[root@server ~]# systemctl daemon-reload
# 启动openvpn并设置开机自启
[root@server certs]# systemctl enable --now openvpn@server
[root@server ~]# cat > /etc/openvpn/client/shilin/client.ovpn <<EOF
client
dev tun
proto tcp
remote 192.168.5.3 1194
resolv-retry infinite
nobind
# persist-key
# persist-tun
ca ca.crt
cert shilin.crt
key shilin.key
remote-cert-tls server
# tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2
EOF
1. # 将此目录下的四个文件传输到windows客户端
[root@server ~]# ls /etc/openvpn/client/shilin/
ca.crt client.ovpn shilin.crt shilin.key
2. # windows客户端安装openvpn软件
3. # 将从服务器传输下来的四个文件copy到windows下 %USERPROFILE%/openvpn/config 目录下(默认安装)
4. # 启动客户端
1. 服务器openvpn启动异常
server:
cat /etc/openvpn/server.conf # 查看此文件内的指定的路径文件是否存在
2. windows客户端软件链接异常
client:
查看client.ovpn文件中ip地址、端口、以及文件名是否正常 并与服务端的server.conf进行比对
查看client.ovpn文件之中是否有空格,可能会导致(管理接口)这种报错
server:
(1) netstat -lntp # 查看端口(服务)是否开启
(2) cat /etc/sysctl.conf # 查看路由转发功能是否开启
net.ipv4.ip_forward = 1
(3) iptables -nvL -t nat # 查看iptables是否放行规则
..............