DLNAの環境を整えたので、出先からAndroidを使ってメディア再生できるようにしてみる。
MediaTombのサーバを外部に公開するのはダメだと思うので、この際VPN環境を整えてみようと思う。
当初PPTPというプロトコルを使用したVPN環境整備が楽そうだったので、PPTPを使用していこうと思ったが、
これはどうも、クラックされていて脆弱性があるようだった。
そこで、IPSecを使用したVPN環境の構築をしていこうと思う。
しかし、IPSecについて調べていると、下のような記事を発見した。
この記事を読んで、やっぱり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にした。