VPN
官网
购买云主机
-
在阿里云上购买两台云主机
-
一台做openVPN服务端,需要公网地址
-
一台做web端,不需要公网地址
-
各主机之间做时间同步
ntpdate time1.aliyun.com # 当前时间同步
hwclock -w # 硬件时间同步,执行时间同步了这步必须执行
云主机服务端
yum install epel-release -y
yum install openvpn -y # openvpn服务端
yum install easy-rsa -y # 证书管理工具
rpm -ql easy-rsa
rpm -ql openvpn
cp /usr/share/doc/openvpn-2.4.7/sample/sample-config-files/server.conf /etc/openvpn/server/
copy配置文件
# openvpn server配置文件
cp /usr/share/doc/openvpn-2.4.7/sample/sample-config-files/server.conf /etc/openvpn/
# 证书管理工具
cp -r /usr/share/easy-rsa/ /etc/openvpn/easyrsa-server
# 变量配置文件(名称固定是vars)
cp /usr/share/doc/easy-rsa-3.0.6/vars.example /etc/openvpn/easyrsa-server/3/vars
[root@ws ~]# cd /etc/openvpn/easyrsa-server/3/
[root@ws 3]# tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── server
└── serverClient
1 directory, 9 files
初始化pki环境和CA签发机构
[root@ws 3]# pwd
/etc/openvpn/easyrsa-server/3
# 生成pki目录用户保存证书
./easyrsa init-pki
创建CA机构
-
结构
-
key:openvpn私钥
-
crt:openvpn公钥
-
req(csr):签发crt的密钥申请文件
-
ca:自签名证书机构
[root@ws 3]# pwd
/etc/openvpn/easyrsa-server/3
# 更改ca的有效时间
vim vars
''''
120 set_var EASYRSA_CA_EXPIRE 7300
''''
# 创建ca并不使用密码
./easyrsa build-ca nopass
输入描述信息,回车即可
# 验证ca的公钥
[root@ws 3]# ll pki/ca.crt
-rw------- 1 root root 1172 Dec 25 18:57 pki/ca.crt
# 验证ca的私钥
[root@ws 3]# ll pki/private/ca.key
-rw------- 1 root root 1679 Dec 25 18:57 pki/private/ca.key
创建OpenVpn服务端证书(私钥)
[root@ws 3]# pwd
/etc/openvpn/easyrsa-server/3
# 创建server申请证书且不使用密码
./easyrsa gen-req server nopass
描述信息不用写,直接回车
生成完成检查一下是否存在server的私钥和公钥,在提示信息中
签发OpenVpn服务端证书
-
使用自建的ca签发服务器证书,即生成服务端crt公钥,crt公钥后期将用户发送给客户端,从而实现与openvpn server端加密传输数据
[root@ws 3]# pwd
/etc/openvpn/easyrsa-server/3
# 签发服务端证书,备注信息为server
./easyrsa sign-req server server
是否确认签发,yes
# 验证生成的服务端公钥
ll /etc/openvpn/easyrsa-server/3/pki/issued/server.crt
创建 Diffie-Hellman密钥
-
这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)、马丁·赫尔曼(Martin Edward Hellman)于1976年发表。
-
它是一种安全协议,让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥,这个密钥一般作为“对称加密”的密钥而被双方在后续数据传输中使用。DH数学原理是base离散对数问题。做类似事情的还有非对称加密类算法,如:RSA。
[root@ws 3]# pwd
/etc/openvpn/easyrsa-server/3
./easyrsa gen-dh
创建客户端证书
cp -r /usr/share/easy-rsa/ /etc/openvpn/easyrsa-client/
cp /usr/share/doc/easy-rsa-3.0.6/vars.example /etc/openvpn/easyrsa-client/vars
cd /etc/openvpn/easyrsa-client/3
./easyrsa init-pki
cd /etc/openvpn/easyrsa-client/3
# 证书为xier,没有设置密码
./easyrsa gen-req xier nopass
./easyrsa gen-req xier nopass
签发客户端证书
-
在openvpn server目录中签发客户端证书
cd /etc/openvpn/easyrsa-server/3/
# server端导入req文件
./easyrsa import-req /etc/openvpn/easyrsa-client/3/pki/reqs/xier.req xier
./easyrsa sign-req client xier
yes
# 根据提示验证
ll /etc/openvpn/easyrsa-server/3/pki/issued/xier.crt
复制server证书到certs目录统一管理
mkdir /etc/openvpn/certs
cd /etc/openvpn/certs
cp /etc/openvpn/easyrsa-server/3/pki/ca.crt .
cp /etc/openvpn/easyrsa-server/3/pki/issued/server.crt .
cp /etc/openvpn/easyrsa-server/3/pki/private/server.key .
cp /etc/openvpn/easyrsa-server/3/pki/dh.pem .
mv dh.pem dh2048.pem # 名称可自定义,但是配置文件中需要对应
mkdir /etc/openvpn/client/xier
cd /etc/openvpn/client/xier
复制client证书到指定目录统一管理
mkdir /etc/openvpn/client/xier
cd /etc/openvpn/client/xier
cp /etc/openvpn/easyrsa-server/3/pki/ca.crt .
cp /etc/openvpn/easyrsa-server/3/pki/issued/xier.crt .
cp /etc/openvpn/easyrsa-client/3/pki/private/xier.key .
配置server配置文件
vim /etc/openvpn/server.conf
local 0.0.0.0
proto tcp
#proto udp
#dev tap 创建一个以太网隧道,以太网使用tap
dev tun # 创建一个路由IP隧道,互联网使用tun
#;dev-node MyTap windwos需要开启,Linux不需要
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh2048.pem
# topology subnet 网络拓扑,不需要配置
server 10.8.0.0 255.255.0.0 # 客户端连接后分配IP的地址池,服务器默认会占用第一个IP 10.8.0.1。地址数量决定客户数量
#ifconfig-pool-persist ipp.txt 为客户端分配固定IP,不需要配置
#;server-bridge 10.8.0.4 xxxxx 配置桥接,不需要
#;server-bridge
push "route 172.29.0.0 255.255.255.0" # 生成连接后端服务器的路由表,如果后端服务器有多个地址段,那么都写进去即可
push "route 172.28.0.0 255.255.248.0" # 决定能连那些服务器
push "route 10.20.0.10 255.255.255.0"
#;client-config-dir ccd # 为指定的客户端添加路由,不需要配置
#;route xxxxx
#;learn-address ./script
#;push "redirect-gateway def1 bypass-dhcp" 启用后,客户端所有流量都将通过VPN服务器,因此不需要配置。可以做FQ
#;push "dhcp-optionxxxx DNS"
#;push "dhcp-optionxxxx DNS"
#;client-to-client # 允许不同的client通过openvpn server直接通信,不开启
#;duplicate-cn # 多个用户共用一个账户,一般用于测试环境,生产环境都是一个用户一个证书
keepalived 10 120 # 设置服务端检测的间隔和超时时间,默认为每10秒ping一次,如果120秒没有回应则认对方已经down
tls-auth /etc/openvpn/certs/ta.key 0 # 使用一下命令生成:openvpn --genkey --secret /etc/openvpn/certs/ta.key 服务端和每个客户端都需要拥有该密钥,cp /etc/openvpn/certs/ta.key /etc/openvpn/client/xier/ 第二个参数服务端为"0",客户端为"1"
cipher AES-265-CBC # 加密算法
#;compress lz4-v2 # 启用压缩
#;push "compress lz4-v2" # 启用压缩算法
#;comp-lzo # 旧户端兼容的压缩配置,需要客户端配置开启压缩
max-clients 4096 # 最大客户端数
user openvpn
group openvpn
#persist-key 重启openvpn服务,重新读取keys文件,否则保留使用第一次的keys文件,不开启
#persist-tun 重启openvpn服务,一直保持tun或者tap设备是up的,否则会先down,然后再up,不开启
status /var/log/openvpn/openvpn-status.log # openvpn状态记录文件。每分钟会记录一次。mkdir /var/log/openvpn
#;log openvpn.log 日志记录方式和路径,log会在openvpn启动时清空日志文件
verb 3 # 设置日志级别,0-9,级别越高记录的内容越详细
mute 20 # 相同类别的信息只有前20条会输出到日志文件中
#explicit-exit-notify 1 # 通知客户端,在服务端重启后可以自动重新连接,仅能用于udp模式,tcp模式不需要配置即可实现断开重连接,且tcp配置后会导致openvpn服务无法启动
启动openvpn服务
systemctl stop firewalld
systemctl disable firewalld
yum install iptables-server iptables -y
systemctl enable --now iptables
# 清空规则
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -j MASQUERADE
iptables -A INPUT -p TCP --dport 1194 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
service iptables save
# 验证防火墙规则
iptables -vnL
mkdir /var/log/openvpn
chown openvpn.openvpn /var/log/openvpn
systemctl enable --now openvpn@server
Windows PC安装openvpn客户端
客户端配置文件
cd /etc/openvpn/client/xier
grep -Ev "^(#|$|;)" /usr/share/doc/openvpn-2.4.7/sample/sample-config-files/client.conf > /etc/openvpn/client/xier/client.ovpn
vim /etc/openvpn/client/xier/client.ovpn
client # 声明自己是客户端
dev tun # 接口类型,必须和服务端保持一致
proto tcp # 使用的协议,必须和服务端保持一致
remote 公网地址 1194 # server端的ip和端口,可以写域名但是需要解析成ip
resolv-retry infinite # 如果写的是server端的域名,那么就始终解析,如果域名发生变化,会重新连接到新的域名对应的ip
nobind # 本机不绑定监听端口,客户端是随机打开端口连接到服务端的1194
#persist-key
#persist-tun
ca ca.crt
cert xier.crt
key xier.key
remote-cert-tls server # 指定采用服务器校验方式
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
cd /etc/openvpn/client/xier
tar cvf xier.tar.gz ./*
-
将证书文件导入到windows中
-
windows安装openvpn的目录找到config
-
将导出来的压缩包解压放入即可
高级功能
密钥设置连接密码
-
新建一个名称叫做ws的账户,并且设置证书密码,提高证书安全性
-
证书申请及签发过程
# 生成ws客户端证书
cd /etc/openvpn/easyrsa-client/3
./easyrsa gen-req ws
设置证书密码
确认证书密码
描述信息直接回车
# 导入req文件到easyrsa-server环境
cd /etc/openvpn/easyrsa-server/3
./easyrsa import-req /etc/openvpn/easyrsa-client/3/pki/reqs/ws.req ws
# 签发证书
./easyrsa sign-req client ws
yes
# 整理证书
mkdir ws
cd ws
cp /etc/openvpn/client/xier/ca.crt .
cp /etc/openvpn/client/xier/ta.key .
cp /etc/openvpn/easyrsa-server/3/pki/issued/ws.crt .
cp /etc/openvpn/easyrsa-server/3/pki/private/ws.key .
cp /etc/openvpn/client/xier/client.ovpn
vim client.ovpn
'''
remote 47.108.77.144 1194
cert ws.crt
key ws.key
'''
zip -P "123456" ws.zip ./*
-
将ws.zip压缩包导出来放到openvpn安装目录的config中解压,输入解压密码,然后进行连接
账户证书管理
证书自动过期
cd /opt/openvpn/easyrsa-server/3
vim vars
124 # set_var EASYRSA_CERT_EXPIRE 1080 当前版本证书有效默认3650天
124 # set_var EASYRSA_CERT_EXPIRE 60 按照需求更改有效期
模拟实战
cd /etc/openvpn/easyrsa-client/3/
./easyrsa gen-req client zhangsan
设置密码
描述信息可不填,回车
# 将证书导入到客户端中
cd /etc/openvpn/easyrsa-server/3/
./easyrsa import-req /etc/openvpn/easyrsa-client/3/pki/reqs/zhangsan.req zhangsan
# 签发证书
./easyrsa sign-req client zhangsan
yes
mkdir /etc/openvpn/client/zhangsan
cd /etc/openvpn/client/zhangsan
cp /etc/openvpn/easyrsa-server/3/pki/issued/zhangsan.crt .
cp /etc/openvpn/easyrsa-client/3/pki/private/zhangsan.key .
cp /etc/openvpn/client/ws/ca.crt .
cp /etc/openvpn/client/ws/ta.key .
cp /etc/openvpn/client/ws/client.ovpn .
vim client.ovpn
'''
cert zhangsan.crt
key zhangsan.key
'''
zip zhangsan.zip ./*
-
将证书压缩包放入到Windows安装好的openvpn的config目录下解压
-
时间以服务端为准
证书吊销
cat /etc/openvpn/easyrsa-server/3/pki/index.txt # 查看证书状态。R吊销状态
cd /etc/openvpn/easyrsa-server/3
# 吊销zhangsan账户的证书
./easyrsa revoke zhangsan
yes
./easyrsa gen-crl
# 编辑openvpn server配置文件调用吊销证书的文件.最后写入即可
vim /etc/openvpn/server.conf
crl-verify /etc/openvpn/easyrsa-server/3/pki/crl.pem
systemctl restart openvpn@server
最终server端配置
vim /etc/openvpn/server.conf
local 172.18.200.101
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/dh2048.pem
server 10.8.0.0 255.255.0.0
push "route 172.29.0.0 255.255.255.0"
push "route 172.28.0.0 255.255.248.0"
push "route 10.20.0.10 255.255.255.0"
client-to-client
keepalived 10 120
cipher AES-265-CBC
max-clients 100
user openvpn
group openvpn
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 9
mute 20
crl-verify /etc/openvpn/easyrsa-server/3/pki/crl.pem
最终client端配置
vim /etc/openvpn/client/xier/client.ovpn
client
dev tun
proto tcp
remote 47.89.101.23 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert zhangsan.crt
key zhangsan.key
remote-cert-tls server
cipher AES-256-CBC
verb 3