Bashスクリプトでopenvpnトンネルを設定する

Bashスクリプトでopenvpnトンネルを設定する

コンピュータの起動時にopenvpnトンネルを設定するスクリプトを作成しようとしています。主な問題は、pkcs12パスワードを入力することです。私はパスワードをプレーンテキストで保存することは非常に悪い習慣であることを知っていますが、それについてはあまり心配しません。コンピュータは他のすべての点で非常に安全なので、私以外は誰もがアクセスしてコンテンツを見ることができないと確信しています。パスワード。

Telnetセッションを介してパスワードを入力できるようにし、--managementオプションを追加しました。--management-query-passwordsこれを手動で実行すると正常に動作しますが、bashスクリプトを使用して自動化しようとすると失敗します。私の考えでは、パスワード行の後にキャリッジリターンを正しく実行していないか、他のジャンク値がTelnetセッションに入力にこっそり入っているようです。関連するコードビットは次のとおりです(xxxは分類内容を表します)。

$ cat user.ovpn
#OpenVPN Server conf
tls-client
client
dev tun
proto udp
tun-mtu 1400
remote xxxxxxxxxxxxxxxxxxx 1194
pkcs12 user.p12
cipher AES-256-CBC
comp-lzo
verb 3
ns-cert-type server
tls-remote xxxxxxxxxxxxxxxxxxxxxxx
management 127.0.0.1 5558
management-query-passwords

$ cat telnet_commands.sh
#!/bin/bash
echo "open 127.0.0.1 5558"
sleep 1
echo -e "password 'Private Key' xxxxxxxxxx\r\n"

$ nohup openvpn user.ovpn &
$ ./telnet_commands.sh | telnet

$ #manually check whether this worked:
$ telnet 127.0.0.1 5558
Escape character is '^]'.
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
>PASSWORD:Need 'Private Key' password

明らかにこれはうまくいきません。 openvpn Telnet 管理インターフェイスはまだパスワードを待っています。

答え1

ただ言いたかったです(少なくともUbuntu 12.04では)--askpass /あなたの/ファイルopenvpnのパラメータは、ファイルから秘密鍵のパスワードを読み取ります。

答え2

小さな修正を含む作業例:

nohup openvpn /etc/init.d/ovpn/Userxxx.ovpn &
/etc/init.d/ovpn/telnet_commands.sh

答え3

私が望むのは秘密鍵のパスワードだけです。echo -e "xxxxxxxxx\r\n"またはを試してくださいecho "xxxxxxxx"

expectを使用してパスワード要求に応答することもできます。一部のパスワードプログラムはタイプデバイスでパスワードを探しますtty。プログラムの見積もりはこの問題を処理します。

rc.dトンネルを開始するには、初期化スクリプトを見つけることをお勧めします。これは起動時に開始する一般的な方法です。

答え4

さて、openvpnトンネルのパスワードが正常に自動入力され、起動時にトンネルが正常に実行されました。これが同じことをしたい他の人に役立つことを願っています。今は非常に基本的に見えるものを調べるのに20時間以上かかったからです。パスワード:

$ cat /etc/init.d/ZZcreate_ovpn_tun.sh
#!/bin/bash

# check if the tunnel already exists before trying to create it
proc=$(ps aux | grep openvpn | grep Userxxx)
if [ "$proc" == "" ]; then
  echo "ovpn tunnel does not exist yet - will create it now"
else
  echo "ovpn tunnel already exists ($proc)"
  exit 0
fi

# load the config file into openvpn - has options to request the pkcs12 password through
# telnet
nohup openvpn /etc/init.d/ovpn/Userxxx.ovpn
sleep 1

# enter the password though a telnet session
/etc/init.d/ovpn/telnet_commands.sh

$ cat /etc/init.d/ovpn/telnet_commands.sh
#!/usr/bin/expect
spawn telnet 127.0.0.1 5558
expect ">PASSWORD:Need 'Private Key' password"
send "password 'Private Key' xxxxxxxxxxxxx\r"
expect "SUCCESS: 'Private Key' password entered, but not yet verified"
send "quit\r"
expect eof

$ cat Userxxx.ovpn
#OpenVPN Server conf
tls-client
client
dev tun
proto udp
tun-mtu 1400
remote xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.com.au 1194
pkcs12 /etc/init.d/ovpn/Userxxx.p12
cipher AES-256-CBC
comp-lzo
verb 3
ns-cert-type server
tls-remote xxxxxxxxxxxxxxxxxxxxxxxxxxx.com.au
management 127.0.0.1 5558
management-query-passwords

$ sudo update-rc.d ZZcreate_ovpn_tun.sh defaults
$ sudo shutdown -r 0

$ # wait for system to boot up again
$ ps aux | grep openvpn
root 5279  0.0  0.1  28224  3728 ? S 22:48 0:00 openvpn /etc/init.d/ovpn/Userxxx.ovpn

失敗した場合に理由を理解するために、すべての出力をファイルにリダイレクトすることもできます。 ZZcreate_ovpn_tun.shファイルを呼び出して、このファイルがinit.dディレクトリにあるすべてのスクリプトを最後に実行したことを確認しました。理想的にはレベル6でのみ実行するようにしなければなりませんが、現時点では素晴らしい動作します。

関連情報