CentOS 6.10の最小インストールを実行しているヘッドレスサーバーでOpenVPNを使用してTransmissionをセットアップしようとしていますが、理想的には、システムを起動したときにこれらが開始されます。
手順 here および here を実行することで、すべてを実行することができます。ただし、これは、スクリプト(2つのチュートリアルに従って、vpn.sh
)を手動で実行する場合にのみ機能します。このスクリプトは次のようになります。
#!/bin/sh
Sudo openvpn --cd /etc/openvpn --config /etc/openvpn/conf.ovpn --script-security 2 --up /etc/openvpn/up.sh
OpenVPNとTransmissionに加えて、それを追加することもできます this Telegram bot があります。これは、他のすべてが起動した後に開始する必要があるため、up.sh
ファイルの最後にも1行追加され、次のようになります。
#!/bin/sh
/etc/init.d/transmission-daemon stop
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start
すべてのトラフィックがVPNを通過するのか、トレントトラフィックのみが通過するのかについては特に気にしませんが、理想的には、私は この投稿 の概要のような何かを行うことができます。
その投稿で説明されている手順に従ってみましたが、何らかの理由で、イベントtransmission-vpn-up
を発生させることができず、チュートリアルのroute-up.sh
スクリプトによってトリガーされ、常にinitctl: Event failed
を取得できません。投稿の手順に従うことも、スクリプトの内容をコマンドラインに手動で渡すこともできません。 route-up.sh
は、Ask Ubuntuの投稿のとおり、次のようになります。
#! /bin/bash
/sbin/initctl emit transmission-vpn-up VPN_GATEWAY=$route_vpn_gateway LOCAL_IP=$ifconfig_local
ただし、down.sh
の内容をコマンドラインに渡しても、そのようなエラーは発生しません。
/sbin/initctl emit transmission-vpn-down
Sudo
ありとなしの両方を渡してみました。
この全体を設定する簡単な方法はありますか? CentOSではなくUbuntuのチュートリアルであることを考えると、特にAUの他のチュートリアルで指定されているtransmission-vpn-up
をemit
tingして何か不足していますか?
または、vpn.sh
(この投稿の最初のコードチャンク)を起動時に実行する方が簡単ですか? VPNがダウンしたとしても、それはきちんとしたまたは優雅なものになりますが、それでうまくいきます。
クイックアップデート:
Ask Ubuntuのチュートリアルで私が前述した 、特に/etc/init/transmission-up.conf
は、CentOSにはない/usr/sbin/ufw
を使用しようとしているため、元のEvent failed
エラーメッセージが表示されます。これらのビットを一時的にコメント化したところ、エラーメッセージは表示されなくなりました。
ただし、エラーメッセージが表示されず、VPNが稼働している場合でも、送信が開始されないため、何かが失敗しているように見えます。
この質問に関するいくつかの詳細な側面と解決策を次に示します(centos 6はsystemdを使用しておらず、centosはv7でsystemdに切り替えられています)
起動時にOpenVPNをセットアップ:
Systemd(サービスを実装)を使用して、起動時にopenvpnを開始できます。サービスを作成し、有効にしてから開始する必要があります。 (サービスを有効にした後起動時に自動的に開始されます)
1-サービスを作成します:(with root)
cd /etc/systemd/system
touch openvpn-custom.service
chmod 644 openvpn-custom.service
2-サービスファイルを開きます:(with root)
例を使用するテキストエディタで/etc/systemd/system/openvpn-custom.service
を開きますnano openvpn-custom.service
3-サービスファイルを編集およびセットアップします:(rootを使用して)
次のコードを/etc/systemd/system/openvpn-custom.service
に貼り付けて変更します
[Unit]
Description=OpenVPN Custom Setup Script
After=network.target network-online.target
Wants=network-online.target
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/vpn-script/vpn.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
[Install]
WantedBy=multi-user.target
4-サービスを有効にして開始します:(rootを使用)
systemctl enable openvpn-custom.service
systemctl start openvpn-custom.service
サービスのステータスはsystemctl status openvpn-custom.service
で確認できます
Open Transmission and Telegram At Boot(openvpn statusに基づく):
Openvpnソリューションと同じように、次のコードを含む新しいサービスを作成します(次に有効にして開始します)。
[Unit]
Description=Application Depending on OpenVPN
After=network.target network-online.target openvpn-custom.service
Wants=network-online.target openvpn-custom.service
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/ovpn-applications.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-apps/ovpn-applications-stop.sh
[Install]
WantedBy=multi-user.target
Ovpn-applications.shは次のようになります
#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start
After=openvpn-custom.service
とWants=openvpn-custom.service
は、openvpnに応じてそのサービスを作成するため、openvpnサービスが開始されていないか失敗した場合、他のサービスは開始されません。
起動時にOpenVPNをセットアップ:
1-サービスを作成します:(with root)
cd /etc/rc.d/init.d
touch openvpn-custom
chmod 755 openvpn-custom
2-サービスファイルを開きます:(with root)
例を使用するテキストエディタで/etc/rc.d/init.d/openvpn-custom
を開きますnano openvpn-custom
3-サービスファイルを編集およびセットアップします:(rootを使用して)
#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn script
# processname: openvpn
#
### BEGIN INIT INFO
# Provides: openvpn
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-custom
# Source function library.
. /etc/init.d/functions
start() {
echo -n "Starting custom openvpn... "
/full-path-to/your/vpn-script/vpn.sh
return 0
}
stop() {
echo -n "Shutting down custom openvpn... "
/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
reload)
;;
*)
echo "Usage: openvpn-custom {start|stop|status|reload|restart}"
exit 1
;;
esac
exit $?
4-サービスを有効にして開始します:(rootを使用)
chkconfig openvpn-custom on
service openvpn-custom start
サービスのステータスはservice openvpn-custom status
で確認できます
openvpnがネットワークの準備ができているときにのみ起動するようにする方法
Initscriptの最初のchkconfig定義は、取得するS/K番号を決定します。
各「ランレベル」は、実際には単なるinitscripts(/ etc/init.d /)へのシンボリックリンクとそれらのシンボリックリンクでいっぱいのディレクトリ(/ etc/rc * .d /)ですSとKのエントリに番号が付けられます。
Sは開始を意味し、Kはキルを意味します。 initがランレベルに入ると、S01から始まり、S99まで進み、各initscriptを実行して、そのスクリプトが制御するサービスを開始します。 initがランレベルを離れると、K01から始まり、K99まで進み、各スクリプトを実行して、そのスクリプトが制御するサービスを停止します。
man chkconfigは、chkconfigスタイルのサービス定義とLinux Standards Base(LSB)スタイルのサービス定義の両方の例を示します。
Initscriptに両方のタイプが定義されている場合、LSB定義がchkconfig定義よりも優先されます。
ネットワーク接続に依存するサービスがある場合は、サービスが/etc/rc*.d/S10networkの後に10から始まる開始番号を指定することでサービスを開始するか、/ etc/init.d/networkにはLSB定義Provides:$ networkがあるため、initscriptでLSB定義Required-Start:$ networkを使用できます。
Open Transmission and Telegram At Boot(openvpn statusに基づく):
Openvpnソリューションと同じように、次のコード(/etc/rc.d/init.d/openvpn-apps)を含む新しいサービスを作成(有効にして開始)します。
#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn-apps script
# processname: openvpn-apps
#
### BEGIN INIT INFO
# Provides: openvpn-apps
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn-apps daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-apps
# Source function library.
. /etc/init.d/functions
start() {
echo -n "Starting custom openvpn... "
/full-path-to/your/apps.sh
return 0
}
stop() {
echo -n "Shutting down custom openvpn... "
/full-path-to/your/stop-apps.sh
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart)
stop
start
;;
reload)
;;
*)
echo "Usage: openvpn-apps {start|stop|status|reload|restart}"
exit 1
;;
esac
exit $?
Apps.shは次のようになります
#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start
Apps.shをopenvpnステータスに依存させるには、sleep
orを使用してapps.shの開始を少し遅らせることができます。psでopenvpnをチェックするbashループを作成しますor openvnゲートウェイ(apps.sh内)へのpingの結果を確認またはservice openvpn-custom status
(apps.sh内)の結果を確認できます
フェイルセーフopenvpn:
「フェイルセーフ」を設定して、openvpnが機能していない場合にネットワークをダウンさせ、vpnが機能していないときに接続リークを防ぐことができます this または that ソリューション
アプリケーションに特定のインターフェイスを使用させる:
Openvpn設定がシステム全体のトンネリング/ルーティングである場合。これは必要ありませんが、openvpnインターフェースを介してすべてのトラフィックをルーティングしない場合は、vpnを使用するようにアプリケーション(送信/テレグラム)をプロキシ化/バインド/強制できます。 Linuxでは、アプリケーションを特定のインターフェイスにバインドするためのいくつかの解決策があり、それぞれに長所と短所があります nix stackexchange answer 利用可能なほとんどの可能性について詳細に説明します
あなたのケースでは、できるだけ標準的な手順に固執するかもしれません。
pristine CentOS 6.10 minimal ISOインストールから始めて、次のように進めます。
まず、enable制限のないOpenVPN:CentoOS 6には、基本的にネットワーク設定のみを許可する制限モードで/usr/sbin/openvpn
バイナリを実行する標準のSELinuxポリシーが付属しているため、ヘルパースクリプトを役立つことは何でもできる。ただし、CentOS 6には、制限のないOpenVPNを有効にする1つの簡単な設定も用意されています。 superuserとして:
setsebool -P openvpn_run_unconfined on
少し時間がかかることがありますので、数秒お待ちください。
あなたはmightすべてがうまくいったら、それを制限モードに戻したいと思っています。私が後で戻ってくるいくつかの実行可能なアプローチがあります。
次に、基本的なセットアップを続行するには、システムのyumへのinstall EPELリポジトリ:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
これにより、システムのyumに、openvpn用のRPMとCentOS 6用にパッケージ化された伝送を提供するリポジトリが提供されます。
その後、次のことができますdo:
yum install openvpn transmission-daemon
次にinstall既に行っているようなtransmission-telegram
ボット。必ず$PATH
で示されるディレクトリに配置してください。 CentOS 6のSELinuxポリシーを考慮すると、/usr/local/bin
が適切な選択になる場合があります。
(注意してくださいテレグラムボットの詳細を詳しく知ることはできません。何も知らないため、テレグラムをまったく使用していないため、テストすることもできません。 )
次にmakeのようなopenvpn-transmission-up.sh
スクリプト:
#!/bin/bash
PATH+=":/sbin:/usr/sbin"
service transmission-daemon start
service transmission-daemon status && telegram-bot-start.sh
telegram-bot-start.sh
は、テレグラムボットを開始する実際のコマンドを実行するための架空のラッパーであり、送信デーモンが正常に開始された場合にのみ実行されます。ダイレクトコマンドを&&
の後に配置するワンライナーにすることができる場合は、ラッパースクリプトの代わりにダイレクトコマンドを使用することもできます。
それからmakeopenvpn-transmission-down.sh
スクリプトのように:
#!/bin/bash
PATH+=":/sbin:/usr/sbin"
telegram-bot-stop.sh
service transmission-daemon stop || true
ここでも、telegram-bot-stop.sh
ラッパーの代わりに、テレグラムボットを停止するためのダイレクトコマンドを使用できます。この場合、実際にはコマンドのシーケンスです。
次にmake上記の2つのスクリプトを実行可能にします。
chmod +x openvpn-transmission-up.sh openvpn-transmission-down.sh
およびplace/etc/openvpn/scripts
ディレクトリにあります(ここでもCentoOS SELinuxポリシーに準拠します)。そのディレクトリがない場合は作成します。
次にput OpenVPNの独自の設定を/etc/openvpn
に入れます。このようなファイルには任意の名前を付けることができますが、.conf
サフィックスが必要です。
確認.conf
ファイルに次の行が含まれています。
script-security 2
route-up scripts/openvpn-transmission-up.sh
route-pre-down scripts/openvpn-transmission-down.sh
すでにroute-up
またはroute-pre-down
スクリプトがある場合は、既存のスクリプトをそれぞれ上記のスクリプトとマージしますが、必ず/etc/openvpn/scripts
に入れてください。
上記の設定により、トランスミッションボットとテレグラムボットは常にVPNトンネルの運命をたどります。
最後にset起動時に実行するopenvpn:
chkconfig openvpn on
この最後の設定は、OpenVPNのRPMパッケージに付属しているセットアップに依存しているため、一般的なネットワークが正常に開始された後にのみ実行されます。
RPMパッケージに付属するデフォルトの設定で十分なので、Transmissionを実際に設定する必要はないと思います。ただし、sed
コマンドを再利用してIP_ADDRESSを設定する場合は、送信デーモンを開始する前に、そのsed
コマンドをopenvpn-transmission-up.sh
スクリプトに配置します。とにかく、通常は$ifconfig_local
ではなく$4
を使用することをお勧めします。
この時点で、すべての準備が整っているはずです。単純なservice openvpn
に続いてstart
またはstop
またはrestart
などでテストするか、ヘッドレスサーバーを再起動するだけです。
[〜#〜] note [〜#〜] VPNプロバイダーがユーザー名とパスワードによる認証を必要とする場合、それらを2つの異なる行のファイルに入れる必要があります。 SELinuxポリシーに準拠するには、このファイルを/etc/openvpn
に配置する必要があります。次に、auth-user-pass /etc/openvpn/credentials-file
をopenvpn .conf
ファイルに含めます。そうしないと、CentOSは起動中に資格情報のインタラクティブな入力を待機して停止するか、単にOpenVPNが起動を拒否する可能性があります。
上記の設定を(再)強化することに関しては、好みに応じて、現状のままで満足する可能性があります。これまでの設定では、OpenVPNを制限なしで実行できるようにする設定を含め、CentOSによって事前にインストールされた許容可能な設定を利用しています。これは基本的に、ヘルパースクリプトがシステムで利用可能なバイナリを自由に実行できるようにします。それは聞こえるかもしれないほど緩いですが、SELinuxをまったく使用しない場合よりもさらに制限されています。この方法をそのままにしておくと、TransmissionとTelegramボットの両方が、ストック(または手動)インストールが許可するよりも少し多くの制約で実行されます。
OpenVPNを制限された操作に戻したい場合は、CentOS 6が実際に/sbin/init
としてUpstartを使用しているという事実を利用することで、レガシーSysVinitのブート操作の多くに依存していますが、それでもかなり簡単です。スタイルのスクリプト。ただし、追加の手順が必要です。
開始するには、put OpenVPNを制限モードに戻します。
setsebool -P openvpn_run_unconfined off
OpenVPNを開始すると、ヘルパースクリプトはTransmissionおよびTelegramボットを開始できなくなります。
したがって、カスタムSELinuxポリシー:
作成openvpn-talk-upstart.te
という名前のファイル正確に次のように:
module openvpn-talk-upstart.mod 1.0;
require {
type openvpn_t;
type init_t;
class unix_stream_socket connectto;
}
allow openvpn_t init_t:unix_stream_socket connectto;
次にrun次のコマンド:
checkmodule -m -M -o openvpn-talk-upstart.mod openvpn-talk-upstart.te
semodule_package -o openvpn-talk-upstart.pp -m openvpn-talk-upstart.mod
semodule -i openvpn-talk-upstart.pp
最後のコマンドは少し時間がかかる場合があります。
次に、Upstartジョブ:
Make/etc/init/transmission-up.conf
ファイルは次のとおりです。
task
exec service transmission-daemon start
and/etc/init/transmission-down.conf
ファイル:
task
exec service transmission-daemon stop
次に、あなたはneed Telegramボットの求人も開始します。
私の例と一貫性を保つために、私は架空のスクリプトアプローチに固執します。そのため、たとえば/etc/init/telegram-bot-up.conf
および/etc/init/telegram-bot-down.conf
という名前のジョブファイルは、exec
edコマンドを使用する場合のみ、転送ファイルと同じになります(それぞれ)/usr/local/bin/telegram-bot-start.sh
および/usr/local/bin/telegram-bot-stop.sh
に変わります。
ここでは、Upstartの信頼度に応じて、exec
キーワードの代わりにscript ... end-script
キーワード内で関連コマンドをジョブファイルに直接配置するか、完全に作成することもできます。必要に応じて、単一のUpstartジョブファイル(task
タイプではない)を介してUpstart制御のデーモン。
この後、makeopenvpn-transmission-up.sh
のOpenVPNヘルパー/etc/openvpn/scripts
スクリプトは次のようになります。
#!/bin/sh
/sbin/start transmission-up && /sbin/start telegram-bot-up
andopenvpn-transmission-down.sh
スクリプト:
#!/bin/sh
/sbin/start telegram-bot-down
/sbin/start transmission-down || true
Note実際には「ダウン」操作ですが、/sbin/start
コマンドが使用されました。
これで、OpenVPNが元の閉じ込められた(つまり、より安全な)モードですべてが機能するはずですが、TransmissionとTelegramボットの両方が標準の「フリー」(つまり、安全性の低い)モードで動作します。
これらの後者の2つをさらに強化したい場合は、OpenVPNのコンテキストなど、限定されたSELinuxコンテキストで実行し、/var/log/audit/audit.log
ファイルを注意深く分析して、 SELinuxポリシーを正確に調整します。そのために役立つツール、つまりaudit2allow
パッケージから入手できるpolicycoreutils-python
コマンドがあります。
許可モードのSELinuxからのaudit.log
を介してそのコマンドを実行できます(/etc/sysconfig/selinux
ファイルを参照)。ただし、許可が多すぎる可能性があります。それ以外の場合は、通常のSELinuxを強制することから得られるaudit.log
を介して実行し、最終的に機能するセットアップに到達するまで段階的に実行できます。この後者の方法では、正確に必要なものだけを許可することが確実になります。
audit2allow -a -m ...
からの出力はcheckmodule -m -M -o ...
に、次に後者はsemodule_package -o ... -m ...
に、最後にsemodule -i
によって生成されたファイルのsemodule_package
に出力する必要があります。分析の各ステップでのこの反復。
これは非常に長いタスクとなる可能性があり、実際のセットアップに到達した場合でも、最初は非常に長くなる可能性があります。後で、例えば初めてトランスミッションまたはテレグラムボットが、以前に試行したことがないものにアクセスしようとしたとき。