web-dev-qa-db-ja.com

起動時にOpenvpnConfigをロードし、ネットワークドライブをマウントしても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を使おうとすると、プロセスは何もしません(または何かを待っているのかわかりません)。

私がやりたいことをする他の方法はありますか、または私のスクリプトに何か問題がありますか?私はシェルスクリプトの初心者です。

いくつかの注意:

  • 私はOpenVPNを起動するDebianの方法(/etc/default/openvpn)を使用しようとしましたが、これは起動しなかったので、代わりにこの方法を試しました。

  • システムのメインのmount -aは、OpenVPNが起動する前に発生し、/etc/fstabに、OpenVPN接続を介したネットワークドライブを参照するエントリがあります。

  • サーバーはOpenmediavault3.0を実行します。

2
Sebastian G.

表示されている基本的な問題は、OpenVPNが実行されたままであるため、Sudo openvpn /etc/openvpn/connection1.ovpnが戻らないことです。したがって、スクリプトが次の行に到達することはありません。 (また、initスクリプトはrootとして実行されるため、そこにSudoがあってはなりません)。したがって、簡単に言うと、その行の最後にアンパサンド(&)を追加するか、OpenVPNに--daemonオプションを指定する必要があります(ただし、その制限についてはOpenVPNドキュメントを読んでください)。 。

もちろん、shouldは、DebianのVPNを有効にする方法を使用する必要があります。Jessieでは、それはsystemctl enable [email protected]になります。 Pre-jessie、またはsystemdのないJessieでは、/etc/default/openvpnを編集し、AUTOSTART行を変更します。 (おそらく、拡張子を.ovpnから.confに変更する必要があります)。

次に、次の問題が見つかります。OpenVPNは、VPNが起動する前にを返します。ただし、VPNが実際にトラフィックを通過させるまで、マウントを開始することはできません。これを修正するために私が見つけた最も簡単な方法は、VPNのリモートエンドにpingを実行するsystemdサービスです。

$ 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

もちろん、そのping行をinit.dスクリプトで使用することもできます。 (これは、これを行うための最良の方法ではない可能性があることに注意してください。たとえば、--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

(Mount on useも機能し、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
derobert