AndroidとVPN

DLNAの環境を整えたので、出先からAndroidを使ってメディア再生できるようにしてみる。
MediaTombのサーバを外部に公開するのはダメだと思うので、この際VPN環境を整えてみようと思う。

当初PPTPというプロトコルを使用したVPN環境整備が楽そうだったので、PPTPを使用していこうと思ったが、
これはどうも、クラックされていて脆弱性があるようだった。
そこで、IPSecを使用したVPN環境の構築をしていこうと思う。


しかし、IPSecについて調べていると、下のような記事を発見した。

SSL VPN と OpenVPN:多くの嘘とわずかな真実

この記事を読んで、やっぱりIPSecでなくて、OpenVPNを使用していくことを決断した。

インストールはapt-getで特に問題なく完了。

sudo apt-get update
sudo apt-get install openvpn

OpenVpnを使用するには、SSLの鍵が必要になるので作成していく。

認証局(CA)の作成

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0

ここに、鍵を作成するコマンドツールがある。
varsファイルを編集して設定を行う。

export KEY_SIZE=2048
export KEY_COUNTRY="JP"
export KEY_PROVINCE="県"
export KEY_CITY="市"
export KEY_ORG="ホスト名とか"
export KEY_EMAIL="メアド"
#export KEY_EMAIL=mail@host.domain
#export KEY_CN=changeme
#export KEY_NAME=changeme
#export KEY_OU=changeme
#export PKCS11_MODULE_PATH=changeme
#export PKCS11_PIN=1234

KEY_SIZEはパフォーマンスが少し落ちそうだが、よりセキュアにするためにデフォルトから2048にした。
他は、地域情報やその他の設定。 後半は、ほとんどいらないのでコメントアウト。

su -
source vars
./clean-all
./build-ca

build-caを実行すると、いろいろ入力をお求められるがvaarsでちゃんと設定しておけば、すべてEntertのみ押しておけばオッケー。
今後もCommon Nameという項目を設定する必要が出てくるが、その時は毎度違う名前を指定なければならない。
これで、keysディレクトリに認証局の証明書と、鍵が作成できた。

ca.crt:認証局の証明書
ca.key:認証局の鍵

OpenVPNの証明書発行

次にVPNサーバの証明書を発行する。
引き続き同じディレクトリで

./build-key-server OpenVPN-server

このコマンドの、引数がCommon nameのデフォルト値となる。
Common nameは認証局を作成した際のものとは違う名前になるようにする。

Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]

この2つに対してはyを入力する。
これでサーバ用の証明書が作成できた。

OpenVPN-server.csr:証明書要求ファイル
OpenVPN-server.crt:証明書ファイル
OpenVPN-server.key:鍵ファイル

証明書要求ファイルは、別のサーバにCAがある場合そのCAに対して証明書を生成してもらう時に使う。
次にDiffieHellmanの設定。

./build-dh

サーバ設定

今まで作成してきたファイルの中から、

ca.crt
OpenVPN-server.crt
OpenVPN-server.key
dh2048.pem

/etc/openvpn にコピーする。

同じディレクトリに、サーバ設定ファイルのサンプルをコピーする。

cp /usr/share/doc/openvpn/examples/sample-config-files/server.config.gz /etc/openvpn
cd /etc/openvpn
gzip -d server.config.gz

OpenVPNには2つのモードルーティング方式(tun)ブリッジ方式(tap)がある。
今回OpenVPNサーバを建てる目的は、DLNAをAndroidで外から使いたいからだ。
DLNAを使用するには、ブロードキャストができなければならない。

ブロードキャストするためにはブリッジ方式を採用する必要があるので、ブリッジ方式の設定を行う。

サンプルの設定ファイルから、追記・修正したのをまとめる。

#ブリッジモードを使用するための設定
dev tap0
;dev tun
#証明書ファイルと鍵ファイルの設定<strong></strong>
cert OpenVPN-server.crt
key OpenVPN-server.key
#ルーティングモードの設定をコメントアウト
;server 10.8.0.0 255.255.255.0
#ブリッジ設定
#OpenVPNのIP、サブネットマスク、クライアントに割り当てるスタートIP、エンドIP
server-bridge 192.168.1.251 255.255.255.0 192.168.1.252 192.168.1.253
#ユーザ権限の設定
user nobody
group nogroup

ブリッジ接続設定

sudo apt-get install bridge-utils
sudo cp /usr/share/doc/openvpn/examples/sample-scripts/bridge-st* /etc/openvpn/

bridge-startの変更・追加点

eth_ip="192.168.1.2" #eth0のIPアドレス
eth_broadcast="192.168.1.255"
gw="192.168.1.1"
route add default gw $gw #最終行に追加

bridge-stopがそのままだとダメだったので、末尾に追加

/etc/init.d/networking reload

IP forwardを有効にするために、/etc/sysctl.conf

net.ipv4.ip_forward=1

を追記する。

起動時にブリッジの設定が有効になるようにするため、/etc/init.dにスクリプトを作成。

#!/bin/sh

### BEGIN INIT INFO
# Provides:       bridge
# Required-Start: $network $remote_fs $syslog
# Required-Stop:  $network $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: Bridge for OpenVPN
### END INIT INFO

START_BRIDGE="/etc/openvpn/bridge-start"
STOP_BRIDGE="/etc/openvpn/bridge-stop"

case "$1" in
        start)
         echo -n "Starting Bridge"
         $START_BRIDGE
         ;;
        stop)
         echo -n "Stopping Bridge"
         $STOP_BRIDGE
         ;;
        restart)
         $STOP_BRIDGE
         sleep 2
         $START_BRIDGE
         ;;
        *)
         echo "Usage: $0 {start|stop|restart}" > 2
         exit 1
         ;;
esac

また、今作ったbridgeを実行後にOpenVPNを起動したいので、/etc/init.d/openvpnのINIT INFO部分を書き換える。

# Required-Start:    bridge $network $remote_fs $syslog
# Required-Stop:     bridge $network $remote_fs $syslog

書き換えたら、rc-updateを実行する

sudo update-rc.d bridge defaults
sudo update-rc.d openvpn defaults

クライアントの鍵作成と証明書発行

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
./build-key client

これも引数がCommon nameのデフォルト値となるため、今まで入れてきたCommon nameと被らない名前を入力する。

ファイアウォールの設定

ルータのファイアウォールでserver.confで指定したプロトコル(TCP/UDP)とポートをVPNのサーバになるマシンのIPへポートマッピング設定する。

クライアントの設定ファイル

/usr/share/doc/openvpn/examples/sample-config-files/client.conf
にある、設定ファイル例をコピーし、変更する。

dev tap0
;dev tun
remote my-server-1 1234 # VPNサーバのホスト名とポート番号
user nobody
group nogroup
ca ca.crt
cert client.crt
key client.key

my-server-1の部分は自分のホスト名かIPアドレスに書き換える。
caは認証局の作成で作った認証局の証明書。
cert,keyはクライアントの鍵作成と証明書発行で作った証明書ファイルと鍵ファイルのファイル名を指定する。

と、ここまで設定をしてクライアントとなるAndroid側の準備に取り掛かろうとすると、とても悲しいこと気にがついた。
現在のところAndroidではroot化しないとTAPでのOpenVPN接続はできないとい事がわかった。
Androidのフレームワークが対応していないということだ。

そうなると、AndroidのフレームワークがTAPのAPIをサポートし、そのサポートされたバージョンのファームがリリースされないといけない・・・
これはちょっと期待できなそうなので、そっとコマンドを叩いて終了した。

sudo /etc/init.d/openvpn stops
sudo /etc/init.d/bridge stop
sudo update-rc.d openvpn remove
sudo update-rc.d bridge remove

あと、/etc/sysctl.confのip forwardの設定もoffにした。

参考

Howto setup openvpn in bridge mode on debian

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください