在Ubuntu系统手撸一个自动搭建openVPN服务端的SHELL脚本

admin 2026-01-17 01:42:23 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了在Ubuntu系统下自动搭建OpenVPN服务端的Shell脚本。脚本整合了安装OpenVPN与Easy-RSA、自动生成CA及服务端客户端证书、配置server.conf与服务自启等步骤,并包含IP转发与iptables设置。通过该脚本可一键生成服务端配置及客户端ovpn文件,实现快速部署安全隧道,适用于红队渗透或内网环境搭建。 综合评分: 86 文章分类: 安全工具,安全建设,内网渗透,红队


cover_image

在Ubuntu系统手撸一个自动搭建openVPN服务端的SHELL脚本

原创

衡水铁头哥 衡水铁头哥

铁军哥

2026年1月16日 07:45 北京

正文共:1666 字 4 图,预估阅读时间:2 分钟

付费转免(在Ubuntu系统手撸一个自动搭建openVPN服务端的SHELL脚本)!介于新的自动化脚本已经上线,旧的手工部署方式转为免费文章!

关于在Ubuntu系统如何创建一份可以自动配置Easy-RSA证书的脚本,我们之前已经做了详细介绍在Ubuntu系统手撸一个自动创建SSL证书的SHELL脚本。其实,证书创建完成之后,openVPN的配置就完成了一大半了。

而且,我们前面也介绍了在Ubuntu系统如何手工创建openVPN服务端并发起客户端连接Ubuntu配置openVPN服务端和客户端。今天,我们就把手工创建openVPN服务端的过程变成自动化脚本。

和CentOS系统一样手撸一个自动搭建openVPN服务器的SHELL脚本,证书创建完成之后,服务端剩下的配置就是创建一个server.conf配置文件,并且把默认的openvpn.service服务文件替换掉,而openvpn.service中需要引用server.conf,那我们就先生成server.conf配置文件。

而server.conf中则需要引用之前生成的ca.crt、ttserver.crt、ttserver.key和dh.pem这4个文件,所以我们需要对证书的存放路径做一下微调,添加以下4条命令。

cp/usr/share/easy-rsa/pki/ca.crt /etc/openvpn/server/ca.crtcp/usr/share/easy-rsa/pki/dh.pem /etc/openvpn/server/dh.pemcp/usr/share/easy-rsa/pki/issued/ttserver.crt /etc/openvpn/server/ttserver.crtcp/usr/share/easy-rsa/pki/private/ttserver.key /etc/openvpn/server/ttserver.key

openVPN软件系统已经自带了,无需安装。为了提高可移植性,我们还是执行一下安装openVPN的命令,已经安装的也可以达到升级的效果:

apt install -y openvpn

如果转换成SHELL脚本,则可以是:

# 安装openVPNinstall_openvpn() {echo"正在安装openVPN..."  apt -y install openvpnecho"openVPN安装完成。"}

然后,我们的server.conf配置文件就不用调整了,直接写入内容即可。

# 配置/etc/openvpn/server/server.confconfigure_server_conf(){cat<<&nbsp;EOF&nbsp;>&nbsp;/etc/openvpn/server/server.conflocal0.0.0.0prototcpport44331devtunca/etc/openvpn/server/ca.crtcert/etc/openvpn/server/ttserver.crtkey/etc/openvpn/server/ttserver.keydh/etc/openvpn/server/dh.pemtopologysubnetserver10.153.117.0&nbsp;255.255.255.0push"dhcp-option DNS 8.8.8.8"push"redirect-gateway def1 bypass-dhcp"duplicate-cnkeepalive20&nbsp;120persist-keypersist-tunEOF# 检查配置文件是否写入成功echo"server.conf配置如下:"cat/etc/openvpn/server/server.conf}

接下来,就是openVPN的服务配置文件openvpn.service,和server.conf一样,直接写入内容即可。

# 配置/usr/lib/systemd/system/openvpn.serviceconfigure_openvpn_service() {&nbsp;&nbsp;rm&nbsp;-f /usr/lib/systemd/system/openvpn.service&nbsp;&nbsp;cat&nbsp;<<&nbsp;EOF > /usr/lib/systemd/system/openvpn.service&nbsp; [Unit]&nbsp; Description=OpenVPN Server&nbsp; After=network.target&nbsp; After=syslog.target&nbsp; [Install]&nbsp; WantedBy=multi-user.target&nbsp; [Service]&nbsp; ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/server.conf&nbsp; EOF# 检查配置文件是否写入成功&nbsp;&nbsp;echo&nbsp;"openvpn.service配置如下:"&nbsp;&nbsp;cat&nbsp;/usr/lib/systemd/system/openvpn.service}

然后,我们重新加载openVPN服务。

# 启动openVPN服务start_openvpn(){systemctldaemon-reloadsystemctlstart openvpnsystemctlenable openvpnsystemctlrestart openvpnecho"openVPN服务状态如下:"systemctlstatus openvpnss-atnp |grep 44331ss-atnp |grep openvpnecho"使能本地转发功能!"echo1 > /proc/sys/net/ipv4/ip_forwardiptables-t nat -A POSTROUTING -j MASQUERADE}

到这里,服务端就配置好了,我们希望继续生成一份客户端的配置文件。参考之前的文章配置优化:将openVPN的配置文件合4为1,我们需要ca.crt、ttclient.crt和ttclient.key这几个文件的内容,还需要服务器的IP地址信息。

先创建tietou.ovpn配置文件,并导入固定部分内容。

# 创建tietou.ovpn配置文件create_ovpn() {&nbsp;&nbsp;cat&nbsp;<<&nbsp;EOF > /etc/openvpn/client/tietou.ovpn&nbsp; client&nbsp; dev tun&nbsp; proto tcp&nbsp; nobind&nbsp; resolv-retry infinite&nbsp; persist-key&nbsp; persist-tun&nbsp; EOF}# 获取IP地址get_ip() {&nbsp; IP=$(curl -s cip.cc | awk&nbsp;'/IP/{print $3}')echo"公网IP地址为:$IP"# 写入到配置文件中echo"remote&nbsp;$IP&nbsp;44331"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 提取ca.crt的证书内容get_cacrt() {&nbsp; CACRT=$(awk&nbsp;'/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/'&nbsp;/usr/share/easy-rsa/pki/ca.crt)# 将证书内容写入到配置文件中echo"<ca>"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"$CACRT"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"</ca>"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.crt的证书内容get_clientcrt() {&nbsp; CLIENTCRT=$(awk&nbsp;'/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/'&nbsp;/usr/share/easy-rsa/pki/issued/ttclient.crt)# 将证书内容写入到配置文件中echo"<cert>"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"$CLIENTCRT"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"</cert>"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.key的证书内容get_clientkey() {&nbsp; CLIENTKEY=$(awk&nbsp;'/-----BEGIN PRIVATE KEY-----/,/-----END PRIVATE KEY-----/'&nbsp;/usr/share/easy-rsa/pki/private/ttclient.key)# 将证书内容写入到配置文件中echo"<key>"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"$CLIENTKEY"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"</key>"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 展示tietou.ovpn配置内容echo"tietou.ovpn配置内容如下:"cat&nbsp;/etc/openvpn/client/tietou.ovpn

最终脚本

最后,我们将所有配置片段合成一个,内容如下:

#!/bin/bash# 安装Easy-RSAinstall_easyrsa() {echo"正在安装Easy-RSA..."&nbsp; apt install -y easy-rsaecho"Easy-RSA安装完成。"}# 初始化Easy-RSA环境init_easyrsa() {echo"初始化Easy-RSA环境..."cd&nbsp;/usr/share/easy-rsa/# 备份vars.example为vars,避免覆盖if&nbsp;[ -f vars ];&nbsp;then&nbsp;&nbsp;mv&nbsp;vars vars.backupfi&nbsp;&nbsp;cp&nbsp;vars.example varsecho"Easy-RSA环境初始化完成。"}# 更新vars文件中的机构信息字段update_vars() {echo"更新vars文件中的机构信息字段..."cd&nbsp;/usr/share/easy-rsa/# 向vars文件中插入机构信息字段echo'set_var EASYRSA_REQ_COUNTRY &nbsp; &nbsp; "CN"'&nbsp;>> varsecho'set_var EASYRSA_REQ_PROVINCE &nbsp; &nbsp;"Beijing"'&nbsp;>> varsecho'set_var EASYRSA_REQ_CITY &nbsp; &nbsp; &nbsp; &nbsp;"Haidian"'&nbsp;>> varsecho'set_var EASYRSA_REQ_ORG &nbsp; &nbsp; &nbsp; &nbsp; "TIETOU_TECH"'&nbsp;>> varsecho'set_var EASYRSA_REQ_EMAIL &nbsp; &nbsp; &nbsp; "[email protected]"'&nbsp;>> varsecho'set_var EASYRSA_REQ_OU &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"Tietou_openVPN"'&nbsp;>> varsecho"vars文件中的机构信息字段已更新。"}# 生成证书和密钥generate_certs() {echo"正在生成证书和密钥..."cd&nbsp;/usr/share/easy-rsa/# 初始化PKI目录结构&nbsp; ./easyrsa init-pki# 清空证书目录echo"yes"&nbsp;| ./easyrsa clean-all# 生成证书和密钥文件echo&nbsp;| ./easyrsa build-ca nopassecho&nbsp;| ./easyrsa gen-req ttserver nopassecho"yes"&nbsp;| ./easyrsa sign server ttserver&nbsp; ./easyrsa gen-dhecho&nbsp;| ./easyrsa gen-req ttclient nopassecho"yes"&nbsp;| ./easyrsa sign-req client ttclientecho"证书和密钥生成完成。"}# 安装openVPNinstall_openvpn() {echo"正在安装openVPN..."&nbsp; apt -y install openvpnecho"openVPN安装完成。"}# 配置/etc/openvpn/server/server.confconfigure_server_conf() {&nbsp;&nbsp;cp&nbsp;/usr/share/easy-rsa/pki/ca.crt /etc/openvpn/server/ca.crt&nbsp;&nbsp;cp&nbsp;/usr/share/easy-rsa/pki/dh.pem /etc/openvpn/server/dh.pem&nbsp;&nbsp;cp&nbsp;/usr/share/easy-rsa/pki/issued/ttserver.crt /etc/openvpn/server/ttserver.crt&nbsp;&nbsp;cp&nbsp;/usr/share/easy-rsa/pki/private/ttserver.key /etc/openvpn/server/ttserver.key&nbsp;&nbsp;cat&nbsp;<<&nbsp;EOF > /etc/openvpn/server/server.conflocal 0.0.0.0&nbsp; proto tcp&nbsp; port 44331&nbsp; dev tun&nbsp; ca /etc/openvpn/server/ca.crt&nbsp; cert /etc/openvpn/server/ttserver.crt&nbsp; key /etc/openvpn/server/ttserver.key&nbsp; dh /etc/openvpn/server/dh.pem&nbsp; topology subnet&nbsp; server 10.153.117.0 255.255.255.0&nbsp; push "dhcp-option DNS 8.8.8.8"&nbsp; push "redirect-gateway def1 bypass-dhcp"&nbsp; duplicate-cn&nbsp; keepalive 20 120&nbsp; persist-key&nbsp; persist-tun&nbsp; EOF# 检查配置文件是否写入成功echo"server.conf配置如下:"&nbsp; &nbsp;cat&nbsp;/etc/openvpn/server/server.conf}# 配置/usr/lib/systemd/system/openvpn.serviceconfigure_openvpn_service() {rm&nbsp;-f /usr/lib/systemd/system/openvpn.servicecat&nbsp;<<&nbsp;EOF > /usr/lib/systemd/system/openvpn.service[Unit]Description=OpenVPN ServerAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/server.confEOF# 检查配置文件是否写入成功echo"openvpn.service配置如下:"cat&nbsp;/usr/lib/systemd/system/openvpn.service}# 启动openVPN服务start_openvpn() {systemctl daemon-reloadsystemctl start openvpnsystemctl&nbsp;enable&nbsp;openvpnsystemctl restart openvpnecho"openVPN服务状态如下:"systemctl status openvpnss -atnp |grep 44331ss -atnp |grep openvpnecho"使能本地转发功能!"echo&nbsp;1 > /proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -j MASQUERADE}# 创建tietou.ovpn配置文件create_ovpn() {cat&nbsp;<<&nbsp;EOF > /etc/openvpn/client/tietou.ovpnclientdev tunproto tcpnobindresolv-retry infinitepersist-keypersist-tunEOF}# 获取IP地址get_ip() {IP=$(curl -s cip.cc | awk&nbsp;'/IP/{print $3}')echo"公网IP地址为:$IP"# 写入到配置文件中echo"remote&nbsp;$IP&nbsp;44331"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 提取ca.crt的证书内容get_cacrt() {CACRT=$(awk&nbsp;'/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/'&nbsp;/usr/share/easy-rsa/pki/ca.crt)# 将证书内容写入到配置文件中echo"<ca>"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"$CACRT"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"</ca>"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.crt的证书内容get_clientcrt() {CLIENTCRT=$(awk&nbsp;'/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/'&nbsp;/usr/share/easy-rsa/pki/issued/ttclient.crt)echo"<cert>"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"$CLIENTCRT"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"</cert>"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.key的证书内容get_clientkey() {CLIENTKEY=$(awk&nbsp;'/-----BEGIN PRIVATE KEY-----/,/-----END PRIVATE KEY-----/'&nbsp;/usr/share/easy-rsa/pki/private/ttclient.key)# 将证书内容写入到配置文件中echo"<key>"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"$CLIENTKEY"&nbsp;>> /etc/openvpn/client/tietou.ovpnecho"</key>"&nbsp;>> /etc/openvpn/client/tietou.ovpn}# 创建SSL-cert目录generate_dir() {# 获取当前时间current_time=$(date&nbsp;+"%Y%m%d%H%M")# 创建新的目录new_dir="/SSL-cert/${current_time}"mkdir&nbsp;-p&nbsp;"${new_dir}"# 将证书和密钥复制到新目录下cp&nbsp;/usr/share/easy-rsa/pki/ca.crt&nbsp;"${new_dir}/ca.crt"cp&nbsp;/usr/share/easy-rsa/pki/issued/ttserver.crt&nbsp;"${new_dir}/ttserver.crt"cp&nbsp;/usr/share/easy-rsa/pki/private/ttserver.key&nbsp;"${new_dir}/ttserver.key"cp&nbsp;/usr/share/easy-rsa/pki/issued/ttclient.crt&nbsp;"${new_dir}/ttclient.crt"cp&nbsp;/usr/share/easy-rsa/pki/private/ttclient.key&nbsp;"${new_dir}/ttclient.key"echo"证书和密钥已复制到目录:${new_dir}"}# 主函数main() {&nbsp; install_easyrsa&nbsp; init_easyrsa&nbsp; update_vars&nbsp; generate_certs&nbsp; install_openvpn&nbsp; configure_server_conf&nbsp; configure_openvpn_service&nbsp; start_openvpn&nbsp; create_ovpn&nbsp; get_ip&nbsp; get_cacrt&nbsp; get_clientcrt&nbsp; get_clientkey&nbsp; generate_dir}main;# 展示tietou.ovpn配置内容echo"tietou.ovpn配置内容如下:"cat&nbsp;/etc/openvpn/client/tietou.ovpn

运行一下试试,不到一分钟就跑完了。

使用导入文件方式导入客户端配置文件,发起拨号连接。

拨号成功,测试业务联通性。

OK,一切顺利!

***推荐阅读***

无需公网IPv4!手把手教你配置基于IPv6的WireGuard安全隧道

基于IPv6配置openVPN实战:告别双栈难题,一步打通IPv6隧道!

腾讯云隐藏福利:如何通过一键操作白嫖CPU升级?性能飙升

openVPN进阶技巧:如何实现从服务端反向访问客户端内网?

OpenVPN管理竟能如此简单?实时监控、固定IP、强制下线,运维效率翻倍

OpenVPN管理迎来终极形态:支持6种多因子认证,安全等级拉满,运维效率飙升!

从点到网!我们的strongSwan管理系统支持网关模式了,可作中心枢纽互联多分支

低成本玩转SDN:实测OpenDaylight资源消耗仅1.1GB,完美纳管华为设备,开源方案真香!

超越SR-MPLS!SRv6实测:基于纯IPv6数据面承载IPv4 VPN业务,体验协议简化之美

2048卡昇腾910C集群RoCEv2算力网建设方案

2048卡昇腾910C集群存储网建设方案

2048卡昇腾910C集群智算中心:业务网深度建设与实施方案


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:铁军哥 衡水铁头哥 衡水铁头哥《在Ubuntu系统手撸一个自动搭建openVPN服务端的SHELL脚本》

恭喜你发现 网络安全文章

恭喜你发现

文章总结: 该文档包含对阿乐的问候语、日期地点及恭喜你发现的字样,并附带图片占位符。内容缺乏实质性信息或技术分析,未提供任何核心观点、结论及可操作建议,仅为简单
评论:0   参与:  0