在启动时加载 Openvpn 配置并安装网络驱动器在 Debian 上不起作用

在启动时加载 Openvpn 配置并安装网络驱动器在 Debian 上不起作用

我有这个脚本:

#! /bin/sh
# /etc/init.d/vpnscript

### BEGIN INIT INFO

# Short-Description: Simple script to start a program at boot 
# Description:       A simple script from http://www.stuffaboutcode.comwhich    will start / stop a program a boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" 
in start)
echo "Connecting to OPENVPN"
# Connect to the VPN
sudo openvpn /etc/openvpn/connection1.ovpn
sudo mount -a
;;
stop)
echo "Stopping OPENVPN"
# Disconnect
killall openvpn
;;
*)
echo "Usage: /etc/init.d/vpnscript {start|stop}"
exit 1
;;
esac

Openvpn 部分运行良好,但如果它尝试使用sudo mount -a该进程则开始不执行任何操作(或等待某事,我不知道)。

还有其他方法可以做我想做的事情还是我的脚本有问题?我是 shell 脚本的初学者。

一些注意事项:

  • 我尝试使用 Debian 方式启动 OpenVPN ( /etc/default/openvpn),但这没有启动,所以我尝试了这种方式。

  • 系统的主要mount -a发生在 OpenVPN 启动之前,并且我有一个条目/etc/fstab引用 OpenVPN 连接上的网络驱动器。

  • 服务器运行 Openmediavault 3.0。

答案1

您看到的基本问题是 OpenVPN 持续运行,因此您sudo openvpn /etc/openvpn/connection1.ovpn永远不会返回。因此你的脚本永远不会到达下一行。 (另外:初始化脚本以 root 身份运行,所以不应该有sudo)。因此,简单地说,您需要&在该行末尾添加一个与号 ( ),或者更好的是,为 OpenVPN 提供该--daemon选项(但请阅读有关其限制的 OpenVPN 文档)。

当然,你应该只需使用 Debian 启用 VPN 的方式:在 Jessie 上,那就是. Pre-jessie 或在没有 systemd 的 Jessie 上,将编辑和更改该行。 (可能您还需要将扩展​​名从 更改为)。systemctl enable [email protected]/etc/default/openvpnAUTOSTART.ovpn.conf

然后你会发现下一个问题:OpenVPN会返回VPN 已启动。但在 VPN 真正传递流量之前,您无法启动挂载。我发现解决这个问题的最简单方法是使用 systemd 服务来 ping VPN 的远程端:

$ cat vpn-really-up.service
[Unit]
Description=Ping Einstein to make sure the VPN is really up
[email protected] 
[email protected] 

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/ping -c 2 -w 300 192.168.X.Y
TimeoutStartSec=330

当然,您也可以在 init.d 脚本中使用该 ping 行。 (请注意,这可能不是最好的这样做的方法 - 例如,也许一个--route-up命令会更好 - 不确定当我设置它时这些是否不存在,或者我是否不知道它们。我的机器实际上正在运行测试。)

然后,您可以为您的文件系统创建 systemd 挂载单元(请注意,这也取决于 dnsmasq,因为我使用它来通过 VPN 将一些域转发到 DNS 服务器,以便内部名称起作用):

$ cat mnt-Einstein-music.mount 
[Unit]
Description=/mnt/Einstein/music
Requires=dnsmasq.service vpn-really-up.service
After=dnsmasq.service vpn-really-up.service remote-fs-pre.target

[Mount]
Where=/mnt/Einstein/music
What=Einstein.home:/srv/music
Options=nosuid,nodev,intr,rsize=4096,wsize=4096,nfsvers=3,fsc
Type=nfs
TimeoutSec=180s

[Install]
WantedBy=multi-user.target

(使用时安装也可以,而且使用 systemd 实际上相当容易 — 请参阅 参考资料man 5 systemd.automount)。

最后,你的停止目标需要修复:你必须在停止 VPN 之前卸载文件系统。否则,您的计算机将在重新启动/关闭时挂起。您应该测试它是否有效,否则有一天您将通过 ssh 登录到计算机并重新启动它,并且必须进行一次计划外的旅行才能按下重置按钮。

PS:我也有这个文件:

$ cat [email protected]/local-after-ifup.conf 
[Unit]
Requires=networking.service
After=networking.service

...我的猜测是,在 systemd 停止网络接口之前,需要确保 OpenVPN(以及所有 over VPN 文件系统)已停止。

答案2

简短的更新。

OPENVPN 现在工作正常,谢谢。

我需要做的最后一件事是:

$ cat mnt-SHAREDNAS.mount 
[Unit]
Description=/mnt/SHAREDNAS
Requires=vpn-really-up.service
After=vpn-really-up.service remote-fs-pre.target

[Mount]
Where=/mnt/SHAREDNAS
What=//192.168.50.10/Users/RsyncNAS/SharedNASData
Options=uid=root,credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlm   0       0
Type=cifs
TimeoutSec=180s

[Install]
WantedBy=multi-user.target

但 mount 返回错误(22):参数无效。

所以我的问题是,将下面的 fstab 行转换为正确的 .mount 文件的正确方法是什么:

//192.168.50.10/Users/RsyncNAS/SharedNASData  /media/SHAREDNAS  cifs   uid=root,credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlm   0       0

相关内容