系统环境 CentOS7.9

证书认证

安装 OpenV*N 包

  1. #安装 openv*n、iptables-services
  2. yum install openv*n iptables-services -y

配置 EasyRSA

  1. #安装 easy-rsa
  2. yum install easy-rsa -y
  3. cp -r /usr/share/easy-rsa/3.0.8/ /etc/openv*n/easy-rsa
  4. cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openv*n/easy-rsa/vars

创建证书和密钥

  1. cd /etc/openv*n/easy-rsa/
  2. #初始化目录
  3. ./easyrsa init-pki
  4. #创建根证书 nopss 表示不加密;不加此参数,需要输入密码
  5. ./easyrsa build-ca nopass
  6. #创建服务端秘钥
  7. ./easyrsa gen-req server nopass
  8. #执行过程中 Common Name (eg: your user, host, or server name) 直接回车取默认名称

image.png

服务端证书签名

过程中需要输入 yes

  1. #服务端证书签名
  2. ./easyrsa sign-req server server

image.png

创建客户端密钥

  1. #创建客户端秘钥
  2. ./easyrsa gen-req client nopass

image.png

客户端证书签名

过程中需要输入 yes

  1. #客户端证书签名
  2. ./easyrsa sign-req client client

image.png

创建 Diffie-Hellman

  1. #创建 Diffie-Hellman
  2. ./easyrsa gen-dh

image.png

拷贝证书到目录

  1. cd /etc/openv*n/easy-rsa/pki/
  2. cp ca.crt dh.pem /etc/openv*n/
  3. cp private/server.key issued/server.crt /etc/openv*n/server/
  4. cp private/client.key issued/client.crt /etc/openv*n/client/

编辑服务端配置文件 server.conf

  1. cd /etc/openv*n/
  2. cp /usr/share/doc/openv*n-2.4.12/sample/sample-config-files/server.conf ./
  3. #监听本机ip地址
  4. local 0.0.0.0
  5. #监控本机端口号
  6. port 1194
  7. #指定采用的传输协议,可以选择tcp或udp
  8. proto tcp
  9. #指定创建的通信隧道类型,可选tun或tap
  10. dev tun
  11. #指定CA证书的文件路径
  12. ca /etc/openv*n/ca.crt
  13. #指定服务器端的证书文件路径
  14. cert /etc/openv*n/server/server.crt
  15. #指定服务器端的私钥文件路径
  16. key /etc/openv*n/server/server.key
  17. #指定迪菲赫尔曼参数的文件路径
  18. dh /etc/openv*n/dh.pem
  19. #指定虚拟局域网占用的IP地址段和子网掩码, 内网 ip (172.16.61.243)
  20. server 172.16.0.0 255.255.255.0
  21. #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
  22. ifconfig-pool-persist ipp.txt
  23. #推送客户端可以访问的v*n路由网段
  24. push "route 192.168.30.0 255.255.252.0"
  25. #自动推送客户端上的网关及DHCP (此参数会让客户端都走v*n的网络,不加此参数可以实现正常走本地网络,访问v*n资源走v*n网络)
  26. push "redirect-gateway def1 bypass-dhcp"
  27. #OpenV*N的DHCP功能为客户端提供指定的 DNS、WINS 等
  28. push "dhcp-option DNS 114.114.114.114"
  29. #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
  30. client-to-client
  31. #允许一套证书或账户多人登录
  32. duplicate-cn
  33. #每10秒ping一次,连接超时时间设为120秒
  34. keepalive 10 120
  35. #开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
  36. tls-auth /etc/openv*n/ta.key 0
  37. #加密认证算法
  38. cipher AES-256-CBC
  39. #使用lzo压缩的通讯,服务端和客户端都必须配置
  40. comp-lzo
  41. #最大连接用户
  42. max-clients 100
  43. #定义运行的用户和组
  44. user openv*n
  45. group openv*n
  46. #重启时仍保留一些状态
  47. persist-key
  48. persist-tun
  49. #输出短日志,每分钟刷新一次,以显示当前的客户端
  50. status /etc/openv*n/openv*n-status.log
  51. #日志保存路径
  52. log /etc/openv*n/openv*n.log
  53. log-append /etc/openv*n/openv*n.log
  54. #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
  55. verb 4
  56. #相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
  57. mute 20

启动 OpenV*N 服务

  1. #修改文件目录权限
  2. chown root.openv*n /etc/openv*n/* -R
  3. #启动服务
  4. systemctl start openv*n@server
  5. #查看是否启动成功
  6. ps -aux|grep openv*n

配置系统转发和开放端口

云服务器需要开放对应端口 如:阿里云要在安全组中放开1194 端口

  1. #/etc/sysctl.conf 配置文件中添加
  2. net.ipv4.ip_forward=1
  3. #生效
  4. sysctl -p
  5. #清空iptables规则(如果机器第一次安装iptables-services,没有增删过规则,可以不用执行此步骤)
  6. iptables -F
  7. iptables -F -t nat
  8. iptables -X
  9. service iptables save
  10. systemctl restart iptables
  11. #iptables(重要一点:转发请求上网)
  12. iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE
  13. #默认iptables是允许所有访问进入的,所以这条可以不用加(除非设置了INPUT默认是拒绝的规则)
  14. iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
  15. #保存规则并重启
  16. service iptables save
  17. systemctl restart iptables

客户端配置文件

  1. client
  2. dev tun
  3. proto tcp
  4. remote 服务器ip/域名 1194
  5. resolv-retry infinite
  6. nobind
  7. persist-key
  8. persist-tun
  9. remote-cert-tls server
  10. cipher AES-256-CBC
  11. comp-lzo
  12. auth-nocache
  13. verb 4
  14. <ca>
  15. 这里贴上ca.crt文件的内容
  16. </ca>
  17. <cert>
  18. 这里贴上client.crt文件的内容
  19. </cert>
  20. <key>
  21. 这里贴上client.key文件的内容
  22. </key>
  23. key-direction 1
  24. <tls-auth>
  25. 这里贴上ta.key文件的内容
  26. </tls-auth>

用户名密码认证

在证书认证的基础上修改

修改服务端配置文件 server.conf

  1. #客户端不进行证书认证,如果不加将实现证书和用户密码双重认证
  2. client-cert-not-required
  3. #用户和密码验证脚本
  4. auth-user-pass-verify /etc/openv*n/checkpsw.sh via-env
  5. #使用用户名密码登录认证
  6. username-as-common-name
  7. #脚本安全级别
  8. script-security 3

创建脚本和用户密码文件

  1. #!/bin/bash
  2. ###########################################################
  3. # checkpsw.sh (C) 2004 Mathias Sundman <mathias@openv*n.se>
  4. #
  5. # This script will authenticate OpenV*N users against
  6. # a plain text file. The passfile should simply contain
  7. # one row per user with the username first followed by
  8. # one or more space(s) or tab(s) and then the password.
  9. PASSFILE="/etc/openv*n/psw-file"
  10. LOG_FILE="/etc/openv*n/openv*n-password.log"
  11. TIME_STAMP=`date "+%Y-%m-%d %T"`
  12. ###########################################################
  13. if [ ! -r "${PASSFILE}" ]; then
  14. echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
  15. exit 1
  16. fi
  17. CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
  18. if [ "${CORRECT_PASSWORD}" = "" ]; then
  19. echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  20. exit 1
  21. fi
  22. if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
  23. echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
  24. exit 0
  25. fi
  26. echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  27. exit 1
  1. #创建 checkpsw.sh
  2. vi /etc/openv*n/checkpsw.sh
  3. #增加执行权限
  4. chmod +x /etc/openv*n/checkpsw.sh
  5. #创建用户密码文件
  6. vi /etc/openv*n/psw-file
  7. zhangs zhangs
  8. lis lis
  9. #修改文件权限
  10. chmod 777 /etc/openv*n/psw-file
  11. chown root.openv*n /etc/openv*n/* -R
  12. #重启openv*n服务
  13. systemctl restart openv*n@server

客户端配置文件修改

  1. #注释掉
  2. ;cert client.crt
  3. ;key client.key
  4. #添加上
  5. auth-user-pass
  6. client-cert-not-required