系统环境 CentOS7.9
证书认证
安装 OpenV*N 包
#安装 openv*n、iptables-servicesyum install openv*n iptables-services -y
配置 EasyRSA
#安装 easy-rsayum install easy-rsa -ycp -r /usr/share/easy-rsa/3.0.8/ /etc/openv*n/easy-rsacp /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或udpproto tcp#指定创建的通信隧道类型,可选tun或tapdev 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*ngroup openv*n#重启时仍保留一些状态persist-keypersist-tun#输出短日志,每分钟刷新一次,以显示当前的客户端status /etc/openv*n/openv*n-status.log#日志保存路径log /etc/openv*n/openv*n.loglog-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 -Fiptables -F -t natiptables -Xservice iptables savesystemctl 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 savesystemctl restart iptables
客户端配置文件
clientdev tunproto tcpremote 服务器ip/域名 1194resolv-retry infinitenobindpersist-keypersist-tunremote-cert-tls servercipher AES-256-CBCcomp-lzoauth-nocacheverb 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}" ]; thenecho "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}exit 1fiCORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`if [ "${CORRECT_PASSWORD}" = "" ]; thenecho "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}exit 1fiif [ "${password}" = "${CORRECT_PASSWORD}" ]; thenecho "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}exit 0fiecho "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}exit 1
#创建 checkpsw.shvi /etc/openv*n/checkpsw.sh#增加执行权限chmod +x /etc/openv*n/checkpsw.sh#创建用户密码文件vi /etc/openv*n/psw-filezhangs zhangslis lis#修改文件权限chmod 777 /etc/openv*n/psw-filechown root.openv*n /etc/openv*n/* -R#重启openv*n服务systemctl restart openv*n@server
客户端配置文件修改
#注释掉;cert client.crt;key client.key#添加上auth-user-passclient-cert-not-required
