系统环境 CentOS7.9
证书认证
安装 OpenV*N 包
#安装 openv*n、iptables-services
yum install openv*n iptables-services -y
配置 EasyRSA
#安装 easy-rsa
yum install easy-rsa -y
cp -r /usr/share/easy-rsa/3.0.8/ /etc/openv*n/easy-rsa
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openv*n/easy-rsa/vars
创建证书和密钥
cd /etc/openv*n/easy-rsa/
#初始化目录
./easyrsa init-pki
#创建根证书 nopss 表示不加密;不加此参数,需要输入密码
./easyrsa build-ca nopass
#创建服务端秘钥
./easyrsa gen-req server nopass
#执行过程中 Common Name (eg: your user, host, or server name) 直接回车取默认名称
服务端证书签名
过程中需要输入 yes
#服务端证书签名
./easyrsa sign-req server server
创建客户端密钥
#创建客户端秘钥
./easyrsa gen-req client nopass
客户端证书签名
过程中需要输入 yes
#客户端证书签名
./easyrsa sign-req client client
创建 Diffie-Hellman
#创建 Diffie-Hellman
./easyrsa gen-dh
拷贝证书到目录
cd /etc/openv*n/easy-rsa/pki/
cp ca.crt dh.pem /etc/openv*n/
cp private/server.key issued/server.crt /etc/openv*n/server/
cp private/client.key issued/client.crt /etc/openv*n/client/
编辑服务端配置文件 server.conf
cd /etc/openv*n/
cp /usr/share/doc/openv*n-2.4.12/sample/sample-config-files/server.conf ./
#监听本机ip地址
local 0.0.0.0
#监控本机端口号
port 1194
#指定采用的传输协议,可以选择tcp或udp
proto tcp
#指定创建的通信隧道类型,可选tun或tap
dev tun
#指定CA证书的文件路径
ca /etc/openv*n/ca.crt
#指定服务器端的证书文件路径
cert /etc/openv*n/server/server.crt
#指定服务器端的私钥文件路径
key /etc/openv*n/server/server.key
#指定迪菲赫尔曼参数的文件路径
dh /etc/openv*n/dh.pem
#指定虚拟局域网占用的IP地址段和子网掩码, 内网 ip (172.16.61.243)
server 172.16.0.0 255.255.255.0
#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
ifconfig-pool-persist ipp.txt
#推送客户端可以访问的v*n路由网段
push "route 192.168.30.0 255.255.252.0"
#自动推送客户端上的网关及DHCP (此参数会让客户端都走v*n的网络,不加此参数可以实现正常走本地网络,访问v*n资源走v*n网络)
push "redirect-gateway def1 bypass-dhcp"
#OpenV*N的DHCP功能为客户端提供指定的 DNS、WINS 等
push "dhcp-option DNS 114.114.114.114"
#允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client
#允许一套证书或账户多人登录
duplicate-cn
#每10秒ping一次,连接超时时间设为120秒
keepalive 10 120
#开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
tls-auth /etc/openv*n/ta.key 0
#加密认证算法
cipher AES-256-CBC
#使用lzo压缩的通讯,服务端和客户端都必须配置
comp-lzo
#最大连接用户
max-clients 100
#定义运行的用户和组
user openv*n
group openv*n
#重启时仍保留一些状态
persist-key
persist-tun
#输出短日志,每分钟刷新一次,以显示当前的客户端
status /etc/openv*n/openv*n-status.log
#日志保存路径
log /etc/openv*n/openv*n.log
log-append /etc/openv*n/openv*n.log
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 4
#相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
mute 20
启动 OpenV*N 服务
#修改文件目录权限
chown root.openv*n /etc/openv*n/* -R
#启动服务
systemctl start openv*n@server
#查看是否启动成功
ps -aux|grep openv*n
配置系统转发和开放端口
云服务器需要开放对应端口 如:阿里云要在安全组中放开1194 端口
#/etc/sysctl.conf 配置文件中添加
net.ipv4.ip_forward=1
#生效
sysctl -p
#清空iptables规则(如果机器第一次安装iptables-services,没有增删过规则,可以不用执行此步骤)
iptables -F
iptables -F -t nat
iptables -X
service iptables save
systemctl restart iptables
#iptables(重要一点:转发请求上网)
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE
#默认iptables是允许所有访问进入的,所以这条可以不用加(除非设置了INPUT默认是拒绝的规则)
iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
#保存规则并重启
service iptables save
systemctl restart iptables
客户端配置文件
client
dev tun
proto tcp
remote 服务器ip/域名 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
auth-nocache
verb 4
<ca>
这里贴上ca.crt文件的内容
</ca>
<cert>
这里贴上client.crt文件的内容
</cert>
<key>
这里贴上client.key文件的内容
</key>
key-direction 1
<tls-auth>
这里贴上ta.key文件的内容
</tls-auth>
用户名密码认证
在证书认证的基础上修改
修改服务端配置文件 server.conf
#客户端不进行证书认证,如果不加将实现证书和用户密码双重认证
client-cert-not-required
#用户和密码验证脚本
auth-user-pass-verify /etc/openv*n/checkpsw.sh via-env
#使用用户名密码登录认证
username-as-common-name
#脚本安全级别
script-security 3
创建脚本和用户密码文件
#!/bin/bash
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openv*n.se>
#
# This script will authenticate OpenV*N users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
PASSFILE="/etc/openv*n/psw-file"
LOG_FILE="/etc/openv*n/openv*n-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
###########################################################
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
#创建 checkpsw.sh
vi /etc/openv*n/checkpsw.sh
#增加执行权限
chmod +x /etc/openv*n/checkpsw.sh
#创建用户密码文件
vi /etc/openv*n/psw-file
zhangs zhangs
lis lis
#修改文件权限
chmod 777 /etc/openv*n/psw-file
chown root.openv*n /etc/openv*n/* -R
#重启openv*n服务
systemctl restart openv*n@server
客户端配置文件修改
#注释掉
;cert client.crt
;key client.key
#添加上
auth-user-pass
client-cert-not-required