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を通過するのかトレントトラフィックのみを通過するのか、特に難しいわけではありません。
- 起動時に(インターネットに接続した後)OpenVPNを起動します。
- VPN接続が接続されている場合に転送するようにトランスポートを設定します。
- 成功したら、Transmission(および Telegram ボット)を実行します。
- いつでも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の他のチュートリアルで指定されたemit
内容がありませんか?transmission-vpn-up
それとも、vpn.sh
起動時に(この記事の最初のコードブロック)実行する方が簡単ですか? VPNがダウンした場合、これは同じようにきれいでエレガントですが、操作は実行されます。
クイックアップデート:
上記のAsk Ubuntuチュートリアル、特にCentOSではなかった/etc/init/transmission-up.conf
使用しようとすると、元のエラーメッセージが表示されます。一時的にこのビットをコメントアウトしましたが、今はエラーメッセージはありません。/usr/sbin/ufw
Event 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.service
openvpn サービスが開始されないか失敗した場合、他のサービスも開始されません。
セントース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)スタイルのサービス定義の例を示します。
- http://linux.die.net/man/8/chkconfig
- http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html
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/openvpn
SELinuxポリシーに準拠する場所になければなりません。次に、auth-user-pass /etc/openvpn/credentials-file
openvpnファイルに含めます.conf
。そうしないと、CentOSが起動中に停止し、資格情報が対話式に入力されるのを待つか、OpenVPNの起動が拒否される可能性があります。
上記の設定を(再)強化することに関して、あなたの好みに応じて満足できるかもしれません。これまでの設定では、デフォルトでHelperを許可するOpenVPNをより少ない制限で実行できる設定など、プレインストールされたCentOS許可設定を利用しています。スクリプトはシステムで利用可能なバイナリを自由に実行します。これは許容できるように聞こえますが、SELinuxがまったくないよりも制限的であり、この方法でTransmissionとTelegramボットの両方が基本(または手動)インストールが許可するよりも少し制限的に実行されます。
/sbin/init
OpenVPNを再び制限された操作に戻したい場合は、CentOS 6がブート操作の大部分を以前のSysVinitスタイルスクリプトに依存していますが、実際にUpstartを使用しているという事実を利用することは依然として非常に簡単です。しかし、いくつかの追加手順が必要です。
- 少なくとも、OpenVPN が Upstart と通信して転送とテレグラムのボットの実行を要求できるようにする(幸いなことに)カスタム SELinux ポリシー
- レガシースクリプトを介して転送およびテレグラムボットを起動するための複数の(簡単な)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-script
Upstartexec
作業ファイルプロセスから完全に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.log
SELinuxポリシーを微調整する必要があります。役に立ついくつかのツール、つまりパッケージaudit2allow
に提供されているコマンドがありますpolicycoreutils-python
。
audit.log
SELinuxのコマンドに対して許可モードでこのコマンドを実行できますが、ドキュメントを参照してください/etc/sysconfig/selinux
。それ以外の場合は、audit.log
通常のSELinux実装を介してシステムで実行し、最終的にジョブ設定を取得するまで作業できます。後者のアプローチを使用すると、実際に必要なもの以上を許可しないようにすることができます。
の出力はaudit2allow -a -m ...
に供給されcheckmodule -m -M -o ...
、後者の出力はに供給され、semodule_package -o ... -m ...
最後にsemodule -i
生成されたファイルのaに供給されなければなりませんsemodule_package
。分析の各ステップを繰り返します。
することができます非常にこれは時間のかかる作業であり、動作設定があっても初期にのみ可能です。ある時点で、後で予期しない「権限拒否」の問題が発生する可能性があります(たとえば、トランスポートまたはテレグラムボットが最初に試みたとき)。以前に試したことがないものにアクセスすることです。