OpenVPN不多作解释,无论大小型企业、学校都可能会用到,多种身份验证方式以及传输的加密方式无疑比其它PVN应用面更广,除了供用户拨入企业/学校内部进行联网,还可以在企业与子公司之间进行加密传输,OpenVPN能实现二/三层的基于隧道的传输,再配合企业内部的不同Vlan,能实现很多复杂的功能。

(图片来源于互联网)
最近因为一些原因,又需要折腾OpenVPN,发现原来写的脚本是真丑陋,特别是参考github上一些大神写的优美代码,功能实现方式简直......
所以重新写了一下,可复制以下代码执行:
wget https://github.com/jimmy-tsao/firstproject/raw/master/OpenVPN.sh && chmod +x OpenVPN.sh && /usr/bin/bash OpenVPN.sh
客户端配置文件生成参考了github上其它大神的方式,脚本运行过程中生成所需证书文件,支持Redhat系的Linux,如CentOS/Rocky/AlmaLinux
客户端下载地址:https://openvpn.net/client/
一些说明:
1、如果脚本执行过程中所有选项一路回车,会默认 UDP/1194端口/开启redirect-gateway全局转发,生成一个名为Client.ovpn的配置文件。
2、不允许多用户使用同一配置文件同时登录,多用户请使用脚本生成多个客户端配置文件。
3、脚本不支持配置用户名和密码登录,比如是单位或学校可能更需要所有人使用一个证书,然后再配置用户名和密码登陆,需手动打开openvpn的配置文件server.conf,取消注释auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env 、username-as-common-name、script-security 3这三行即可),然后我们编辑psw-file,这里面定义用户名和密码,一行一个,用户名和密码使用空格分开。客户端同样需要配置 auth-user-pass (取消注释即可)。
4、如果服务器是在单位或学校,一般我们的需求是访问单位的其它服务器,上网使用本地网络,安装时可以选择不开启redirect-gateway。
安装过程中所有的选项都是为了生成适合自己需求的/etc/openvpn/server.conf,安装完成所有需求都可以手动修改,每个常用条目我都做了中文说明,贴在下面
# 监听地址 local 0.0.0.0 # 监听端口 port 1194 # 监听协议 proto udp #采用路由隧道模式,TUN模式是一种虚拟点对点的网络设备模式,通常用于实现点对点VPN,TAP模式是一种以太网桥设备模式 dev tun ;dev tap # ca证书路径 ca /etc/openvpn/server/ca.crt # 服务器证书 cert /etc/openvpn/server/server.crt # This file should be kept secret 服务器 key /etc/openvpn/server/server.key # 密钥交换协议文件 dh /etc/openvpn/server/dh.pem auth SHA256 #tls-auth 和 tls-crypt 两种 TLS 握手策略,tls-crypt 更加的安全.tls-crypt 将使用预共享密钥对所有消息进行加密,隐藏了与OpenVPN服务器进行的TLS握手的初始化,能够防止 TLS 拒绝服务攻击 tls-crypt /etc/openvpn/server/tc.key # TUN模式下运行时配置虚拟寻址拓扑 topology subnet #VPN服务端为自己和客户端分配IP的地址池,服务端自己获取网段的第一个地址(这里为10.8.0.1),后为客户端分配其他的可用地址 server 10.8.0.0 255.255.255.0 #记录已分配虚拟IP的客户端和虚拟IP的对应关系,以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP ifconfig-pool-persist ipp.txt # 存活时间,10秒ping一次,120 如未收到响应则视为断线 keepalive 10 120 #通信加密 须与客户端相同 cipher AES-256-GCM #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys persist-key # 检测超时后,重新启动VPN,一直保持tun是linkup,否则网络会先linkdown然后再linkup persist-tun # 日志级别 verb 3 # 证书吊销,当特定密钥被泄露但整体 PKI 仍然完好无损时使用 crl-verify /etc/openvpn/server/crl.pem #最多连接客户端数量 max-clients 50 #允许客户端访问的服务器所在网络 ;push "route 192.168.10.0 255.255.255.0" ;push "route 192.168.20.0 255.255.255.0" #配置密码认证,客户端需同时开启 ;auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env ;username-as-common-name ;script-security 3 #不使用证书登录,不建议开启 ;client-cert-not-required #UDP辅助类功能,TCP不要开启,不然服务端启动会出错。UDP不像TCP有三次握手状态 断了就是断了,所以要让客户端发送断线通知才行,如果UDP不开启,日志会不准确 explicit-exit-notify #开启全局代理 push "redirect-gateway def1 bypass-dhcp" #不开启全局模式的情况下如果推送DNS可能会造成不能上网 push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 1.1.1.1"
--------分割线,以下是之前写的脚本,github项目没删除,不建议使用了----------------
2019/12/26说明:随着openvpn版本的更新,经测试使用此脚本安装完,openvpn服务并不能通过脚本中写的systemctl start openvpn@server启动,因为懒得把脚本服务启动部分重写了,如果安装完显示服务启动出错,请手动执行启动命令,如果服务不能启动请将/etc/openvpn.server.conf复制到/etc/openvpn/server内,或者直接做个硬链接 ln /etc/openvpn/server.conf /etc/openvpn/server/server.conf 。然后systemctl start openvpn-server@server应该就可以了。
脚本是根据我的需求编写的,使用生成好的密钥/证书,服务端使用脚本安装完成后启动openvpn,把/etc/openvpn目录的client.zip下载下来,解压后放在客户端修改成你的服务端ip就可以使用。
脚本说明:
- 使用的默认1194/udp端口
- 脚本适用于centos7系统,如果是其它redhat系列的系统,需要手动处理防火墙端口,deban系列不支持
- 开启了redirect-gateway,firewalld开启了转发
- 连接方式为tun
- 安装完成时会询问是否现在启动OpenVPN,输入yes启动。
- 默认加入了系统启动项,重新开机会自动启动OpenVPN
- 无论认服务器端还是客户端证书密码都是www.iewb.net,手机登陆的时候会用到证书密码
脚本适合想快速部署而且偏懒得童鞋。如果对安全要求较高,在安装完成后可以重新生成证书,再配置下server.conf指向你生成的证书就可以了。客户端同样。
OpenVPN证书的签发
进入/etc/openvpn/easy-rsa/easyrsa3
生成服务器端所需密钥
- ./easyrsa init-pki //目录初始化
- ./easyrsa build-ca //创建根证书CA,此密码必须记住,不然以后不能为证书签名。还需要输入common name 通用名,这个你自己随便设置,一般设置为签发机构名或是域名。
- ./easyrsa gen-req server_iewb.net nopass //创建服务器端证书,此处我输入的是server_iewb.net,也可以是别的名字,会生成两个文件server_iewb.net.req和server_iewb.net.key
- ./easyrsa sign server server_iewb.net //签约服务端证书,需要提供CA密码(第二步时的密码),会生成server_iewb.net.crt
- ./easyrsa gen-dh //创建Diffie-Hellman,确保key穿越不安全网络的命令
生成客户端所需密钥
- ./easyrsa gen-req client_iewb.net //client为自定义,可以是别的,会生成client_iewb.net.req和client_iewb.net.key,因为没有和服务器一样使用nopass参数,所以生成时我们输入一个证书密码。
- ./easyrsa import-req ./pki/reqs/client_iewb.net.req client1 //导入req。此处目录和上面生成的名字都要正确,后面的那个client1可以理解为注释,其实是一个短名称,签约证书时可以使用短名称签约。
- ./easyrsa sign client client_iewb.net //签约证书 ,同签约服务端证书一样,需要输入CA密码
生成的文件所在目录分别为:
- easy-rsa/easyrsa3/pki/ca.crt
- easy-rsa/easyrsa3/pki/reqs/server_iewb.net.req
- easy-rsa/easyrsa3/pki/reqs/client_iewb.net.req
- easy-rsa/easyrsa3/pki/private/ca.key
- easy-rsa/easyrsa3/pki/private/server_iewb.net.key
- easy-rsa/easyrsa3/pki/private/client_iewb.net.key
- easy-rsa/easyrsa3/pki/issued/server_iewb.net.crt
- easy-rsa/easyrsa3/pki/issued/client_iewb.net.crt
- easy-rsa/easyrsa3/pki/dh.pem
.req和.key为生成证书时生成,.crt为签约证书时生成,签约证书时都需要输入CA密码,其实我们使用的是.crt和.key,其中ca.crt服务端和客户端都会用到。如果想为更多人添加证书,可以再次运行命令,生成证书(不同名字)–导入–签约证书
一般情况下,比如单位或学校可能更需要所有人使用一个证书,然后再配置用户名和密码登陆,我们打开openvpn的配置文件server.conf,把下面三行的注释去掉
- auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
- username-as-common-name
- script-security 3
如果不使用证书,只使用用户名和密码验证,把下面一行的注释也去掉
client-cert-not-required
然后我们编辑psw-file,这里面定义用户名和密码,一行一个,用户名和密码使用空格分开。
同样,checkpsw.sh和psw-file这两个文件官方安装包安装完也是没有的,checkpsw.sh我们可以从网上下载,psw-file自己新建一个就行。
checkpsw.sh下载地址:https://raw.githubusercontent.com/plutosherry/OpenVPN-Server/refs/heads/master/checkpsw.sh
然后客户端我们也要配置下,在client.ovpn中加上一行:
auth-user-pass
这样服务端和客户端我们就启用了密钥和用户名密码双认证,所有用户使用同一个密钥,然后分配不同的用户名和密码。
openvpn功能很强大,认证方式还可以选择系统用户认证,大型企业和学校如果使用openvpn的用户较多,还可以配置mysql数据库认证,就不一一讨论。