web-dev-qa-db-ja.com

OpenVPNが正常に接続した後にスクリプトを実行するにはどうすればよいですか?

VPNが正常に接続されたときに実行されるようにスクリプトをOpenVPNに関連付けるにはどうすればよいですか?

49
Oxwivi

network-manager-openvpnはそのような機能を提供しません。openvpnを直接使用する必要があります。

接続時に--script-security 2 --up /path/to/your/scriptを渡します。 /etc/openvpn/にある構成ファイルを使用している場合、構成ファイルに次の行を追加します。

script-security 2
# run /etc/openvpn/up.sh when the connection is set up
up /etc/openvpn/up.sh

OpenVPNマンページ から:

--script-security level [method] 
このディレクティブは、OpenVPNの外部プログラムおよびスクリプトの使用法
をポリシーレベルで制御します。レベル値が低いほど制限が厳しく、値が大きいほど許容範囲が広くなります。 
レベルの設定:
 
 0-外部プログラムを厳密に呼び出しません。
 1 デフォルト)ifconfigなどの組み込みの実行可能ファイルのみを呼び出します。 
 ip、route、またはnetsh。
2-組み込みの実行可能ファイルおよびユーザー定義の
スクリプトの呼び出しを許可します。
 3-環境
変数を介してパスワードをスクリプトに渡すことを許可します(安全でない可能性があります)。
 --up cmd 
 ShellコマンドTUN/TAPデバイスが正常に開いた後に実行する(pre 
 --user UID change)。 upスクリプトは、VPN接続のもう一方の端に存在するプライベート
サブネット宛てのIPトラフィックをトンネルにルーティングする
 routeコマンドを指定するのに便利です。
スクリプトの実行順序
 --up TCP/UDPソケットバインドおよびTUN/TAPのオープン後に実行されます。
 --down TCP/UDPおよびTUN/TAPのクローズ後に実行されます。

スクリプトを実行するためのイベントは他にもあり、それらは---(manual page にあります。

/etc/openvpn/up.shを作成し、実行許可(たとえば、755または700)を付与します。 IPv6アドレスとルートを追加するためのコンテンツの例(教育目的で表示されます。直接コピーしないでください):

#!/bin/sh
# add an IPv6 address to device $dev (environment variable)
ip -6 addr add 2001:db8::1:2/112 dev $dev
# and the IPv6 route for this net using gateway 2001:db8::1
ip -6 route add 2001:db8::1:0/112 via 2001:db8::1 dev $dev

このupスクリプトはルートとして実行されることに注意してください。 UserおよびGroup設定を指定していない場合、OpenVPNはdownなどのスクリプトもrootとして実行します。

62
Lekensteyn

「VPNが正常に接続されたときに実行されるようにスクリプトをOpenVPNに関連付けるにはどうすればよいですか?」 Lekensteyn が優れた answer を提供したことを指摘したいと思います。しかし、彼の答えが作成された時点では、特にリブート後に同じように動作するように、ubuntuマシンでopenvpnを起動するためにopenvpnコマンドライン引数をどのように提供すべきかについて、少し明確に欠けていました。


UbuntuのOpenvpnコマンドライン引数:

当然、有効な有効なオプションを使用してコマンドラインからopenvpnを起動できます。ただし、Ubuntuマシンでは、リブート後に同じコマンドライン引数でopenvpnを起動する場合、ファイル/etc/default/openvpnの編集を検討する必要があります。次の行を調べます。

# Optional arguments to openvpn's command line
OPTARGS="" 

community openvpn man page on --script-securityから

--script-security level 
このディレクティブは、OpenVPNの外部
プログラムおよびスクリプトの使用をポリシーレベルで制御します。低いレベルの値はより制限的で、高い
の値はより許容的です。レベルの設定:
 0-外部プログラムを厳密に呼び出しません。 
 1-(デフォルト)ifconfig、ip、route、
、netshなどの組み込みの実行可能ファイルのみを呼び出します。 
 2-組み込みの実行可能ファイルとユーザー定義スクリプトの呼び出しを許可します。 
 3-環境変数を介してパスワードをスクリプトに渡すことを許可します
(潜在的に安全ではありません)。
 
 v2.3より前のOpenVPNは、メソッドフラグもサポートしていました。 
 OpenVPNが外部コマンドとスクリプトを呼び出す方法を示しました。これは、execve 
またはsystemのいずれかです。 OpenVPN v2.3以降、このフラグは受け入れられなくなりました。ほとんどの* nix 
環境では、execve()アプローチが問題なく使用されています。
 
 --upなどの一部のディレクティブでは、オプションを外部スクリプトに渡すことができます。
これらの場合、スクリプト名にスペースが含まれていないことを確認してください。スペースが含まれていないか、スクリプト
 nameが終了してスクリプトオプションが開始する場所を判断できないため、
 configurationパーサーが停止します。

--upの短縮セクションと組み合わせて

-up cmd 
 TUN/TAPデバイスを正常に開いた後、コマンドcmdを実行します(--user UIDの変更前)。
 cmdは、スクリプト(または実行可能プログラム)へのパスで構成されます。 、オプションで引数が続きます
。パスと引数は、単一引用符または二重引用符で囲むか、バックスラッシュを使用して
エスケープするか、1つ以上のスペースで区切る必要があります。

例:

Openpvn server.confを使用するマシンでは、/etc/default/openvpnファイルに次の行があります。

OPTARGS="
    --script-security 2
    --up /etc/openvpn/nat.sh
" 

ちなみに、nat.shは、プライベートネットワークトラフィックをopenvpnクライアントからパブリックインターネットにルーティングするためのネットワークアドレス変換をセットアップします。これは、パブリックWIFIアクセスポイントを信頼しない場合に適しています。


再起動後の期待どおりの再起動を許可する以外に、/etc/openvpn/[client or server].confおよび/etc/default/openvpnファイルが適切に設定されている場合、openvpnは次のように起動または停止できます。

Sudo service openvpn start
Sudo service openvpn stop

service openvpnに使用できるその他の便利なオプションには、cond-restart,force-reload,reload, restart,soft-restart, start, status, stopが含まれます。

5
Keith Reynolds

それは非常に古いスレッドなので、まだ興味があるかどうかはわかりません。 NetworkManagerを使用してVPNに接続する場合は、次のような簡単なudevルールを追加できます。

KERNEL=="vpn0", RUN+="/PATH_TO_THE_SCRIPT/SCRIPT_NAME"

これにより、VPNの作成後にスクリプトが実行されます。

3
Thomas

私はこの問題を解決するための調査で答えを見つけましたが、最良の解決策は(openvpnサーバーを使用して)次のとおりであることがわかりました。

実行するスクリプトを作成します。

# nano /etc/openvpn/up.sh
<file:contents>
#!/bin/sh

# export >> /var/log/openvpn/openvpn-up.log
D=`date "+%Y-%m-%d %H:%M"`
echo "[$D] ($local_port_1:$proto_1) $X509_0_CN: $trusted_ip => $ifconfig_pool_remote_ip" >> /var/log/openvpn/openvpn-up.log
</file>

以下の行をopenvpn構成に追加します(通常は/etc/openvpn/server.conf)。上記の回答では、サーバーの起動(再起動)時に使用される上下に使用されました。ディレクティブclient-connect(およびclient-disconnect)は、クライアントが接続(切断)するときに使用されます。

# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
1
CozC