文章总结: 本文介绍了在Ubuntu系统下自动搭建OpenVPN服务端的Shell脚本。脚本整合了安装OpenVPN与Easy-RSA、自动生成CA及服务端客户端证书、配置server.conf与服务自启等步骤,并包含IP转发与iptables设置。通过该脚本可一键生成服务端配置及客户端ovpn文件,实现快速部署安全隧道,适用于红队渗透或内网环境搭建。 综合评分: 86 文章分类: 安全工具,安全建设,内网渗透,红队
在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<< EOF > /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 255.255.255.0push"dhcp-option DNS 8.8.8.8"push"redirect-gateway def1 bypass-dhcp"duplicate-cnkeepalive20 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() { rm -f /usr/lib/systemd/system/openvpn.service cat << EOF > /usr/lib/systemd/system/openvpn.service [Unit] Description=OpenVPN Server After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/server.conf EOF# 检查配置文件是否写入成功 echo "openvpn.service配置如下:" cat /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() { cat << EOF > /etc/openvpn/client/tietou.ovpn client dev tun proto tcp nobind resolv-retry infinite persist-key persist-tun EOF}# 获取IP地址get_ip() { IP=$(curl -s cip.cc | awk '/IP/{print $3}')echo"公网IP地址为:$IP"# 写入到配置文件中echo"remote $IP 44331" >> /etc/openvpn/client/tietou.ovpn}# 提取ca.crt的证书内容get_cacrt() { CACRT=$(awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' /usr/share/easy-rsa/pki/ca.crt)# 将证书内容写入到配置文件中echo"<ca>" >> /etc/openvpn/client/tietou.ovpnecho"$CACRT" >> /etc/openvpn/client/tietou.ovpnecho"</ca>" >> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.crt的证书内容get_clientcrt() { CLIENTCRT=$(awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' /usr/share/easy-rsa/pki/issued/ttclient.crt)# 将证书内容写入到配置文件中echo"<cert>" >> /etc/openvpn/client/tietou.ovpnecho"$CLIENTCRT" >> /etc/openvpn/client/tietou.ovpnecho"</cert>" >> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.key的证书内容get_clientkey() { CLIENTKEY=$(awk '/-----BEGIN PRIVATE KEY-----/,/-----END PRIVATE KEY-----/' /usr/share/easy-rsa/pki/private/ttclient.key)# 将证书内容写入到配置文件中echo"<key>" >> /etc/openvpn/client/tietou.ovpnecho"$CLIENTKEY" >> /etc/openvpn/client/tietou.ovpnecho"</key>" >> /etc/openvpn/client/tietou.ovpn}# 展示tietou.ovpn配置内容echo"tietou.ovpn配置内容如下:"cat /etc/openvpn/client/tietou.ovpn
最终脚本
最后,我们将所有配置片段合成一个,内容如下:
#!/bin/bash# 安装Easy-RSAinstall_easyrsa() {echo"正在安装Easy-RSA..." apt install -y easy-rsaecho"Easy-RSA安装完成。"}# 初始化Easy-RSA环境init_easyrsa() {echo"初始化Easy-RSA环境..."cd /usr/share/easy-rsa/# 备份vars.example为vars,避免覆盖if [ -f vars ]; then mv vars vars.backupfi cp vars.example varsecho"Easy-RSA环境初始化完成。"}# 更新vars文件中的机构信息字段update_vars() {echo"更新vars文件中的机构信息字段..."cd /usr/share/easy-rsa/# 向vars文件中插入机构信息字段echo'set_var EASYRSA_REQ_COUNTRY "CN"' >> varsecho'set_var EASYRSA_REQ_PROVINCE "Beijing"' >> varsecho'set_var EASYRSA_REQ_CITY "Haidian"' >> varsecho'set_var EASYRSA_REQ_ORG "TIETOU_TECH"' >> varsecho'set_var EASYRSA_REQ_EMAIL "[email protected]"' >> varsecho'set_var EASYRSA_REQ_OU "Tietou_openVPN"' >> varsecho"vars文件中的机构信息字段已更新。"}# 生成证书和密钥generate_certs() {echo"正在生成证书和密钥..."cd /usr/share/easy-rsa/# 初始化PKI目录结构 ./easyrsa init-pki# 清空证书目录echo"yes" | ./easyrsa clean-all# 生成证书和密钥文件echo | ./easyrsa build-ca nopassecho | ./easyrsa gen-req ttserver nopassecho"yes" | ./easyrsa sign server ttserver ./easyrsa gen-dhecho | ./easyrsa gen-req ttclient nopassecho"yes" | ./easyrsa sign-req client ttclientecho"证书和密钥生成完成。"}# 安装openVPNinstall_openvpn() {echo"正在安装openVPN..." apt -y install openvpnecho"openVPN安装完成。"}# 配置/etc/openvpn/server/server.confconfigure_server_conf() { cp /usr/share/easy-rsa/pki/ca.crt /etc/openvpn/server/ca.crt cp /usr/share/easy-rsa/pki/dh.pem /etc/openvpn/server/dh.pem cp /usr/share/easy-rsa/pki/issued/ttserver.crt /etc/openvpn/server/ttserver.crt cp /usr/share/easy-rsa/pki/private/ttserver.key /etc/openvpn/server/ttserver.key cat << EOF > /etc/openvpn/server/server.conflocal 0.0.0.0 proto tcp port 44331 dev tun ca /etc/openvpn/server/ca.crt cert /etc/openvpn/server/ttserver.crt key /etc/openvpn/server/ttserver.key dh /etc/openvpn/server/dh.pem topology subnet server 10.153.117.0 255.255.255.0 push "dhcp-option DNS 8.8.8.8" push "redirect-gateway def1 bypass-dhcp" duplicate-cn keepalive 20 120 persist-key persist-tun EOF# 检查配置文件是否写入成功echo"server.conf配置如下:" cat /etc/openvpn/server/server.conf}# 配置/usr/lib/systemd/system/openvpn.serviceconfigure_openvpn_service() {rm -f /usr/lib/systemd/system/openvpn.servicecat << 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 /usr/lib/systemd/system/openvpn.service}# 启动openVPN服务start_openvpn() {systemctl daemon-reloadsystemctl start openvpnsystemctl enable openvpnsystemctl restart openvpnecho"openVPN服务状态如下:"systemctl status openvpnss -atnp |grep 44331ss -atnp |grep openvpnecho"使能本地转发功能!"echo 1 > /proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -j MASQUERADE}# 创建tietou.ovpn配置文件create_ovpn() {cat << EOF > /etc/openvpn/client/tietou.ovpnclientdev tunproto tcpnobindresolv-retry infinitepersist-keypersist-tunEOF}# 获取IP地址get_ip() {IP=$(curl -s cip.cc | awk '/IP/{print $3}')echo"公网IP地址为:$IP"# 写入到配置文件中echo"remote $IP 44331" >> /etc/openvpn/client/tietou.ovpn}# 提取ca.crt的证书内容get_cacrt() {CACRT=$(awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' /usr/share/easy-rsa/pki/ca.crt)# 将证书内容写入到配置文件中echo"<ca>" >> /etc/openvpn/client/tietou.ovpnecho"$CACRT" >> /etc/openvpn/client/tietou.ovpnecho"</ca>" >> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.crt的证书内容get_clientcrt() {CLIENTCRT=$(awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' /usr/share/easy-rsa/pki/issued/ttclient.crt)echo"<cert>" >> /etc/openvpn/client/tietou.ovpnecho"$CLIENTCRT" >> /etc/openvpn/client/tietou.ovpnecho"</cert>" >> /etc/openvpn/client/tietou.ovpn}# 提取ttclient.key的证书内容get_clientkey() {CLIENTKEY=$(awk '/-----BEGIN PRIVATE KEY-----/,/-----END PRIVATE KEY-----/' /usr/share/easy-rsa/pki/private/ttclient.key)# 将证书内容写入到配置文件中echo"<key>" >> /etc/openvpn/client/tietou.ovpnecho"$CLIENTKEY" >> /etc/openvpn/client/tietou.ovpnecho"</key>" >> /etc/openvpn/client/tietou.ovpn}# 创建SSL-cert目录generate_dir() {# 获取当前时间current_time=$(date +"%Y%m%d%H%M")# 创建新的目录new_dir="/SSL-cert/${current_time}"mkdir -p "${new_dir}"# 将证书和密钥复制到新目录下cp /usr/share/easy-rsa/pki/ca.crt "${new_dir}/ca.crt"cp /usr/share/easy-rsa/pki/issued/ttserver.crt "${new_dir}/ttserver.crt"cp /usr/share/easy-rsa/pki/private/ttserver.key "${new_dir}/ttserver.key"cp /usr/share/easy-rsa/pki/issued/ttclient.crt "${new_dir}/ttclient.crt"cp /usr/share/easy-rsa/pki/private/ttclient.key "${new_dir}/ttclient.key"echo"证书和密钥已复制到目录:${new_dir}"}# 主函数main() { install_easyrsa init_easyrsa update_vars generate_certs install_openvpn configure_server_conf configure_openvpn_service start_openvpn create_ovpn get_ip get_cacrt get_clientcrt get_clientkey generate_dir}main;# 展示tietou.ovpn配置内容echo"tietou.ovpn配置内容如下:"cat /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脚本》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论