需求
1)通过vpn直接访问内网容器ip可以直接登录,不再需要先登入公网IP再跳转到内网容器内部
介绍
1、OpenVPN 是一个基于 OpenSSL库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。vpn直译就是虚拟专用通道,是提供企业之间或者公司之间安全数据传输的隧道。OpenVPN是一个全特性的SSL VPN,它使用2层或3层的安全网络技术,使用的是工业标准的SSL/TLS协议。SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(TransportLayer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。OpenVPN支持灵活的客户端授权方式,支持证书、智能卡、用户名和密码,允许用户可以通过防火墙连接到VPN的虚拟接口,OpenVPN不是一个基于web代理的应用,也不是基于浏览器访问
OpenVpn应用场景
1)企业员工远程办公,通过远程VPN连接到公司的服务器,访问公司ERP、OA等系统。IT技术人员通过VPN远程连接到机房进行系统维护;
2)总部与分支机构之间联通,打通分支与总部的连接;
3)多IDC机房之间的互联,实现多机房之间的互联互通,数据共享,文件传送;
注意:OpenVPN适用于功能性实现,对于大流量大带宽应用,建议使用点对点专线实现互联
部署
1、关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2、关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
3、开启内核参数IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p /etc/sysctl.conf
4、拉取镜像
docker pull kylemanna/openvpn:latest
5、创建映射目录
mkdir -p /mydata/openvpn/conf
6、生成配置文件
[root@huk openvpn]# docker run -v /mydata/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://IP
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '192.168.254.0/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Processing PUSH Config: 'comp-lzo no'
Successfully generated config
Cleaning up before Exit ...
- IP为公网IP
7、生成密钥文件
[root@huk openvpn]# docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Enter New CA Key Passphrase: #输入新的CA密钥密码
Re-Enter New CA Key Passphrase: #重新输入新的CA密钥密码
Generating RSA private key, 2048 bit long modulus (2 primes)
................................................................+++++
....................................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: #回车
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
+..........................................................................................................+..........................................................................................................+...............................................................................++*++*++*++*
DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating a RSA private key
..+++++
............+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-73.HPFKLO/tmp.GhLfFa'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-73.HPFKLO/tmp.EjcHHg
Enter pass phrase for /etc/openvpn/pki/private/ca.key: #输入通行证短语
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'43.143.33.33'
Certificate is to be certified until Mar 26 02:18:37 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Using configuration from /etc/openvpn/pki/easy-rsa-148.GchhEa/tmp.nammhn
Enter pass phrase for /etc/openvpn/pki/private/ca.key: #输入通行证短语
An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
8、生成客户端证书
[root@huk openvpn]# docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full huk nopass
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating a RSA private key
.....................+++++
...............+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-1.bafdPP/tmp.OlmjpC'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-1.bafdPP/tmp.OfAeIf
Enter pass phrase for /etc/openvpn/pki/private/ca.key: ## 输入刚才设置的密码
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'huk'
Certificate is to be certified until Mar 26 02:19:11 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
- huk替换你要设置的名字
9、导出客户端配置
[root@huk openvpn]# docker run -v /mydata/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient huk > /mydata/openvpn/conf/huk.ovpn
10、启动openvpn
[root@huk conf]# docker run --name openvpn -v /mydata/openvpn:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
a2b5bfd06e5ade48041bddbcea1431d7f6043b1534a70298defdf7ac9dafd6e3
- 云防火墙开启udp1194端口
配置文件说明
服务端配置文件
- 英文原文
#################################################
# 多客户端服务器的OpenVPN 2.0配置文件示例 #
# #
# 本文件用于多客户端<->单服务器端的 #
# OpenVPN服务器端配置 #
# #
# OpenVPN也支持单机<->单机的配置 #
# (在网站上的示例页面更多信息) #
# #
# 这个配置可以在Windows或Linux/BSD系统上工作。 #
# Windows的路径名需要加双引号并使用双反斜杠,如: #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
# #
# 前面加'#'或';'的是注释 #
#################################################
# OpenVPN应该监听哪个本地IP地址(可选)
# 如果不设置,默认监听所有IP
;local a.b.c.d
# OpenVPN应该监听哪个端口(TCP/UDP)
# 如果想在同一台计算机上运行多个OpenVPN实例,可以使用不同的端口号来区分它们
# 在防火墙上打开这个端口
port 1194
# 服务器使用TCP还是UDP协议
;proto tcp
proto udp
# 指定OpenVPN创建的通信隧道类型
# "dev tun"将会创建一个路由IP隧道
# "dev tap"将会创建一个以太网隧道
# 如果是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0"
# 如果想控制VPN的访问策略,必须为TUN/TAP接口创建防火墙规则
# 在非Windows系统中,可以给出明确的单位编号,如"tun0"
# 在Windows中,也可以使用"dev-node"
# 在大多数系统上,除非部分或完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。
;dev tap
dev tun
# 如果想配置多个隧道,需要用到网络连接面板中TAP-Win32适配器的名称(如"MyTap")
# 在XP SP2或更高版本的系统中,可能需要有选择地禁用掉针对TAP适配器的防火墙
# 通常情况下,非Windows系统则不需要该指令。
;dev-node MyTap
# 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。
# 每个客户端和服务器端都需要它们各自的证书和私钥文件。
# 服务器端和所有的客户端都将使用相同的CA证书文件。
#
# 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。
# 服务器端和每个客户端的证书必须使用唯一的Common Name。
#
# 也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。
# OpenVPN也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令)
ca ca.crt
cert server.crt
key server.key # 该文件应该保密
# 迪菲·赫尔曼参数
# 使用如下命令生成:
# openssl dhparam -out dh2048.pem 2048
dh dh2048.pem
# 网络拓扑结构
# 应该为子网(通过IP寻址)
# 除非必须支持Windows客户端v2.0.9及更低版本(net30即每个客户端/30)
# 默认为"net30"(不建议)
;topology subnet
# 设置服务器端模式,并提供一个VPN子网,以从中为客户端分配IP地址
# 本例中服务器端自身占用10.8.0.1,其他的将分配给客户端使用
# 每个客户端将能够通过10.8.0.1访问服务器
# 如果使用的是以太网桥接模式,注释掉本行。更多信息请查看官方手册页面。
server 10.8.0.0 255.255.255.0
# 在此文件中维护客户端与虚拟IP地址之间的关联记录
# 如果OpenVPN重启,重新连接的客户端可以被分配到先前分配的虚拟IP地址
ifconfig-pool-persist ipp.txt
# 该指令仅针对以太网桥接模式
# 首先,必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接
# 然后,需要手动设置桥接接口的IP地址、子网掩码,这里假设为10.8.0.4和255.255.255.0
# 最后,必须指定子网的一个IP范围(例如从10.8.0.50开始,到10.8.0.100结束),以便于分配给连接的客户端
# 如果不是以太网桥接模式,直接注释掉这行指令即可
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
# 该指令仅针对使用DHCP代理的以太网桥接模式
# 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址
# 在此之前,也需要先将以太网网卡接口和TAP接口进行桥接
# 注意:该指令仅用于OpenVPN客户端(如Windows),并且该客户端的TAP适配器需要绑定到一个DHCP客户端上
;server-bridge
# 推送路由信息到客户端,以允许客户端能够连接到服务器后的其他私有子网
# 即允许客户端访问VPN服务器可访问的其他局域网
# 记住,这些私有子网还需要将OpenVPN客户端地址池(10.8.0.0/255.255.255.0)路由回到OpenVPN服务器
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
# 要为指定的客户端分配特定的IP地址,或者客户端后的私有子网也要访问VPN
# 可以针对该客户端的配置文件使用ccd子目录
# 请参阅手册页获取更多信息
# 示例1:假设有个Common Name为"Thelonious"的客户端后有一个小型子网也要连接到VPN
# 该子网为192.168.40.128/255.255.255.248
# 首先,去掉下面两行指令的注释:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# 然后创建一个文件ccd/Thelonious,该文件的内容为(没有"#"):
# iroute 192.168.40.128 255.255.255.248
# 客户端所在的子网就可以访问VPN了
# 注意,这个指令只能在基于路由模式而不是基于桥接模式下才能生效
# 比如,你使用了"dev tun"和"server"指令
# 示例1:假设要给Thelonious分配一个固定的IP地址10.9.0.1
# 首先,去掉下面两行指令的注释:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# 然后在文件ccd/Thelonious中添加如下指令(没有"#"):
# ifconfig-push 10.9.0.1 10.9.0.2
# 如果想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法:
# (1)运行多个OpenVPN守护进程,每个进程对应一个群组,并为每个进程(群组)启用适当的防火墙规则
# (2)(进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则
# 关于learn-address脚本的更多信息请参考官方手册页面
;learn-address ./script
# 如果启用该行指令,所有客户端的默认网关都将重定向到VPN
# 这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN
# (为确保能正常工作,OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接)
;push "redirect-gateway def1 bypass-dhcp"
# 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址
# 下列地址来自opendns.com提供的Public DNS服务器
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
# 去掉该行指令的注释将允许不同的客户端之间互相访问
# 默认情况,客户端只能访问服务器
# 为了确保客户端只能看见服务器,还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则
;client-to-client
# 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接,那么可以取消该指令的注释
# 建议该指令仅用于测试目的。对于生产环境使用而言,每个客户端都应该拥有自己的证书和私钥
# 如果没有为每个客户端分别生成Common Name唯一的证书/私钥,可以取消该行的注释(不推荐这样做)
;duplicate-cn
# keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭
# 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭
keepalive 10 120
# 出于SSL/TLS之外更多的安全考虑,创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击
# 可以使用以下命令来生成:
# openvpn --genkey --secret ta.key
#
# 服务器和每个客户端都需要拥有该密钥的一个拷贝
# 第二个参数在服务器端应该为'0',在客户端应该为'1'
tls-auth ta.key 0 # 该文件应该保密
# 选择一个密码加密算法,该配置项也必须复制到每个客户端配置文件中
# 注意,v2.4客户端/服务器将自动以TLS模式协商AES-256-GCM,请参阅手册中的ncp-cipher选项
cipher AES-256-CBC
# 在VPN链接上启用压缩并将选项推送到客户端(仅适用于v2.4 +,对于早期版本,请参阅下文)
;compress lz4-v2
;push "compress lz4-v2"
# 对于与旧客户端兼容的压缩,使用comp-lzo
# 如果在此启用,还必须在客户端配置文件中启用它
;comp-lzo
# 允许并发连接的客户端的最大数量
;max-clients 100
# 初始化后减少OpenVPN守护进程的权限是一个好主意
# 该指令仅限于非Windows系统中使用
;user nobody
;group nobody
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源
persist-key
persist-tun
# 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次
status openvpn-status.log
# 默认情况下,日志消息将写入syslog(在Windows系统中,如果以服务方式运行,日志消息将写入OpenVPN安装目录的log文件夹中)
# 可以使用log或者log-append来改变这种默认设置
# "log"方式在每次启动时都会清空之前的日志文件
# "log-append"是在之前的日志内容后进行追加
# 你可以使用两种方式之一(不要同时使用)
;log openvpn.log
;log-append openvpn.log
# 为日志文件设置适当的冗余级别(0~9)
# 冗余级别越高,输出的信息越详细
#
# 0 表示静默运行,只记录致命错误
# 4 表示合理的常规用法
# 5和6 可以帮助调试连接错误
# 9 表示极度冗余,输出非常详细的日志信息
verb 3
# 忽略过多的重复信息
# 相同类别的信息只有前20条会输出到日志文件中
;mute 20
# 通知客户端,当服务器重新启动时,可以自动重新连接
# 只能是UDP协议使用,TCP使用的话不能启动服务
explicit-exit-notify 1
# (如果不添加该指令则)默认值3600,也就是一个小时进行一次TSL重新协商
# 这个参数在服务端和客户端设置都有效
# 如果两边都设置了,就按照时间短的设定优先
# 当两边同时设置成0,表示禁用TSL重协商。使用OTP认证需要禁用
reneg-sec 0
客户端配置文件
- 英文原文
##############################################
# 多客户端的OpenVPN 2.0的客户端配置文件示例 #
# #
# 该配置文件可以被多个客户端使用 #
# 不过每个客户端都应该有自己的证书和密钥文件 #
# #
# 在Windows上此配置文件的后缀应该是".ovpn" #
# 在Linux/BSD系统中后缀是".conf" #
##############################################
# 指定这是一个客户端,这将从服务器获取某些配置文件指令
client
# 使用与服务器上相同的设置
# 在大多数系统中,除非部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用
;dev tap
dev tun
# 在Windows系统中,如果想配置多个隧道,则需要该指令
# 需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")
# 在XP SP2或更高版本的系统中,可能需要禁用掉针对TAP适配器的防火墙
;dev-node MyTap
# 指定连接的服务器是采用TCP还是UDP协议
# 使用与服务器上相同的设置
;proto tcp
proto udp
# 指定服务器的主机名(或IP)以及端口号
# 如果有多个VPN服务器,为了实现负载均衡,可以设置多个remote指令
remote my-server-1 1194
;remote my-server-2 1194
# 如果指定了多个remote指令,启用该指令将随机连接其中的一台服务器
# 否则,客户端将按照指定的先后顺序依次尝试连接服务器
;remote-random
# 启用该指令,与服务器连接中断后将自动重新连接,
# 这在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用
resolv-retry infinite
# 大多数客户端不需要绑定本机特定的端口号
nobind
# 在初始化完毕后,降低OpenVPN的权限(该指令仅限于非Windows系统中使用)
;user nobody
;group nobody
# 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源
persist-key
persist-tun
# 如果通过HTTP代理方式来连接到实际的VPN服务器
# 在此处指定代理服务器的主机名(或IP)和端口号
# 如果代理服务器需要身份认证,请参考官方手册
;http-proxy-retry # 连接失败时自动重试
;http-proxy [proxy server] [proxy port #]
# 无线网络通常会产生大量的重复数据包
# 设置此标识将忽略掉重复数据包的警告信息
;mute-replay-warnings
# SSL/TLS参数配置
# 更多描述信息请参考服务器端配置文件
# 最好为每个客户端单独分配.crt/.key文件对
# 单个CA证书可以供所有客户端使用
ca ca.crt
cert client.crt
key client.key
# 通过检查证书具有正确的密钥使用设置来验证服务器证书
# 这是防止此处讨论的潜在攻击的重要预防措施:
# https://openvpn.net/howto.html#mitm
#
# 要使用此功能,EasyRSA生成服务器证书的时候进行相关设置
remote-cert-tls server
# 如果在服务器上使用tls-auth密钥,那么每个客户端也必须拥有密钥
tls-auth ta.key 1
# 选择一个加密算法,服务器使用的算法选项,也必须在这里指定它
# 注意,v2.4客户端/服务器将自动以TLS模式协商AES-256-GCM。
# 另请参阅手册中的ncp-cipher选项
cipher AES-256-CBC
# 在VPN连接中启用压缩
# 除非在服务器配置文件中启用,否则不要启用它
;comp-lzo
# 设置日志文件冗余级别(0~9)
# 0 表示静默运行,只记录致命错误
# 4 表示合理的常规用法
# 5和6 可以帮助调试连接错误
# 9 表示极度冗余,输出非常详细的日志信息
verb 3
# 忽略过多的重复信息
# 相同类别的信息只有前20条会输出到日志文件中
;mute 20
# (如果不添加该指令则)默认值3600,也就是一个小时进行一次TSL重新协商
# 这个参数在服务端和客户端设置都有效
# 如果两边都设置了,就按照时间短的设定优先
# 当两边同时设置成0,表示禁用TSL重协商。使用OTP认证需要禁用
reneg-sec 0
openvpn用户管理
1、开启密码认证方式
客户端修改配置
# use username and password login
# 新加此行,开启密码验证脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
# 加上client-cert-not-required代表只使用用户密码方式验证登录,不加则代表需要证书和用户名密码双重验证登录
client-cert-not-required
# 新加此行,使用客户提供的UserName作为Common Name
username-as-common-name
# 该指令提供对OpenVPN使用外部程序和脚本的策略级别的控制。较低的 水平 值更具限制性,较高的值更宽松。级别设置
# 0- 完全不调用外部程序。
# 1- (默认)仅调用内置可执行文件,例如ifconfig,ip,route或netsh。
# 2- 允许调用内置的可执行文件和用户定义的脚本。
# 3- 允许通过环境变量将密码传递给脚本(可能不安全)。
# 特别注意如果没有这个配置项会导致服务端校验密码时无法获取到密码,导致校验失败
script-security 3
2、增加密码验证脚本
vim checkpsw.sh
----
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
#
# This script will authenticate OpenVPN 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/openvpn/user_passwd.txt"
LOG_FILE="/etc/openvpn/log/openvpn-login.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
3、为密码验证脚本checkpsw.sh添加可执行性权限,执行以下命令:
chmod +x /etc/openvpn/checkpsw.sh
4、配置账号密码文件
- 配置账号/密码文件user_passwd.txt的内容,新增账号/密码到这个文件,一行一个账号,账号密码用空格隔开:
- 注:密码需要使用字母加数字,特殊字符等,且不能以数字开头
1、添加用户脚本
vim add_user.sh
----
#!/bin/bash
read -p "please your username: " NAME
docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full $NAME nopass
docker run -v /mydata/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient $NAME > /mydata/openvpn/conf/"$NAME".ovpn
#使用 openssl 生成密码,这里使用 base64 编码随机函数,最后一个数字参数表示长度
echo "$NAME $(openssl rand -base64 10 | cut -d "=" -f 1)" >> /mydata/openvpn/user_passwd.txt && echo "用户${NAME}创建成功" || {
echo "用户${NAME}创建异常"
exit 1
}
#修改客户端配置,编辑客户端*.ovpn 结尾的配置文件,新增账号密码验证方式auth-user-pass
sed -i '3iauth-user-pass' /mydata/openvpn/conf/"$NAME".ovpn
#注释掉客户端密钥认证方式:
#;cert laptop.crt
#;key laptop.key
user=`grep "${NAME}" /mydata/openvpn/user_passwd.txt`
echo "账号密码为:${user}"
docker restart openvpn
#echo $NAME >> /mydata/openvpn/user_passwd.txt && openssl rand -base64 10 | cut -d "=" -f 1 | tr -d '\n' >> /mydata/openvpn/user_passwd.txt
2、删除用户脚本
vim del_user.sh
----
#!/bin/bash
read -p "Delete username: " DNAME
docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa revoke $DNAME
docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa gen-crl
docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn rm -f /etc/openvpn/pki/reqs/"DNAME".req
docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn rm -f /etc/openvpn/pki/private/"DNAME".key
docker run -v /mydata/openvpn:/etc/openvpn --rm -it kylemanna/openvpn rm -f /etc/openvpn/pki/issued/"DNAME".crt
rm -rf /mydata/openvpn/conf/${DNAME}.ovpn && echo "删除用户:${DNAME}.ovpn成功" || {
echo "删除用户:${DNAME}.ovpn异常"
exit 1
}
sed -i "/^${DNAME} /d" /mydata/openvpn/user_passwd.txt && echo "删除用户:${DNAME}成功" || {
echo "删除用户:${DNAME}异常"
exit 1
}
docker restart openvpn
使用客户端
1、创建账号
[root@huk openvpn]# bash add_user.sh
please your username: ext4.cn
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating a RSA private key
.....+++++
..................................................................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-1.EgEhoA/tmp.mDapAe'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-1.EgEhoA/tmp.Illinn
Enter pass phrase for /etc/openvpn/pki/private/ca.key: #刚才创建的私钥密码
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'ext4.cn'
Certificate is to be certified until Mar 26 08:07:27 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
用户ext4.cn创建成功
账号密码为:ext4.cn 密码***
openvpn
2、下载客户端
3、桌面端
- 从服务端把证书拷贝到桌面上,并将证书
*.ovpn
直接导入到客户端内,输入用户名密码,点击链接
- 查看登陆日志
[root@huk log]# tail -f openvpn-login.log
2022-12-22 03:18:07: Could not open password file "/etc/openvpn/user_passwd.txt" for reading.
2022-12-22 08:19:26: Successful authentication: username="ext4.cn".
4、移动端,已iPhone为例
- 注意⚠️iOS手机商店大陆版下不到客户端,需要登陆别的地区ID
- 下载完之后打开openVPN客户端软件
- 隔空投送文件到移动端,选择打开方式为OpenVPN
验证
1、查看server端内网IP
[root@huk log]# hostname -I
10.0.4.3 172.18.0.1 172.17.0.1
- ping测试
- 内网端口访问
- ssh登陆
2、删除用户
[root@huk openvpn]# bash del_user.sh
Delete username: ext4.cn
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Please confirm you wish to revoke the certificate with the following subject:
subject=
commonName = ext4.cn
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
Using configuration from /etc/openvpn/pki/easy-rsa-1.AfKdBI/tmp.OaAGAO
Enter pass phrase for /etc/openvpn/pki/private/ca.key: #创建的私钥密码
Revoking Certificate D0E8A6DCE218513492C727A3A0D7B6D3.
Data Base Updated
IMPORTANT!!!
Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Using configuration from /etc/openvpn/pki/easy-rsa-1.bGMjbo/tmp.abnEOO
Enter pass phrase for /etc/openvpn/pki/private/ca.key: #创建的私钥密码
An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
删除用户:ext4.cn.ovpn成功
删除用户:ext4.cn成功
openvpn
- 再次验证登陆
- 可以看到,删除用户之后再次登陆会身份验证失败 用户身份验证失败
LDAP集成
1、后续再更