クライアントが接続したときにスクリプトを実行するために、openvpn オプション client-connect を使用しています。
単純なコマンドを使用する場合、スクリプトは正常に動作しますが、ルート権限を必要とするコマンドを追加すると動作しなくなり、クライアントは VPN サーバーに接続できなくなります。
たとえば、私が実行しようとするコマンドをいくつか示します。
bgpctl reload
そして
route add -net $ifconfig_pool_remote_ip/30 -interface $dev -static
。
コマンドはテスト済みで、正しく動作します。私は freeBSD を使用しています。
この問題を解決する方法をご存知ですか?
ありがとう!
アップデート
実際には権限の問題はありませんでした。スクリプトはコマンドを実行できずbgpctl
、route
コマンドを認識できなかったためです。
コマンドへのフルパスを指定することで問題を解決できました:
/usr/local/sbin/bgpctl reload
/sbin/route add -net $ifconfig_pool_remote_ip/30 -interface $dev -static
今は動作します。
ありがとう、roaima。
答え1
スクリプトは、パラメータ--client-connect
で指定された非特権 OpenVPN ユーザーとして実行されます--user
。
これを確認するには、ファイルの先頭にこれらの行を追加し、接続が成功した後に--client-connect
書き込まれる出力を確認します。/tmp/ov.log
#!/bin/bash
exec >>/tmp/ov.log 2>&1
chmod 666 /tmp/ov.log 2>/dev/null
echo
date
id
echo "PATH=$PATH"
# Payload
bgpctl reload
route add -net "$ifconfig_pool_remote_ip/30" -interface "$dev" -static
# All done
true
私のシステムでは、--user nobody
および--group nogroup
ディレクティブを使用すると、次の出力が得られます。
Tue Jun 9 15:00:45 BST 2015
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
...
root
これらをユーザーとグループとして取得するので、おそらくorディレクティブwheel
は使用していないと思われます。--user
--group
PATH
実行するコマンドに必要なディレクトリが含まれていることを確認することも重要です。