1. 环境准备
主机名 | 功能 | IP |
openvpn | openvpn server服务端 | 10.0.0.5, 172.16.1.5 |
windows | windows 笔记本 openvpn 客户端 |
2. 安装证书创建工具easy-rsa和openvpn
因为OpenVPN 使用 easy-rsa 来管理PKI所需要的密钥和证书
10.0.0.5安装 yum -y install easy-rsa openvpn
mkdir -p /opt/easy-rsa
cp -a /usr/share/easy-rsa/3.0.8/* /opt/easy-rsa/
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /opt/easy-rsa/vars
#vars 文件里定义了后续生成密钥和证书所需要的环境变量
]# cat > /opt/easy-rsa/vars <<EOF
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "shenzhen"
set_var EASYRSA_REQ_CITY "shenzhen"
set_var EASYRSA_REQ_ORG "tom"
set_var EASYRSA_REQ_EMAIL "tom@qq.com"
set_var EASYRSA_NS_SUPPORT "yes"
EOF
3. 配置流程
- 创建dh-pem算法文件
- 创建CA证书密钥对
- 创建server密钥对,启动openvpn
- 创建用户密钥对,生成配置文件发给用户 (不同用户重复此步骤)
- 用户在windows下载openvpn客户端,把配置文件放在config目录下,连接即可
3.1. 创建dh-pem算法文件
#为了在Server和Client之间交换密钥,需要创建Diffie-Hellman文件
[root@openvpn easy-rsa]# ./easyrsa gen-dh
DH parameters of size 2048 created at /opt/easy-rsa/pki/dh.pem
3.2. 创建CA证书密钥对
首先, 我们需要生成CA根密钥和证书, 用来给VPN Server和Client的证书进行签名
###02 充当权威机构 创建ca证书
######1.初始化,在当前目录创建PKI目录,用于存储证书
cd /opt/easy-rsa/
]# ./easyrsa init-pki
Your newly created PKI dir is: /opt/easy-rsa/pki
#初始化完成 显示你可以尝试创建 CA证书 ,初始化后的目录在 pki下面
######2.创建根证书,会提示设置密码,用于ca对之后生成的server和client证书签名时使用,其他可默认
##温馨提示: 加上密码
[root@openvpn easy-rsa]# ./easyrsa build-ca
###创建后生成 ca证书和私钥
pki/ca.crt #生成的CA证书
pki/private/ca.key #生成的CA密钥
3.3. 创建server密钥对拷贝到openvn,启动openvpn
##01 创建server证书,nopass表示不加密私钥文件,其他可默认
./easyrsa gen-req myvpn nopass
##02 给server证书签名,首先是对一些信息的确认,可以输入yes,提示输入的密码是ca证书密码
./easyrsa sign-req server myvpn
#生成下面几个文件
#/opt/easy-rsa/pki/reqs/myvpn.req
#/opt/easy-rsa/pki/private/myvpn.key
#/opt/easy-rsa/pki/issued/myvpn.crt
#3 把ca.crt,dh.pem,myvpn.crt,myvpn.key拷贝到openvpn目录
cp pki/ca.crt pki/dh.pem pki/issued/myvpn.crt pki/private/myvpn.key /etc/openvpn/server/
#_________________________________________________________________
#4 创建openvpn的server配置文件
cat > /etc/openvpn/server/server.conf <<EOF
port 1194
proto udp
dev tun
ca server/ca.crt
dh server/dh.pem
cert server/myvpn.crt
key server/myvpn.key
server 10.8.0.0 255.255.255.0
push "route 172.16.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
EOF
#_________________________________________________________________________________
#配置文件说明
port 1194 #端口
proto udp #协议
dev tun #采用路由隧道模式tun
ca server/ca.crt #ca证书文件位置 /etc/openvpn
dh server/dh.pem #交换证书校验算法 /etc/openvpn
cert server/myvpn.crt #服务端公钥名称 /etc/openvpn
key server/myvpn.key #服务端私钥名称 /etc/openvpn
server 10.8.0.0 255.255.255.0 #给客户端分配地址池(ip地址范围),注意:不能和VPN服务器内网网段有相同
push "route 172.16.1.0 255.255.255.0" #客户端连接后,推送给客户端的路由规则,客户端想访问172.16.1.0/24 网段联系openvpn服务端
#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 #verbose 日志输出级别 数字越大越详细 最多11(debug)
client-to-client #客户端与客户端之间支持通信
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys 对私钥进行缓存.
persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
duplicate-cn #客户端密钥(证书和私钥)是否可以重复
#_________________________________________________________________________________
#——————————————————————————————————————————————————————————————————
#5 openvpn@.service表示可以带参数启动, 这里只修改--config %i/%i.conf路径
[root@openvpn pki]# 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
You have new mail in /var/spool/mail/root
#——————————————————————————————————————————————————————————————————
#启动openvpn服务
[root@openvpn pki]# systemctl enable --now openvpn@server
[root@openvpn pki]# ps -ef|grep openvpn
root 45031 1 0 13:04 ? 00:00:00 /usr/sbin/openvpn --cd /etc/openvpn/ --config server/server.conf
root 45421 26850 0 13:08 pts/1 00:00:00 grep --color=auto openvpn
[root@openvpn pki]# ss -tuanlp|grep openvpn
udp UNCONN 0 0 *:1194 *:* users:(("openvpn",pid=45031,fd=5))
#——————————————————————————————————————————————————————————————————
3.4. 创建用户密钥,生成配置文件发给用户 (不同用户重复此步骤)
#1.创建client端证书和私钥文件
./easyrsa gen-req jack nopass
#2.给client端证书签名,提示输入的密码是ca证书密码
./easyrsa sign-req client jack
#3 拷贝客户端密钥对到/etc/openvpn/client/jack目录,并创建客户端配置文件
mkdir -p /etc/openvpn/client/jack/
cp pki/ca.crt pki/issued/jack.crt pki/private/jack.key /etc/openvpn/client/jack/
#4 创建客户配置文件
cat >/etc/openvpn/client/jack/jack.ovpn<<EOF
client
dev tun
proto udp
remote 10.0.0.5 1194
resolv-retry infinite
nobind
ca ca.crt
cert jack.crt
key jack.key
verb 3
persist-key
EOF
#_配置文件说明________________________________________________________________________
client #指定当前VPN是客户端
dev tun #使用tun隧道传输协议
proto udp #使用udp协议传输数据
remote 10.0.0.5 1194 #openvpn服务器IP地址端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用
nobind #不绑定本地特定的端口号
ca ca.crt #指定CA证书的文件路径
cert jack.crt #指定当前客户端的证书文件路径
key jack.key #指定当前客户端的私钥文件路径
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
#创建多个用户密钥目录结构如下
[root@openvpn openvpn]# tree client/
client/
└── jack
├── ca.crt
├── jack.crt
├── jack.key
└── jack.ovpn
└── sara
├── ca.crt
├── sara.crt
├── sara.key
└── sara.ovpn
3.5. 用户在windows下载openvpn客户端,把配置文件放在config目录下,连接即可
#1. 用户下载安装客户端
#2. 把/etc/openvpn/client/下面的用户目录发给用户
#3. 用户把收到的文件放到C:\Program Files\OpenVPN\config\目录下即可
#4. 启动openvpn客户端,任务栏右击logo,在弹出的选项中点击连接,即可连接