VPN服务搭建
Posted 我的紫霞辣辣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VPN服务搭建相关的知识,希望对你有一定的参考价值。
VPN概述
VPN简介
VPN(全称:Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信的网络技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的链接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现的。
VPN应用场景
- 只能企业员工登录公司服务器
- 要求在任何网络下都能够登录
- 离职员工删除登录权限
- 权限管理
VPN的作用
VPN的功能是帮助公司的远程用户(出差,在家)、公司的分支机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者是局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网来处理相关事宜。
VPN的分类
根据不同的划分标准,VPN可以按几个标准进行分类划分:
- 按VPN的协议分类
VPN的隧道协议主要有三种, PPTP,L2TP和IPSec。其中PPTP和L2TP协议工作在OSI模型的第二层,又称为二层隧道协议; IPSec是第三层隧道协议,也是最常见的协议。L2TP和IPSec配合使用是目前性能最好,应用最广泛的一种。 - 按VPN的应用分类
- Access VPN (远程接入VPN):客户端到网关,使用公网作为骨干网在设备之间传输VPN的数据流量
- Intranet VPN (内联网VPN):网关到网关,通过公司的网络架构连接来自同公司的资源
- Extranet VPN (外联网VPN):与合作伙伴企业网构成Extranet,将一个公司与另一个公司的资源进行连接
- 按所用的设备类型进行分类:
- 路由器式VPN:路由器式VPN部署较容易,只要在路由器上添加VPN服务即可;
- 交换机式VPN:主要应用于连接用户较少的VPN网络;
- 防火墙式VPN:防火墙式VPN是最常见的一种VPN的实现方式,许多厂商都提供这种配置类型
常见的隧道协议
PPTP(点对点协议)
- PPTP属于点对点应用,比较适合远程的企业用户拨号到企业进行办公等应用,工作在OSI模型的第二层,只适合windows系统。
L2TP(第2等隧道协议)
- 第2等隧道协议(L2TP)是IETF基于L2F开发的PPTP的后续版本,工作在OSI模型的第二层。
IPSec(三层隧道协议)
- 第三层隧道协议,也是最常见的协议。当隧道模式使用IPSEC时,其只为通讯提供封装。使用IPSec隧道模式主要是为了与其他不支持IPSec上的L2TP或者PPTP VPN隧道技术的路由器、网关或终端系统之间的互相操作。
SSL VPN
- SSL协议提供了数据私密性、端点验证、信息完整性等特性。SSL协议由许多子协议组成,其中两个主要的子协议是握手协议和记录协议(对称加密和非对称加密向结合的方式进行数据的交换)。
- 典型的SSL VPN应用:Open VPN,这是一个比较好的开源软件。Open VPN允许参与建立VPN的单点使用预设的私钥,第三方证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库,以及SSLv3/TLSv1协议。OpenVPN能在Linux、xBSD、MacOS上运行。它并不是一个基于Web的VPN软件,也不能与IPSec及其他VPN软件包兼容。
Open 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协议介绍
- 真正的通信是两台主机之间的进程在进行数据交换的,而传输层作为整个网络最关键的从层次之一,扮演着向上层(应用层)提供通信服务的角色。传输层的数据安全传输策略一定无法绕开着三个至关重要的重要协议,它们分别是HTTPS协议、SSL协议、TSL协议。
SSL(Secure Socket Layer)协议
即安全套接字层协议
,TLS(Transport Layer Security)协议
即安全传输层协议
。
Open VPN 部署
在内网中部署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. 安装openvpn
yum -y install openvpn
4. 安装证书生成工具
yum -y install easy-rsa
2. 准备服务端相关的配置文件
1. 生成服务器配置文件
cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
2. 准备证书签发相关文件(服务端)
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
3. 准备签发证书相关变量的配置文件(服务端)
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars
4. 建议修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长
vim /etc/openvpn/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/openvpn/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/openvpn/easy-rsa-server/3/pki/reqs/server.req 生成请求文件
# key: /etc/openvpn/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/openvpn/easy-rsa-server/3/pki/dh.pem
4. 准备客户端相关的配置文件
1. 准备证书签发相关文件(客户端)
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client
2. 准备签发证书相关变量的配置文件(客户端)
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/varsa
3. 建议修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长
vim /etc/openvpn/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/openvpn/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/openvpn/easy-rsa-client/3/pki/reqs/nana.req 生成请求文件
# key: /etc/openvpn/easy-rsa-client/3/pki/private/nana.key 生成私钥文件
3. 将客户端证书请求文件复制到CA的工作目录
cd /etc/openvpn/easy-rsa-server/3
./easyrsa import-req /etc/openvpn/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 服务端证书
Open VPN服务
OpenVPN 配置文件说明
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时必须不能开启此项
启动open vpn服务
1. 修改服务端配置文件
> /etc/openvpn/server.conf
vim /etc/openvpn/server.conf
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/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 openvpn
group openvpn
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
2. 创建openvpn用户
getent passwd openvpn
# openvpn:x:998:996:OpenVPN:/etc/openvpn:/sbin/nologin
3. 创建openvpn日志文件,并修改属主属组
mkdir /var/log/openvpn
chown openvpn.openvpn /var/log/openvpn
ll -d /var/log/openvpn
# drwxr-xr-x 2 openvpn openvpn 6 Jun 9 18:45 /var/log/openvpn
4. 将服务端证书密钥文件移动到openvpn配置文件指定的目录下
mkdir /etc/openvpn/certs
cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs
cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs
cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs
cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/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. 启动openvpn服务
systemctl daemon-reload
systemctl enable --now openvpn@server
7. 查看端口号和ip地址
netstat -lntp
# tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 18589/openvpn
ip a
# 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
创建open vpn客户端配置文件
1. 修改vpn客户端配置文件
mkdir -p /etc/openvpn/client/nana/
vim /etc/openvpn/client/nana/client.ovpn
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. 将客户端证书密钥文件移动到openvpn配置文件指定的目录下
cp /etc/openvpn/easy-rsa-client/3/pki/private/nana.key /etc/openvpn/client/nana/
cp /etc/openvpn/easy-rsa-server/3/pki/issued/lala.crt /etc/openvpn/client/nana/
cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/client/nana/
3. 查看openvpn客户端目录
ll /etc/openvpn/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.ovpn
# -rw------- 1 root root 4426 Jun 9 20:33 lala.crt
# -rw------- 1 root root 1704 Jun 9 20:31 nana.key
在windows电脑安装openvpn软件
链接:https://pan.baidu.com/s/1u02gRJcOf3KrBf82xE_SZQ 提取码:1234
复制这段内容后打开百度网盘手机App,操作更方便哦
测试Open vpn
VPN服务搭建写成脚本文件
服务端脚本
- 执行服务端脚本需要先安装好openvpn服务和证书生成工具easy-rsa
vim openvpn-server.sh
#!/bin/bash
#********************************************************************
# server
#********************************************************************
# 准备相关配置文件
echo "生成服务器配置文件"
cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
echo "准备证书签发相关文件"
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
echo "准备签发证书相关变量的配置文件"
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars
echo "建议修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长"
echo "初始化服务端PKI生成PKI相关目录和文件"
cd /etc/openvpn/easy-rsa-server/3
./easyrsa init-pki
echo "创建CA证书"
./easyrsa build-ca nopass
cat pki/serial
echo "生成服务端证书"
./easyrsa gen-req server nopass
echo "签发服务端证书"
./easyrsa sign server server
echo "创建 Diffie-Hellman 密钥"
./easyrsa gen-dh
cat > /etc/openvpn/server.conf <<EOF
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key # This file should be kept secret
dh /etc/openvpn/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 openvpn
group openvpn
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.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/openvpn
mkdir -p /etc/openvpn/certs
cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
echo "重启OpenVpn"
systemctl daemon-reload
systemctl enable --now openvpn@server
客户端脚本
vim openvpn-client.sh
#!/bin/bash
#********************************************************************
# client
#********************************************************************
read -p "请输入用户的姓名拼音(如:${NAME}): " NAME
read -p "请输入远程代理IP(如:${IP}): " IP
echo "客户端证书环境"
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/varsa
cd /etc/openvpn/easy-rsa-client/3
echo "初始化pki证书目录"
./easyrsa init-pki
echo "生成客户端证书"
./easyrsa gen-req ${NAME} nopass
echo "将客户端证书同步到服务端"
cd /etc/openvpn/easy-rsa-server/3
./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/${NAME}.req ${NAME}
echo "查看客户端证书"
ll pki/reqs/${NAME}.req /etc/openvpn/easy-rsa-client/3/pki/reqs/${NAME}.req
echo "签发客户端证书,请输入:yes"
./easyrsa sign client ${NAME}
VPN服务搭建