我们之前介绍过如何配置WireGuard互联(在Ubuntu快速配置WireGuard互联),但是WireGuard不支持开机自动配置。不只是WireGuard,openVPN的客户端也不支持开机自启动,只有服务端支持。
其实观察我们之前的配置,仅使用一条wg-quick命令就能快速实现WireGuard的配置,如下所示:
wg-quick up /root/wg0.conf
按照我们之前介绍VPP时的做法(Wireguard + VPP = WireVPP),我们可以将启动命令写入到rc.local文件,实现开机自动执行命令脚本。不过,对于Ubuntu系统而言,这是比较传统的实现方式,需要搭配rc-local.service服务来实现,目前有些系统默认已经不支持这个服务了,需要手工配置才行。
既然要手工配置服务,那为什么我们不直接把启动WireGuard的命令做成服务呢?通过服务信息里面的loaded字段,我们可以看到,该服务的配置文件是/usr/lib/systemd/system/rc-local.service,对应的配置内容如下:
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=infinity
RemainAfterExit=yes
GuessMainPID=no
可以看到,服务配置文件主要分为[Unit]和[Service]两部分。[Unit]部分包含服务的描述信息(Description=/etc/rc.local Compatibility,服务状态展示的第一行信息),文档信息(Documentation=man:systemd-rc-local-generator(8)),核心启动条件(ConditionFileIsExecutable=/etc/rc.local),定义服务启动顺序(After=network.target)。[Service]部分配置服务类型(Type=forking,表示主进程会派生子进程并后台运行),指定启动命令(ExecStart=/etc/rc.local start),设置无限超时(TimeoutSec=infinity,避免因脚本执行时间较长导致服务被强制终止),设置服务执行完成后仍保持激活状态(RemainAfterExit=yes),禁用自动猜测主进程PID(GuessMainPID=no)。
如果按照这个思路,我们应该可以复刻一个服务文件出来,比如我们创建一个/etc/systemd/system/wg0.service作为WireGuard的启动服务,[Unit]部分我们保留Description描述信息和服务启动顺序,[Service]部分我们设置服务类型、启动命令和存活状态就可以了。如下所示:
[Unit]
Description=WireGuard VPN Connection-wg0
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/wg-quick up /root/wg0.conf
RemainAfterExit=yes
然后我们重新加载服务进程并启动wg0.service试一下。
systemctl daemon-reloadsystemctl start wg0.service
可以看到,通过启动服务,成功实现了WireGuard进程的启动。我们再测试一下服务的停止。
systemctl stop wg0.service
停止失败了,应该是停止需要使用ExecStop参数,我们调整一下服务配置。
[Unit]
Description=WireGuard VPN Connection-wg0
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/wg-quick up /root/wg0.conf
ExecStop=/usr/bin/wg-quick down /root/wg0.conf
RemainAfterExit=yes
配置成功,可以看到,现在WireGuard现在已经可以随wg0.service服务的启停自动建立或删除了。
接下来,我们只要使能wg0.service开机自启动就可以实现自动连接了。
systemctl enable wg0.service
有个报错,提示我们需要增加[Install]部分配置,并配置WantedBy、RequiredBy、Also、Alias等参数。对此,我们可以设置WantedBy=multi-user.target参数,定义服务应在系统进入多用户模式时自动启动。修改后的服务配置如下:
[Unit]
Description=WireGuard VPN Connection-wg0
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/wg-quick up /root/wg0.conf
ExecStop=/usr/bin/wg-quick down /root/wg0.conf
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
可以看到,现在服务处于开机自启状态,但尚未运行,我们直接重启服务器试一下。
可以看到,服务开机自启成功,WireGuard连接自动建立。
接下来,我们再做一个测试,那就是手动断开WireGuard连接,看看wg0.service服务状态会不会变化。
可以看到,wg0.service服务状态跟实际情况并不同步,这是因为手动操作绕过了systemd对服务状态的管理逻辑,而我们配置了Type=oneshot和RemainAfterExit=yes,服务在ExecStart完成后就会一直保持active(exited)状态,仅表示任务已成功完成。
针对这个问题,我们可以配置一个检测脚本并循环执行,这样就能确保接口状态变化后强制更新服务状态。但是,这样会占用比较多的CPU资源,并且测试效果也不太好。既然如此,那就先保持这样吧,毕竟我们的最初目的就是实现通过服务启停WireGuard连接,已经满足了。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/9926.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~