简介最近需要部署openvpn服务来实现电脑与另外一个服务器环境内网互通，在网上找到的多数的OpenVPN例子都是基于客户端密钥认证的，多个客户那就要多个密钥，这样配置服务端或者客户端都非常麻烦。本次文章主要实现功能:容易安装容易配置多个账号客户端仅需导入一个配置Prometheus监控这里建议是使用TCP部署服务环境准备使用主机IP系统端口作用106.212.66.32CentOS Linux release 7.9.2009 (Core)5001/tcpOpenVPN 服务器192.168.50.1-----------内网测试服务器网络分配IP作用10.80.0.0/24OpenVPN网段192.168.50.0/24内网通讯网段软件资源软件名称版本easy-rsa3.0.8openvpn2.4.11安装环境本文使用yum来安装openvpn，openvpn及其依赖的一些包在epel源上，首先先安装epel源。# 安装epel源 yum install -y epel-release # 安装依赖包 yum install -y openssl lzo pam openssl-devel lzo-devel pam-devel net-tools* yum install -y easy-rsa # 安装openvpn yum install -y openvpn配置环境上面我们已经安装好了openvpn了，下面我们对openvpn进行配置。配置证书密钥我们通过yum方式安装的 easy-rsa 版本是3.0.8，直接从安装路径copy一份工具出来。这里用默认的 easy-rsa 3.0.8 来配置生成证书密钥。# 复制easy-rsa工具 cp -rf /usr/share/easy-rsa/3.0.8 /etc/openvpn/server/easy-rsa cd /etc/openvpn/server/easy-rsa # 生成证书密钥 ./easyrsa init-pki ./easyrsa build-ca nopass ./easyrsa build-server-full server nopass # 下面这步可能要几分钟 ./easyrsa gen-dh openvpn --genkey --secret ta.key配置服务端创建使用的目录并授权# 日志存放目录 mkdir -p /var/log/openvpn/ # 用户管理目录 mkdir -p /etc/openvpn/server/user # 配置权限 chown -R openvpn:openvpn /var/log/openvpn配置服务端配置文件新建 /etc/openvpn/server/server.conf文件，并写入以下内容:local 0.0.0.0 # VPN服务端端口 port 5001 # VPN服务端协议 proto tcp dev tun ca /etc/openvpn/server/easy-rsa/pki/ca.crt cert /etc/openvpn/server/easy-rsa/pki/issued/server.crt key /etc/openvpn/server/easy-rsa/pki/private/server.key dh /etc/openvpn/server/easy-rsa/pki/dh.pem tls-auth /etc/openvpn/server/easy-rsa/ta.key 0 auth-user-pass-verify /etc/openvpn/server/user/checkpsw.sh via-env # 把openvpn的状态写入日志中,单位秒 status /var/log/openvpn/status.log 3 # 配合status，记录客户端字段：虚拟地址，虚拟IPv6地址，用户名，客户端ID，对等ID status-version 3 script-security 3 verify-client-cert none username-as-common-name # VPN客户端自动分配的DHCP地址池 server 10.80.0.0 255.255.255.0 # 需要通讯的内网网段（如果需要VPN客户端与客户端组成一个私网,也可加入10.80.0.0网段） push "route 192.168.50.0 255.255.255.0" compress lzo client-to-client duplicate-cn keepalive 10 120 cipher AES-256-CBC comp-lzo persist-key persist-tun verb 3 client-cert-not-required # 日志配置路径 log /var/log/openvpn/server.log log-append /var/log/openvpn/server.log status /var/log/openvpn/status.log也可以复制一份模板文件进行改写，模板文件路径 /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf创建用户密码文件格式是用户 密码以空格分割即可echo 'demo demo123.' >> /etc/openvpn/server/user/psw-file chmod 600 /etc/openvpn/server/user/psw-file chown -R openvpn:openvpn /etc/openvpn/server/user/psw-file创建密码检查脚本新建一个shell文件/etc/openvpn/server/user/checkpsw.sh；用作核对登录用户密码、用户是否正确等；内容如下：#!/bin/sh PASSFILE="/etc/openvpn/server/user/psw-file" LOG_FILE="/var/log/openvpn/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赋予可执行的权限chmod 700 /etc/openvpn/server/user/checkpsw.sh chown openvpn:openvpn /etc/openvpn/server/user/checkpsw.sh路由配置1). 防火墙配置需要配置一条NAT的规则;这里有两种方式: iptables或者firewalld、任选其一# iptables iptables -t nat -A POSTROUTING -s 10.80.0.0/24 -o eth0 -j MASQUERADE # firewalld firewall-cmd --permanent --add-masquerade firewall-cmd --permanent --add-service=openvpn # 或者添加自定义端口 firewall-cmd --permanent --add-port=5001/tcp firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.80.0.0/24 -o eth0 -j MASQUERADE firewall-cmd --reload 2). 开启路由转发echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf sysctl -p启动服务端nohup openvpn /etc/openvpn/server/server.conf >/dev/null 2>&1 &验证是否启动成功netstat -anpt|grep -w 'openvpn'|if [[ $(wc -l) != 0 ]];then echo "openvpn启动成功";else echo "openvpn启动失败";fi # 启动成功后；也会自动为服务器新增一张通讯网卡`tun0` ifconfig tun0配置客户端客户端直接下载安装最新版安装包即可: 点我跳转(需富强)因为我们前面配置的是账号密码认证又是集成客户端配置到一个ovpn文件内，所以我们只需要从server端将生成的ca.crt、ta.key提取出来并嵌入到ovpn文件内即可。步骤如下:1). 查看ca.crt文件内容并记录cat /etc/openvpn/server/easy-rsa/pki/ca.crt2). 查看ta.key文件内容并记录cat /etc/openvpn/server/easy-rsa/ta.key在/etc/openvpn/client目录下新建一个文件 client.ovpn，文件内容如下：client dev tun verb 3 mute 10 proto tcp auth-nocache persist-tun persist-key compress lzo key-direction 1 # 客户端通过用户名和密码认证 auth-user-pass cipher AES-256-CBC # 配置VPN服务器地址及端口 remote 106.212.66.32 5001 remote-cert-tls server 查看ca.crt文件的内容粘贴到此处 查看ta.key文件的内容粘贴到此处 使用一切准备就绪后，将编写的client.ovpn客户端文件下发至客户端内，启动openvpn的客户端，导入客户端文件；然后输入账号密码即可登录。默认部署用户: demo默认部署密码: demo123.登陆成功后；我们可测试Ping一下之前配置可通讯的网段是否可正常连接.监控这里使用Prometheus openvpn_exporter 的方式来进行监控；因为前面我们已经在vpn的配置文件中写入了状态文件，所以openvpn服务端启动后，我们就可以直接进行监控。以docker的方式在openvpn服务端启动的exrporter为例：docker run -itd -p 9176:9176 --name openvpn_exporter \ -v /var/log/openvpn/status.log:/etc/openvpn_exporter/server.status \ -v /etc/localtime:/etc/localtime \ kumina/openvpn-exporter -openvpn.status_paths /etc/openvpn_exporter/server.status启动后，访问 http://127.0.0.1:9176/metrics 的方式进行请求测试，若无问题，则返回一下示例：[root@localhost ~]# curl 127.0.0.1:9176/metrics # HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary$$ go_gc_duration_seconds{quantile="0"} 8.9293e-05 go_gc_duration_seconds{quantile="0.25"} 0.000138057 go_gc_duration_seconds{quantile="0.5"} 0.000184327 ......接着在Prometheus的配置文件prometheus.yml中配置exporter的JOB - job_name: openvpn-metrics static_configs: - targets: ['IP:9176']Prometheus配置重载后，即可。接着在普罗米修斯中查询语句，也可正常返回数据关于Grafana面板，则使用ID为 10562 的即可,最终效果如下：运维一、客户端连接是不是只需要给一个配置文件和一个账户信息就行?是二、如何查看服务端日志?tailf /var/log/openvpn/server.log三、如何查看用户登陆信息?tailf /var/log/openvpn/password.log四、如何为VPN新增/删除连接用户?# 格式是用户 密码以空格分割即可 vim /etc/openvpn/server/user/psw-file