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

付费转免(在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.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
openVPN软件系统已经自带了,无需安装。为了提高可移植性,我们还是执行一下安装openVPN的命令,已经安装的也可以达到升级的效果:

apt install -y openvpn
如果转换成SHELL脚本,则可以是:

安装openVPN

install_openvpn() {
echo”正在安装openVPN…”
apt -y install openvpn
echo”openVPN安装完成。”
}
然后,我们的server.conf配置文件就不用调整了,直接写入内容即可。

配置/etc/openvpn/server/server.conf

configure_server_conf(){
cat<< EOF > /etc/openvpn/server/server.conf
local0.0.0.0
prototcp
port44331
devtun
ca/etc/openvpn/server/ca.crt
cert/etc/openvpn/server/ttserver.crt
key/etc/openvpn/server/ttserver.key
dh/etc/openvpn/server/dh.pem
topologysubnet
server10.153.117.0 255.255.255.0
push”dhcp-option DNS 8.8.8.8″
push”redirect-gateway def1 bypass-dhcp”
duplicate-cn
keepalive20 120
persist-key
persist-tun
EOF

检查配置文件是否写入成功

echo”server.conf配置如下:”
cat/etc/openvpn/server/server.conf
}
接下来,就是openVPN的服务配置文件openvpn.service,和server.conf一样,直接写入内容即可。

配置/usr/lib/systemd/system/openvpn.service

configure_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-reload
systemctlstart openvpn
systemctlenable openvpn
systemctlrestart openvpn
echo”openVPN服务状态如下:”
systemctlstatus openvpn
ss-atnp |grep 44331
ss-atnp |grep openvpn
echo”使能本地转发功能!”
echo1 > /proc/sys/net/ipv4/ip_forward
iptables-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”” >> /etc/openvpn/client/tietou.ovpn echo”$CACRT” >> /etc/openvpn/client/tietou.ovpn echo”” >> /etc/openvpn/client/tietou.ovpn
}

提取ttclient.crt的证书内容

get_clientcrt() {
CLIENTCRT=$(awk ‘/—–BEGIN CERTIFICATE—–/,/—–END CERTIFICATE—–/’ /usr/share/easy-rsa/pki/issued/ttclient.crt)

将证书内容写入到配置文件中

echo”” >> /etc/openvpn/client/tietou.ovpn echo”$CLIENTCRT” >> /etc/openvpn/client/tietou.ovpn echo”” >> /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”” >> /etc/openvpn/client/tietou.ovpn echo”$CLIENTKEY” >> /etc/openvpn/client/tietou.ovpn echo”” >> /etc/openvpn/client/tietou.ovpn
}

展示tietou.ovpn配置内容

echo”tietou.ovpn配置内容如下:”
cat /etc/openvpn/client/tietou.ovpn
最终脚本

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

!/bin/bash安装Easy-RSA

install_easyrsa() {
echo”正在安装Easy-RSA…”
apt install -y easy-rsa
echo”Easy-RSA安装完成。”
}

初始化Easy-RSA环境

init_easyrsa() {
echo”初始化Easy-RSA环境…”
cd /usr/share/easy-rsa/

备份vars.example为vars,避免覆盖

if [ -f vars ]; then
mv vars vars.backup
fi
cp vars.example vars
echo”Easy-RSA环境初始化完成。”
}

更新vars文件中的机构信息字段

update_vars() {
echo”更新vars文件中的机构信息字段…”
cd /usr/share/easy-rsa/

向vars文件中插入机构信息字段

echo’set_var EASYRSA_REQ_COUNTRY “CN”‘ >> vars
echo’set_var EASYRSA_REQ_PROVINCE “Beijing”‘ >> vars
echo’set_var EASYRSA_REQ_CITY “Haidian”‘ >> vars
echo’set_var EASYRSA_REQ_ORG “TIETOU_TECH”‘ >> vars
echo’set_var EASYRSA_REQ_EMAIL “tietou@h3cadmin.cn”‘ >> vars
echo’set_var EASYRSA_REQ_OU “Tietou_openVPN”‘ >> vars
echo”vars文件中的机构信息字段已更新。”
}

生成证书和密钥

generate_certs() {
echo”正在生成证书和密钥…”
cd /usr/share/easy-rsa/

初始化PKI目录结构

./easyrsa init-pki

清空证书目录

echo”yes” | ./easyrsa clean-all

生成证书和密钥文件

echo | ./easyrsa build-ca nopass
echo | ./easyrsa gen-req ttserver nopass
echo”yes” | ./easyrsa sign server ttserver
./easyrsa gen-dh
echo | ./easyrsa gen-req ttclient nopass
echo”yes” | ./easyrsa sign-req client ttclient
echo”证书和密钥生成完成。”
}

安装openVPN

install_openvpn() {
echo”正在安装openVPN…”
apt -y install openvpn
echo”openVPN安装完成。”
}

配置/etc/openvpn/server/server.conf

configure_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.conf
local 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.service

configure_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服务

start_openvpn() {
systemctl daemon-reload
systemctl start openvpn
systemctl enable openvpn
systemctl restart openvpn
echo”openVPN服务状态如下:”
systemctl status openvpn
ss -atnp |grep 44331
ss -atnp |grep openvpn
echo”使能本地转发功能!”
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
}

创建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”” >> /etc/openvpn/client/tietou.ovpn echo”$CACRT” >> /etc/openvpn/client/tietou.ovpn echo”” >> /etc/openvpn/client/tietou.ovpn
}

提取ttclient.crt的证书内容

get_clientcrt() {
CLIENTCRT=$(awk ‘/—–BEGIN CERTIFICATE—–/,/—–END CERTIFICATE—–/’ /usr/share/easy-rsa/pki/issued/ttclient.crt)
echo”” >> /etc/openvpn/client/tietou.ovpn echo”$CLIENTCRT” >> /etc/openvpn/client/tietou.ovpn echo”” >> /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”” >> /etc/openvpn/client/tietou.ovpn echo”$CLIENTKEY” >> /etc/openvpn/client/tietou.ovpn echo”” >> /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,一切顺利!

声明:来自铁军哥,仅代表创作者观点。链接:http://eyangzhen.com/5374.html

铁军哥的头像铁军哥

相关推荐

添加微信
添加微信
Ai学习群
返回顶部