解決策

解決策

CentOS 6.10の最小インストールを実行しているヘッドレスサーバーでOpenVPNを使用して転送を設定しようとしています。理想的には、システムの起動時に始まります。

次の手順を実行してすべてを実行できました。ここそしてここ- しかし、これはvpn.shスクリプトを手動で実行した場合にのみ機能します(両方のチュートリアルによると)。スクリプトは次のとおりです。

#!/bin/sh

sudo openvpn --cd /etc/openvpn --config /etc/openvpn/conf.ovpn --script-security 2 --up /etc/openvpn/up.sh

OpenVPNと転送に加えて、以下を追加したいと思います。このテレグラムボットこれは他のすべての操作が完了した後に開始する必要があるため、up.shファイルの末尾に次の行もあります。

#!/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接続が接続されている場合に転送するようにトランスポートを設定します。
  3. 成功したら、Transmission(および Telegram ボット)を実行します。
  4. いつでもVPNが失敗した場合は、転送(およびテレグラムボット)を正常に終了してください。

その記事に記載されている手順に従おうとしましたが、何らかの理由でイベントを発生させることはできませんtransmission-vpn-uproute-up.shチュートリアルのスクリプトによってトリガーされます)、常にコマンドラインinitctl: Event failedに移動してイベントを生成します。route-up.shAsk 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の他のチュートリアルで指定されたemit内容がありませんか?transmission-vpn-up

それとも、vpn.sh起動時に(この記事の最初のコードブロック)実行する方が簡単ですか? VPNがダウンした場合、これは同じようにきれいでエレガントですが、操作は実行されます。


クイックアップデート:

上記のAsk Ubuntuチュートリアル、特にCentOSではなかった/etc/init/transmission-up.conf使用しようとすると、元のエラーメッセージが表示されます。一時的にこのビットをコメントアウトしましたが、今はエラーメッセージはありません。/usr/sbin/ufwEvent failed

しかし、エラーメッセージがなく、VPNが動作しているにもかかわらず転送が開始されず、他の問題が発生しているようです。どこで確認できるかについてのヒントはありますか?

答え1

解決策

以下は、この問題のいくつかの詳細な側面と回避策です(centos 6はsystemdを使用せず、centosはv7からsystemdに切り替えられました)。

セントース7ソリューション

起動時のOpenVPN設定:

systemd(サービスの実装)を使用して起動時に openvpn を起動できます。サービスを作成して有効にしてから起動する必要があります。 (サービスを有効にした後起動時に自動的に起動します)

1 - サービスの作成:(ルートを使用)

cd /etc/systemd/system
touch openvpn-custom.service
chmod 644 openvpn-custom.service

2 - サービスファイルを開く:(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

起動時の転送とテレグラムの設定(openvpnの状態に応じて):

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サービスが openvpn に依存するため、Wants=openvpn-custom.serviceopenvpn サービスが開始されないか失敗した場合、他のサービスも開始されません。

セントース6ソリューション

起動時のOpenVPN設定:

1 - サービスの作成:(ルートを使用)

cd /etc/rc.d/init.d
touch openvpn-custom
chmod 755 openvpn-custom

2 - サービスファイルを開く:(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を起動する方法

初期化スクリプトの先頭のchkconfig定義は、インポートするS / K番号を決定します。

各「ランレベル」は実際には単純なディレクトリです(/etc/rc*.d/)は初期化スクリプト(/etc/init.d/) これらのシンボリックリンクの名前は、番号付きの S および K 項目で指定されます。

Sは始まり、Kは停止を意味します。 initがランレベルに入ると、S01からS99まで各initスクリプトを実行して、そのスクリプトによって制御されるサービスを開始します。 init がランレベルを離れると、K01 から K99 まで各スクリプトを実行して、そのスクリプトによって制御されるサービスを停止します。

手動で構成を確認するchkconfigスタイルのサービス定義とLSB(Linux Standard Library)スタイルのサービス定義の例を示します。

initscriptが両方のタイプを定義している場合は、LSB定義がchkconfig定義よりも優先される必要があります。

ネットワーク接続に依存するサービスがある場合は、10以降の開始番号を指定して、/etc/rc*.d/S10network以降にサービスが開始されていることを確認できます。または/etc/init .d/networkによるLSBの定義プロバイダー: $networkしたがって、LSB定義を使用できます。起動に必要: $network初期化スクリプトで。

起動時の転送とテレグラムの設定(openvpnの状態に応じて):

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状態に依存するようにするには、まずapps.shの起動を遅らせることができます。sleep またはpsでopenvpnをチェックするbashループを書くまたはopenvnゲートウェイ(apps.sh)のping結果を確認してください。またはservice openvpn-custom status(apps.shから)結果を確認できます。

ソリューションに関する注意事項(6および7):

エラー防止openvpn:

openvpnが機能していない場合は、ネットワークをシャットダウンするように「安全装置」を設定して、VPNが機能していない場合に接続漏れを防ぐことができます。これまたはそれ解決策

アプリケーションが特定のインターフェイスを使用するように強制します。

openvpn設定がシステム全体をトンネリング/ルーティングする場合はこれを行う必要はありませんが、openvpnインターフェイスを介してすべてのトラフィックをルーティングしない場合は、アプリケーション(転送/テレグラム)をプロキシ/バインディング/強制できます。 VPNを使用してください。 Linuxには、アプリケーションを特定のインターフェースにバインドするためのいくつかのソリューションがあり、各ソリューションには長所と短所があります。Unixスタック交換の回答最も利用可能な可能性の詳細な説明

答え2

あなたの場合でも、できるだけ標準的な手順に従うと思います。

一つで始まるオリジナルセントOS 6.10最小ISOのインストールは次のように進めます。

まず、〜できるようにする無制限のOpenVPN:CentoOS 6には、デフォルトで制限付きモードでバイナリを実行するデフォルトのSELinuxポリシーが付属しています/usr/sbin/openvpn。デフォルトでは、ネットワーク設定のみを許可して、ヘルパースクリプトが役に立つ操作を実行できないようにします。ただし、CentOS 6は無制限のOpenVPNを有効にする簡単な設定も提供します。 〜のようにランニング:

setsebool -P openvpn_run_unconfined on

多少時間がかかる場合がありますので、しばらくお待ちください。

あなた可能すべてが正常に動作したら、再び制限モードに切り替えたいです。後でいくつかの可能なアプローチに戻ります。

その後、基本設定を進めるには、インストールするシステムのyumにEPELリポジトリを追加します。

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

これは、システムのyumにCentOS 6パッケージopenvpnと転送用のRPMを提供するリポジトリを提供します。

後で行うことができますする:

yum install openvpn transmission-daemon

それからインストールするtransmission-telegramすでにそうしたようにボットです。で指定されたディレクトリに配置されていることを確認してください$PATH。 CentOS 6 の SELinux ポリシーを考慮すると、/usr/local/bin良い選択になることもできます。

参考にしてください私はテレグラムボットについて何も知らないので、詳しく説明することはできず、テレグラムをまったく使用していないので、テストすらできません。 )

それから作る次のスクリプトは次のとおりです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、テレグラムボットを起動する実際のコマンドを実行するための仮想ラッパーであり、転送デーモンが正常に起動した場合にのみ実行されます。直接コマンドを1行のコマンドとして入れることができる場合&&

そしてそこに作る次のスクリプトは次のとおりですopenvpn-transmission-down.sh

#!/bin/bash

PATH+=":/sbin:/usr/sbin"
telegram-bot-stop.sh
service transmission-daemon stop || true

telegram-bot-stop.shここでは、ラッパーの代わりに直接コマンドを使用してTelegramボットを停止することもできます。この場合、実際にはコマンドシーケンスであっても同様です。

それから作る上記の2つのスクリプトを実行できます。

chmod +x openvpn-transmission-up.sh openvpn-transmission-down.sh

そして場所/etc/openvpn/scriptsこれはディレクトリにあります(CentoOS SELinuxポリシーに再適用されます)。まだディレクトリがない場合は、ディレクトリを作成します。

それから置くあなた自身の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トンネルの運命に従うことを保証します。

ついに置くopenvpnは起動時に実行されます。

chkconfig openvpn on

この最後の設定はOpenVPNのRPMパッケージに付属の設定に依存するため、通常のネットワークが正常に起動した後にのみ実行されます。

RPMパッケージに付属の基本構成で十分であるため、実際にTransmissionを構成する必要はないと思います。ただし、IP_ADDRESS を設定するためにコマンドを再利用するには、sed Transmission-daemon を開始する前にsedコマンドをスクリプトに入れます。それにもかかわらず、一般的に代わりにopenvpn-transmission-up.sh使用することをお勧めします。$ifconfig_local$4

この時点では準備ができているはずです。簡単にservice openvpn次のstart ようstopにしてrestart これをテストできます。または、ヘッドレスサーバーを再起動してください。

ノートVPNプロバイダがユーザー名とパスワードによる認証を必要とする場合は、ファイルに2行で入力する必要があります。このファイルは/etc/openvpnSELinuxポリシーに準拠する場所になければなりません。次に、auth-user-pass /etc/openvpn/credentials-fileopenvpnファイルに含めます.conf。そうしないと、CentOSが起動中に停止し、資格情報が対話式に入力されるのを待つか、OpenVPNの起動が拒否される可能性があります。


上記の設定を(再)強化することに関して、あなたの好みに応じて満足できるかもしれません。これまでの設定では、デフォルトでHelperを許可するOpenVPNをより少ない制限で実行できる設定など、プレインストールされたCentOS許可設定を利用しています。スクリプトはシステムで利用可能なバイナリを自由に実行します。これは許容できるように聞こえますが、SELinuxがまったくないよりも制限的であり、この方法でTransmissionとTelegramボットの両方が基本(または手動)インストールが許可するよりも少し制限的に実行されます。

/sbin/initOpenVPNを再び制限された操作に戻したい場合は、CentOS 6がブート操作の大部分を以前のSysVinitスタイルスクリプトに依存していますが、実際にUpstartを使用しているという事実を利用することは依然として非常に簡単です。しかし、いくつかの追加手順が必要です。

  1. 少なくとも、OpenVPN が Upstart と通信して転送とテレグラムのボットの実行を要求できるようにする(幸いなことに)カスタム SELinux ポリシー
  2. レガシースクリプトを介して転送およびテレグラムボットを起動するための複数の(簡単な)Upstart操作

スタート、置くOpenVPNが制限モードに戻ります。

setsebool -P openvpn_run_unconfined off

OpenVPNを起動すると、ヘルパースクリプトはトランスポートとテレグラムのボットを起動しません。

したがって、カスタム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;

それから走る次のコマンド:

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

最後のコマンドには時間がかかる場合があります。

そして、新しい場所があります。

作る/etc/init/transmission-up.conf次のファイル:

task

exec service transmission-daemon start

そして/etc/init/transmission-down.conf次のファイル:

task

exec service transmission-daemon stop

だからあなたは必要テレグラムボットにも新投稿があります。

私の例と一貫性を保つために仮想スクリプトアプローチに固執するので、edコマンドがそれぞれに変換されただけで、名前と/etc/init/telegram-bot-up.conf作業ファイルが/etc/init/telegram-bot-down.conf転送ファイルに似ています。exec/usr/local/bin/telegram-bot-start.sh/usr/local/bin/telegram-bot-stop.sh

ここでは、Upstartにどのように自信があるかに応じて、関連コマンドを作業ファイルに直接入れてキーワードをキーワードに置き換えたり、script ... end-scriptUpstartexec作業ファイルプロセスから完全にUpstart制御デーモンを生成したりすることもできます(ただし、task入力しないでください)。

今後、作るOpenVPNヘルパーopenvpn-transmission-up.shスクリプト/etc/openvpn/scriptsは次のとおりです。

#!/bin/sh

/sbin/start transmission-up && /sbin/start telegram-bot-up

そしてスクリプトopenvpn-transmission-down.sh:

#!/bin/sh

/sbin/start telegram-bot-down
/sbin/start transmission-down || true

ノート/sbin/start実際に「ダウン」操作の場合でも、このコマンドを使用してください。

OpenVPNはもともと制限された(つまりより安全な)モードで動作しますが、TransmissionとTelegramボットは両方とも標準的な「無料」(つまり安全性の低い)モードですべてがうまく機能します。


後者の2つをさらに強化するには、OpenVPNなどの限られたSELinux環境でそれを実行し、ファイルを慎重に分析して/var/log/audit/audit.logSELinuxポリシーを微調整する必要があります。役に立ついくつかのツール、つまりパッケージaudit2allowに提供されているコマンドがありますpolicycoreutils-python

audit.logSELinuxのコマンドに対して許可モードでこのコマンドを実行できますが、ドキュメントを参照してください/etc/sysconfig/selinux。それ以外の場合は、audit.log通常のSELinux実装を介してシステムで実行し、最終的にジョブ設定を取得するまで作業できます。後者のアプローチを使用すると、実際に必要なもの以上を許可しないようにすることができます。

の出力はaudit2allow -a -m ...に供給されcheckmodule -m -M -o ...、後者の出力はに供給され、semodule_package -o ... -m ...最後にsemodule -i生成されたファイルのaに供給されなければなりませんsemodule_package。分析の各ステップを繰り返します。

することができます非常にこれは時間のかかる作業であり、動作設定があっても初期にのみ可能です。ある時点で、後で予期しない「権限拒否」の問題が発生する可能性があります(たとえば、トランスポートまたはテレグラムボットが最初に試みたとき)。以前に試したことがないものにアクセスすることです。

関連情報