当前位置:   article > 正文

openvpn (用户名密码模式)

openvp

1、定义

 OpenVPN是一个用于创建虚拟专用网络加密通道的软件包

2、原理

OpenVPN的技术核心是虚拟网卡,其次是SSL协议实现

虚拟网卡是使用网络底层编程技术实现的一个驱动软件。安装此类程序后主机上会增加一个非真实的网卡,并可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如网络浏览器)向虚拟网卡发送数据,则服务程序可以读取到该数据。如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统中都有相应的实现,这也是OpenVPN能够跨平台使用的一个重要原因。

  在OpenVPN中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,会通过SOCKET从外网上发送出去。这完成了一个单向传输的过程,反之亦然。当远程服务程序通过SOCKET从外网上接收到数据,并进行相应的处理后,又会发送回给虚拟网卡,则该应用软件就可以接收到。

3、加密和身份验证

1)加密

  OpenVPN使用OpenSSL库来加密数据与控制信息。这意味着,它能够使用任何OpenSSL支持的算法。它提供了可选的数据包HMAC功能以提高连接的安全性。此外,OpenSSL的硬件加速也能提高它的性能。2.3.0以后版本引入PolarSSL

2)身份验证

OpenVPN提供了多种身份验证方式,用以确认连接双方的身份,包括:

预享私钥

第三方证书

用户名/密码组合

  预享密钥最为简单,但同时它只能用于创建点对点的VPN;基于PKI的第三方证书提供了最完善的功能,但是需要额外维护一个PKI证书系统。OpenVPN2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍需要一份服务器证书用作加密。

二、在centos 7.5上搭建openvpn

1、安装openvpn easy-rsa(该包用来制作ca证书)

1)安装epel 仓库源

yum install epel-release -y

2)安装openvpn

[root@localhost ~]# yum -y install openvpn

3)在github 上,下载最新的easy-rsa

 https://github.com/OpenVPN/easy-rsa 下载包

上传,解压缩

  1. [root@localhost ~]# mkdir openvpn
  2. [root@localhost  openvpn]# unzip easy-rsa-3.0.5.zip
  3. [root@localhost  openvpn]# mv easy-rsa-3.0.5 easy-rsa

2、配置/etc/openvpn/ 目录

1)创建目录,并复制easy-rsa 目录

  1. [root@localhost  ~]# mkdir -p /etc/openvpn/
  2. [root@localhost  openvpn]# cp -Rp easy-rsa /etc/openvpn/

2)配置,编辑vars文件,根据自己环境配置

  1. [root@localhost  test]# cd /etc/openvpn/easy-rsa/easyrsa3
  2. [root@localhost  easyrsa3]# cp vars.example vars
  3. [root@localhost  easy-rsa3]# vim vars (将下面6行写入文件)
  4. set_var EASYRSA_REQ_COUNTRY "CN"
  5. set_var EASYRSA_REQ_PROVINCE "Beijing"
  6. set_var EASYRSA_REQ_CITY "Beijing"
  7. set_var EASYRSA_REQ_ORG "username"
  8. set_var EASYRSA_REQ_EMAIL "username@163.com"
  9. set_var EASYRSA_REQ_OU "My OpenVPN"

3、创建服务端证书及key

进入/etc/openvpn/easy-rsa/easyrsa3/目录

初始化

  1. [root@localhost  ~]# cd /etc/openvpn/easy-rsa/easyrsa3/
  2. [root@localhost  easyrsa3]# ./easyrsa init-pki
  3. Note: using Easy-RSA configuration from: ./vars
  4. Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
  5. init-pki complete; you may now create a CA or requests.
  6. Your newly created PKI dir is: /etc/openvpn/easy-rsa/easyrsa3/pki

创建根证书

[root@localhost  easyrsa3]# ./easyrsa build-ca

注意:在上述部分需要输入PEM密码 PEM pass phrase,输入两次,此密码必须记住,不然以后不能为证书签名。还需要输入common name 通用名,这个你自己随便设置个独一无二的。

创建服务器端证书

[root@localhost  easyrsa3]# ./easyrsa gen-req server nopass

该过程中需要输入common name,随意但是不要跟之前的根证书的一样

签约服务端证书

[root@localhost  easyrsa3]# ./easyrsa sign server server

该命令中.需要你确认生成,要输入yes,还需要你提供我们当时创建CA时候的密码。如果你忘记了密码,那你就重头开始再来一次吧

创建Diffie-Hellman,确保key穿越不安全网络的命令

[root@localhost  easyrsa3]# ./easyrsa gen-dh

4、创建客户端证书

进入root目录新建client文件夹,文件夹可随意命名,然后拷贝前面解压得到的easy-ras文件夹到client文件夹,进入下列目录

  1. [root@localhost  ~]# mkdir client
  2. [root@localhost  ~]# cp /etc/openvpn/easy-rsa client -Rp
  3. [root@localhost  ~]# cd client/easy-rsa/easyrsa3/

初始化

[root@localhost  easyrsa3]# ./easyrsa init-pki //需输入yes 确定

创建客户端key及生成证书(记住生成是自己客户端登录输入的密码)

 [root@localhost  easyrsa3]# ./easyrsa gen-req username //名字自己定义

将得到的用户req导入然后签约证书

a. 进入到/etc/openvpn/easy-rsa/easyrsa3/

[root@localhost  easyrsa3]# cd /etc/openvpn/easy-rsa/easyrsa3/

b. 导入req

[root@localhost  easyrsa3]# ./easyrsa import-req /root/client/easy-rsa/easyrsa3/pki/reqs/username.req username

c. 签约证书

[root@localhost  easyrsa3]# ./easyrsa sign client username

注:这里生成client所以必须为clientusername要与之前导入名字一致

上面签约证书跟server类似,就不截图了,但是期间还是要输入CA的密码

5、把服务器端必要文件放到etc/openvpn/ 目录下

ca的证书、服务端的证书、秘钥

  1. [root@localhost  ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/
  2. [root@localhost  ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key /etc/openvpn/
  3. [root@localhost  ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openvpn/
  4. [root@localhost  ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn/

6、把客户端必要文件放到root/client/ 目录下

客户端的证书、秘钥&如果想用key模式登陆,将其复制进客户端,并需改登陆模式即可,本文使用用户名密码登陆

  1. [root@localhost  ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /root/client/
  2. [root@localhost  ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/username.crt /root/client/
  3. [root@localhost  ~]# cp /root/client/easy-rsa/easyrsa3/pki/private/username.key /root/client

 查看客户端ca文件,用于复制到客户端配置文件

7、为服务端编写配置文件

1)当你安装好了openvpn时候,他会提供一个server配置的文件例子,在/usr/share/doc/openvpn-2.4.11/sample/sample-config-files 下会有一个server.conf文件,我们将这个文件复制到/etc/openvpn

[root@localhost  ~]# rpm -ql openvpn |grep server.conf

[root@localhost  ~]# cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/

2)修改配置文件

[root@localhost  ~]# vim /etc/openvpn/server.conf

[root@localhost  ~]# grep '^[^#|;]' /etc/openvpn/server.conf 修改的地方如下:

A、key登陆模式配置文件,不太实用可忽略,用B配置文件

  1. local 0.0.0.0
  2. port 1194
  3. proto tcp
  4. dev tun
  5. ca /etc/openvpn/ca.crt
  6. cert /etc/openvpn/server.crt
  7. key /etc/openvpn/server.key # This file should be kept secret
  8. dh /etc/openvpn/dh.pem
  9. server 10.8.0.0 255.255.255.0
  10. ifconfig-pool-persist ipp.txt
  11. push "redirect-gateway def1 bypass-dhcp"
  12. push "dhcp-option DNS 8.8.8.8"
  13. client-to-client
  14. keepalive 10 120
  15. cipher AES-256-CBC
  16. comp-lzo
  17. max-clients 100
  18. user openvpn
  19. group openvpn
  20. persist-key
  21. persist-tun
  22. status /var/log/openvpn/openvpn-status.log
  23. log /var/log/openvpn/openvpn.log
  24. verb 3

B、用户名密码登陆模式配置文件

  1. local 0.0.0.0
  2. port 1194
  3. proto tcp
  4. dev tun
  5. ca /etc/openvpn/ca.crt
  6. cert /etc/openvpn/server.crt
  7. key /etc/openvpn/server.key # This file should be kept secret
  8. dh /etc/openvpn/dh.pem
  9. server 10.8.0.0 255.255.255.0
  10. ifconfig-pool-persist ipp.txt
  11. push "redirect-gateway def1 bypass-dhcp"
  12. push "dhcp-option DNS 8.8.8.8"
  13. client-to-client
  14. keepalive 10 120
  15. cipher AES-256-CBC
  16. comp-lzo
  17. max-clients 100
  18. user openvpn
  19. group openvpn
  20. persist-key
  21. persist-tun
  22. status /var/log/openvpn/openvpn-status.log
  23. log /var/log/openvpn/openvpn.log
  24. verb 3
  25. script-security 3
  26. auth-user-pass-verify /etc/openvpn/checkpw.sh via-env #指定用户认证脚本
  27. username-as-common-name
  28. verify-client-cert none

3)配置用户文件&检查脚本

  1. #检查脚本
  2. [root@localhost ~]# vim /etc/openvpn/checkpw.sh
  3. #!/bin/sh
  4. ###########################################################
  5. # checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
  6. #
  7. # This script will authenticate OpenVPN users against
  8. # a plain text file. The passfile should simply contain
  9. # one row per user with the username first followed by
  10. # one or more space(s) or tab(s) and then the password.
  11. PASSFILE="/etc/openvpn/pw-file"
  12. LOG_FILE="/var/log/openvpn/openvpn-password.log"
  13. TIME_STAMP=`date "+%Y-%m-%d %T"`
  14. ###########################################################
  15. if [ ! -r "${PASSFILE}" ]; then
  16. echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
  17. exit 1
  18. fi
  19. CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
  20. if [ "${CORRECT_PASSWORD}" = "" ]; then
  21. echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  22. exit 1
  23. fi
  24. if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
  25. echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
  26. exit 0
  27. fi
  28. echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  29. exit 1
  30. #密码文件
  31. [root@localhost ~]# vim /etc/openvpn/pw-file
  32. user1 123456789
  33. user2 haha2023

4)配置权限

  1. [root@localhost  ~]# mkdir /var/log/openvpn
  2. [root@localhost  ~]# chown -R openvpn.openvpn /var/log/openvpn/
  3. [root@localhost  ~]# chown -R openvpn.openvpn /etc/openvpn/*

8iptables 设置nat 规则和打开路由转发

  1. [root@localhost  ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
  2. [root@localhost  ~]# iptables -vnL -t nat
  3. [root@localhost  ~]# vim /etc/sysctl.conf //打开路由转发
  4. net.ipv4.ip_forward = 1
  5. [root@localhost  ~]# sysctl -p

9、开启openvpn 服务

  1. [root@localhost  ~]# openvpn /etc/openvpn/server.conf &
  2. [root@localhost ~]# netstat -ntlp 
  3. Active Internet connections (only servers)
  4. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
  5. tcp        0      0 0.0.0.0:1194            0.0.0.0:*               LISTEN      14948/openvpn       

三、客户端连接openvpn

1、下载openvpn客户端安装

https://download.csdn.net/download/zhangxueleishamo/87688762

下载安装即可

2、配置client 端配置文件,并导入

  1. client
  2. proto tcp
  3. remote 服务器ip 1194
  4. dev tun
  5. nobind
  6. persist-key
  7. persist-tun
  8. cipher AES-128-GCM
  9. verb 3
  10. comp-lzo
  11. auth-user-pass
  12. <ca>
  13. 将上文二.6中ca密码在上文中有直接复制进来,即可
  14. </ca>

 3、登陆

四、openvpn优化

1、配置路由&dns

在openvpn的主配置文件中添加路由,当客户端访问指定网段才使用vpn线路,其它时候使用本机原网络,避免不必要操作占用vpn线路流量

添加dhcp自动获得dns,可指定内网dns

  1. push "route 10.0.0.0 255.0.0.0"
  2. #push "redirect-gateway def1 bypass-dhcp"
  3. push "dhcp-option DNS 202.106.0.20"
  4. push "dhcp-option DNS 94.140.14.14"

 2、禁用压缩 comp-lzo

在服务端和客户端都将comp-lzo压缩功能去掉,性能提高了2-4倍

3、更改协议proto tcp---->proto udp  port 21194

众所周知udp要比tcp快的多,更改协议与端口号不仅提速,还提高了安全性

  1. port 21194
  2. proto udp

4、配置一账号多人登陆

duplicate-cn

五、错误

1、No server certificate

Fri Apr 14 17:49:21 2023 WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.
解决在客户端文件中添加

remote-cert-tls server

2、导入文件的时候发现报错:missing external certificate

解决在客户端文件中添加

client-cert-not-required 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/805464
推荐阅读
  

闽ICP备14008679号