web-dev-qa-db-ja.com

CentOS 6での起動時にOpenVPNとTransmissionをセットアップする方法は?

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を通過するのか、トレントトラフィックのみが通過するのかについては特に気にしませんが、理想的には、私は この投稿 の概要のような何かを行うことができます。

  1. 起動時にOpenVPNを起動します(ネットワークが起動した後)。
  2. VPN接続が通過する場合は、それを通過するようにTransmissionを構成します。
  3. 問題が解決しない場合は、Transmission(およびTelegramボット)を実行します。
  4. VPNがダウンした場合は、Transmission(およびTelegramボット)も適切にダウンしてください。

その投稿で説明されている手順に従ってみましたが、何らかの理由で、イベント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-upemittingして何か不足していますか?

または、vpn.sh(この投稿の最初のコードチャンク)を起動時に実行する方が簡単ですか? VPNがダウンしたとしても、それはきちんとしたまたは優雅なものになりますが、それでうまくいきます。


クイックアップデート:

Ask Ubuntuのチュートリアルで私が前述した 、特に/etc/init/transmission-up.confは、CentOSにはない/usr/sbin/ufwを使用しようとしているため、元のEvent failedエラーメッセージが表示されます。これらのビットを一時的にコメント化したところ、エラーメッセージは表示されなくなりました。

ただし、エラーメッセージが表示されず、VPNが稼働している場合でも、送信が開始されないため、何かが失敗しているように見えます。

4
Marcy

ソリューション

この質問に関するいくつかの詳細な側面と解決策を次に示します(centos 6はsystemdを使用しておらず、centosはv7でsystemdに切り替えられています)

CentOS 7のソリューション

起動時に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.serviceWants=openvpn-custom.serviceは、openvpnに応じてそのサービスを作成するため、openvpnサービスが開始されていないか失敗した場合、他のサービスは開始されません。

CentOS 6のソリューション

起動時に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ステータスに依存させるには、sleeporを使用してapps.shの開始を少し遅らせることができます。psでopenvpnをチェックするbashループを作成しますor openvnゲートウェイ(apps.sh内)へのpingの結果を確認またはservice openvpn-custom status(apps.sh内)の結果を確認できます

ソリューション(6&7)に関する注記:

フェイルセーフopenvpn:

「フェイルセーフ」を設定して、openvpnが機能していない場合にネットワークをダウンさせ、vpnが機能していないときに接続リークを防ぐことができます this または that ソリューション

アプリケーションに特定のインターフェイスを使用させる:

Openvpn設定がシステム全体のトンネリング/ルーティングである場合。これは必要ありませんが、openvpnインターフェースを介してすべてのトラフィックをルーティングしない場合は、vpnを使用するようにアプリケーション(送信/テレグラム)をプロキシ化/バインド/強制できます。 Linuxでは、アプリケーションを特定のインターフェイスにバインドするためのいくつかの解決策があり、それぞれに長所と短所があります nix stackexchange answer 利用可能なほとんどの可能性について詳細に説明します

2
intika

あなたのケースでは、できるだけ標準的な手順に固執するかもしれません。

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のブート操作の多くに依存していますが、それでもかなり簡単です。スタイルのスクリプト。ただし、追加の手順が必要です。

  1. (幸運にもシンプルな)カスタムSELinuxポリシー。少なくともOpenVPNがUpstartと通信できるようにし、Upstartに送信とTelegramボットの開始を要求するようにします。
  2. レガシースクリプトを介してTransmissionを開始するための、およびテレグラムボットのための(単純な)アップスタートジョブ

開始するには、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という名前のジョブファイルは、execedコマンドを使用する場合のみ、転送ファイルと同じになります(それぞれ)/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に出力する必要があります。分析の各ステップでのこの反復。

これは非常に長いタスクとなる可能性があり、実際のセットアップに到達した場合でも、最初は非常に長くなる可能性があります。後で、例えば初めてトランスミッションまたはテレグラムボットが、以前に試行したことがないものにアクセスしようとしたとき。

1
LL3