2013年8月6日火曜日

Android端末でOpenVPNを使ってみよう

何やらRTX810でVPNを張ってRDP経由でゲームするのが流行っているという噂を 某所で聞きました.しかし,RTX810は高くて買えないという方も多いので はないでしょうか. そこで,RTX810を買えない方でも気軽に試せるオープンソースのVPNソフト, OpenVPNを用いたVPN環境をWindowsとAndroid端末間で作る方法を紹介してみよ うと思います.

ここで例に上げる環境は,以下の通りになるよう構成します.

  • LAN: 10.39.39.0/24
  • VPN: 10.3.9.0/24
  • Windows: LAN - 10.39.39.31, VPN - 10.3.9.1
  • Android: LAN - 10.39.39.33, VPN - 自動割当

OpenVPNのインストール

サーバ(Windows)側

まずはOpenVPNサーバ環境をWindows側に準備します.公式ページでWindows用のイン ストーラが用意されているので,これをダウンロードしインストールしてくだ さい.
http://openvpn.net/index.php/open-source/downloads.html
インストール時に,「OpenVPN RSA Certificate Management Scripts」もイン ストールするようチェックするのを忘れないでください.

クライアント(Android)側

次に,クライアント環境をAndoroid側に準備します.OpenVPNはGoogle Playに て公式に配信されているため,これをインストールします.
https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ja
残念ながら,古いAndroidでは利用できないようです.(私は4.0以降の端末で動作確認しました)

OpenVPNでは,共通鍵暗号と公開鍵暗号の両方をサポートしていますが, Android版では公開鍵暗号のみをサポートしているため,こちらを利用します.

鍵生成の設定

OpenVPNの公開鍵生成の支援ツールは,C:\Program Files\OpenVPN\easy-rsa以 下にインストールされています.まずeasy-rsaディレクトリごとデスクトップ などにコピーし,メモ帳などでeasy-rsa\vars.bat.sampleの 以下の部分を環境に合わせて編集,vars.batとして保存します.

set KEY_COUNTRY="US"
set KEY_PROVINCE="CA"
set KEY_CITY="SanFrancisco"
set KEY_ORG="Fort-Funston"
set KEY_EMAIL="me@myhost.mydomain"
set KEY_OU="MyOrganizationalUnit"

今回の環境では,以下のように定義しなおしました.

set KEY_COUNTRY="JP"
set KEY_PROVINCE="Kanagawa"
set KEY_CITY="Kawasaki"
set KEY_ORG="Hachunet"
set KEY_EMAIL="phenomer@g.hachune.net"
set KEY_OU="Hachunet"

鍵生成

管理者権限でcmd.exeを開き実際に鍵生成スクリプトを実行します. build-*実行時にCommonNameとNameを問い合わせられた際には,それぞれの鍵 に適した名前を入力してください. また,buikd-key-serverとbuild-keyを実行する際に,以下のように問い合わ せがありますが,これは共にyとしてください.

  • Sign the certificate? [y/n]
  • 1 out of 1 certificate requests certified, commit? [y/n]
> cd \Program Files\OpenVPN\easy-rsa
> init-config
> vars
> mkdir keys
> clean-all
> build-ca
> build-key-server server
> build-key android
> build-dh

以上の作業で,それぞれの端末に必要な鍵ファイルの生成ができました. OpenVPNの実行に必要なファイルは以下の表のとおりです.

ファイル名必要とするホスト
ca.crtサーバ,クライアント
dh2048.pemサーバ
server.crtサーバ
server.keyサーバ
android.crtクライアント
android.keyクライアント

鍵生成まわりは,いろいろとハマりどころが多いように感じるので, 失敗した場合はドキュメント やエラーメッセージをよく読んでやり直してみてください.

サーバ(Windows)側の準備

メモ帳等を利用し,設定ファイルserver.ovpnを記述します. サーバ側の設定ファイルは,以下のようになります.

port  1194
proto udp
dev   tun
ca         ca.crt
cert       server.crt
key        server.key
dh         dh2048.pem

server   10.3.9.0 255.255.255.0
ifconfig 10.3.9.1 255.255.255.0

comp-lzo
keepalive 10 60
ping-timer-rem
persist-key
persist-tun
max-clients 5

この設定ファイルを保存したフォルダ内に,先ほど生成した鍵ファイルのうち サーバ側で必要なものをまとめて入れておいてください.

クライアント(Android端末)側の準備

Android用OpenVPNの設定は,以下のように記述します. 通常のOpenVPNの設定ファイルと異なる点として,次のようなタグを用い鍵ファイルの内容を全て 設定ファイル内に記述しなければならない点があります.

  • <ca> - ca.crt
  • <cert> - android.crt
  • <key> - android.key
client
dev tun
proto udp
remote 10.39.39.31 1194
persist-key
persist-tun
ns-cert-type server
comp-lzo

<ca>
-----BEGIN CERTIFICATE-----
MIIE6DCCA9CgAwIBAgIJAI7WSDBm6otGMA0GCSqGSIb3DQEBCwUAMIGoMQswCQYD
VQQGEwJKUDERMA8GA1UECBMIS2FuYWdhd2ExETAPBgNVBAcTCEthd2FzYWtpMREw
DwYDVQQKEwhIYWNodW5ldDERMA8GA1UECxMISGFjaHVuZXQxFDASBgNVBAMTC0hh
Y2h1bmV0IENBMRAwDgYDVQQpEwdFYXN5UlNBMSUwIwYJKoZIhvcNAQkBFhZwaGVu
b21lckBnLmhhY2h1bmUubmV0MB4XDTEzMDgwNjA3MjgyM1oXDTIzMDgwNDA3Mjgy
M1owgagxCzAJBgNVBAYTAkpQMREwDwYDVQQIEwhLYW5hZ2F3YTERMA8GA1UEBxMI
S2F3YXNha2kxETAPBgNVBAoTCEhhY2h1bmV0MREwDwYDVQQLEwhIYWNodW5ldDEU
MBIGA1UEAxMLSGFjaHVuZXQgQ0ExEDAOBgNVBCkTB0Vhc3lSU0ExJTAjBgkqhkiG
9w0BCQEWFnBoZW5vbWVyQGcuaGFjaHVuZS5uZXQwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQChYUPyhc0vD1OVa3RU1wtbPUYDZXxQuMKTv9wiuIp60Eep
keR7CpolWNDxsksptUNAk0MIpc6t+SuBw80Kx6uLe4MeEulPsZ9ztG92OZ7k28cf
ufoOcxFSbnbJlwyhhHkjRMjxw/XL06gL1b/DakjfW/yW3LBXL4pn2ZFajGBapw48
2Z76mq/O21RiXMYy1LCRcYqhAGsC5TPHeXHRPecwPOFfO/YvnhKquuSxe06/hIvC
4ceJ9/jQ1tK8zFhA2TGgv2ae3VDdurinWiO0I9omzd7JYr/xq9XrGP2Zqujbp45H
KLzn8hCo83e/zj6zyzUOlwqYZu6FhtdV5XP2isVRAgMBAAGjggERMIIBDTAdBgNV
HQ4EFgQUdKavhZG6LzXHLOUrVP2M+bjSYh0wgd0GA1UdIwSB1TCB0oAUdKavhZG6
LzXHLOUrVP2M+bjSYh2hga6kgaswgagxCzAJBgNVBAYTAkpQMREwDwYDVQQIEwhL
YW5hZ2F3YTERMA8GA1UEBxMIS2F3YXNha2kxETAPBgNVBAoTCEhhY2h1bmV0MREw
DwYDVQQLEwhIYWNodW5ldDEUMBIGA1UEAxMLSGFjaHVuZXQgQ0ExEDAOBgNVBCkT
B0Vhc3lSU0ExJTAjBgkqhkiG9w0BCQEWFnBoZW5vbWVyQGcuaGFjaHVuZS5uZXSC
CQCO1kgwZuqLRjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB1hZnf
UdGllXFPSKp80IT5B0uwV1TGy2ixw9WdVQGPnB/GMgxEHUaoc3ctdKjYcis7fxzf
aDMCgt8/GgxsG1zGwmSYDxpjK+0VOSi6uAb6hzWamPggSIV9Dz237mrPMV+eJMcC
NoTiX4oD07tMkvWMC2FAOTaY7ARBiXBnI4qUrPVT+HxL2AdihmOIn4BrCLfUg1RK
8ptsOP1qNP2WBjouh37wb+TlvfzTwFi2JcyQw8lpdL3qmLdkBtasYzo4IE9o+rDr
9C9tHyLRe/itvGwU/RWUKG0MgQMIWN1gKmhuzxoHiOhT9NmU3F5g6vYSYT0akWRi
qbpxmVm5yJAo9kSL
-----END CERTIFICATE-----
</ca>

<cert>
-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBqDELMAkGA1UEBhMCSlAx
ETAPBgNVBAgTCEthbmFnYXdhMREwDwYDVQQHEwhLYXdhc2FraTERMA8GA1UEChMI
SGFjaHVuZXQxETAPBgNVBAsTCEhhY2h1bmV0MRQwEgYDVQQDEwtIYWNodW5ldCBD
QTEQMA4GA1UEKRMHRWFzeVJTQTElMCMGCSqGSIb3DQEJARYWcGhlbm9tZXJAZy5o
YWNodW5lLm5ldDAeFw0xMzA4MDYwNzMwMTNaFw0yMzA4MDQwNzMwMTNaMIGkMQsw
CQYDVQQGEwJKUDERMA8GA1UECBMIS2FuYWdhd2ExETAPBgNVBAcTCEthd2FzYWtp
MREwDwYDVQQKEwhIYWNodW5ldDERMA8GA1UECxMISGFjaHVuZXQxEDAOBgNVBAMT
B2FuZHJvaWQxEDAOBgNVBCkTB2FuZHJvaWQxJTAjBgkqhkiG9w0BCQEWFnBoZW5v
bWVyQGcuaGFjaHVuZS5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDaPA6/FlqlL6gbz/r1AzBF+VazenL6WHV2NkcPd1Fj0HUdowGaQR8E23rzN0dg
wRkcRIp86dTMkPVNhpvp3HE6ECcsW6LaskrIqXLZPkx5n9iVGvM0YPVY8zQkCM5u
UhHQjDPaJry9fo58nVr1YO8jFB7p0AxbZOyqVxKpsaZ49UOzLUTGIgP6QoqBGuR2
YNmd/7OE+pG7A/m912u8G5CZ3XHoDAUUh0nazn4ob6PTGb0csZGjdhNJoOsIIQcV
h0A3slgRlCMiYKLYCKSXpvrvo3vwtJP3Fq3coU0dytriPJKrX6R6NSclVl7/cO4J
nXZCuC3xXJNcADYuaKvawvqbAgMBAAGjggFfMIIBWzAJBgNVHRMEAjAAMC0GCWCG
SAGG+EIBDQQgFh5FYXN5LVJTQSBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0O
BBYEFCfOnKmBT1kX72NW//8iRzOCA1M+MIHdBgNVHSMEgdUwgdKAFHSmr4WRui81
xyzlK1T9jPm40mIdoYGupIGrMIGoMQswCQYDVQQGEwJKUDERMA8GA1UECBMIS2Fu
YWdhd2ExETAPBgNVBAcTCEthd2FzYWtpMREwDwYDVQQKEwhIYWNodW5ldDERMA8G
A1UECxMISGFjaHVuZXQxFDASBgNVBAMTC0hhY2h1bmV0IENBMRAwDgYDVQQpEwdF
YXN5UlNBMSUwIwYJKoZIhvcNAQkBFhZwaGVub21lckBnLmhhY2h1bmUubmV0ggkA
jtZIMGbqi0YwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgeAMA0GCSqG
SIb3DQEBCwUAA4IBAQBwbK5ZTfiM6Ce8wbfPeU6RSzswiY9LypvR7LFrbufYwiNt
ptWJVR9zG5JKzPIthgEesjEyhlucaPfReCfox8+2uADDjjTIr8aXO/UgeuPz06X7
os6an6KV/czSBspA3XVn6mrPaixaNVHUluPDKQlfinW8LjZdE1dcHHSsF79NBIeo
x1LLjMl9avGntkAV1WmUdaE+atNgeGYwJzBV9gqmWX01StIb3hsVSCINGu85Woch
2YP8N0UM52LXbgXPy6Jnpy80GfoaXjxNI/+xtmnQfzrm8OisKx+HWdaBjFE6lOtR
DtHKIm3/sL5Dj3nAiiDw4xyuFqTIZ9Di7ZAjQ15E
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDaPA6/FlqlL6gb
z/r1AzBF+VazenL6WHV2NkcPd1Fj0HUdowGaQR8E23rzN0dgwRkcRIp86dTMkPVN
hpvp3HE6ECcsW6LaskrIqXLZPkx5n9iVGvM0YPVY8zQkCM5uUhHQjDPaJry9fo58
nVr1YO8jFB7p0AxbZOyqVxKpsaZ49UOzLUTGIgP6QoqBGuR2YNmd/7OE+pG7A/m9
12u8G5CZ3XHoDAUUh0nazn4ob6PTGb0csZGjdhNJoOsIIQcVh0A3slgRlCMiYKLY
CKSXpvrvo3vwtJP3Fq3coU0dytriPJKrX6R6NSclVl7/cO4JnXZCuC3xXJNcADYu
aKvawvqbAgMBAAECggEAGWTnqmClh5c2DpZy81O9qEbNSfEzs+HbOTgzqJ8Pv3eg
SSSQqSxuuZf4hJioG6Acled73fEvq+YqRS0ms13NZx4+ELFRD/WzMgpVrOXM7FIn
V6JdLnkh04npRVApBTlTjVrjJb1gNQSm++UrkmYHLaPHvRlSdsgVqfSb3VcoseZR
Q0RTTm6iAx0+7fFUJg+rPfhtDpKCPdIOSPXksTObts+7ErWDGlr9DglIuJqUSo/Y
crPpkk8gZp1X6bJNS+glxJtwvXP0P2pikQIqKwM2MNgjRxr4fGtoD50LwC6N068o
ZSXKGOR+miw/5u+KJySdbGNlu5AbbIkeJtUEbPC2sQKBgQDz7pLhGCB1dw6Ga+Ox
wwxuAApPIBpywxHesEF06dQFITXs60Xm4LWmUAXdCjFO4NMQ0Fl6I9ozP1S7hQur
Qkds76dx9VJg6NkBwy/Ncma5oADjBi3hRbN6sO6MKBvqlF9nm8guR4dn5ZhoyO1v
uBnmvMOlIZzY88VlUf2PHPSuHwKBgQDlCAYx54vHylP49w/I19v/MzgX9OcTegz1
JxewFmpKvEgehNgvQpYbSIGjZ5UctoSbslDU47B2gb75ocI1JXIfhpNHkNqCZZ5j
zdtaKSp2NurEcop4tJ0f3h2o8zBhwrgsDsegIwP4XJVF7xjF/+ohLj6Vmk/Xhhaa
4hYBWansBQKBgQCbdXVoPT8afZjlNEc1mBAI3r+zM8uHTijKWlwtDYSRDFxYtIyl
GprJ9n/2IjPQiFobgh00STsbpAX1SFJqf+ATXhzB9M3ecycyB1okvf8X2BAYn2yI
ACrlS3OMIVfBRXQUDOUkEXQLU/iw9zTTGWpwcebiC6zxW1J3Qyysk5CgkwKBgGDa
8tu54tf7zWU0/hzehG+49ljTPcFz1PT7sj3KTOsMEqetYEskKpyhHgm/bUS2PwAk
+Z/+JgsHtX6WFK4rBsckPzZ9oJqSZNgqH0BStl1FviSTl9GR9/yZDwv6xBQjp4Ui
PvOOu0gVxx7LDTv2jMm5Z8gWePtY/khDojCx/XUNAoGAHEZ3i2mBT0/PPTbHdrK7
UkBMEZdXgVfwWkN7pDz18hqH2e5c0jX9BREd3DA6PLs9tUkwmw+acvbt9B3/igYl
pGwHdrIntfbDeVz2EoYXp/slEHHE0g6Gws36nIIy+2NKFIh/PfFWG+P/ylMwoek5
TgEVSiKmUDWPP7G8JbTQSp4=
-----END PRIVATE KEY-----
</key>

サーバ側の起動

サーバ側では,コマンドプロンプトを管理者権限で実行し,以下のように openvpnコマンドを実行します.

> openvpn server.ovpn

クライアント側の起動

OpenVPN Connectアプリを起動し,メニューから「Import Profile from SD card」を選択,先ほどコピーした設定ファイルandroid.ovpnを開きます.する と,「Connect」ボタンが出てくるので,これをタップします.

正しく接続が確立できると,以下のような画面になります.

また,サーバ側には以下のようにPeer Connection Initiatedと出るはずです.

Tue Aug  6 16:42:55 2013 10.39.39.32:48589 [android] Peer Connection Initiated with [AF_INET]10.39.39.32:48589

その他の設定

後はインターネット接続に利用しているルータ側で, UDP 1194番ポートへの通信をサーバ側に転送するよう設定し,クライアント側の設定をそのサーバのアドレスに変更すれば,インター ネット経由のVPNを介しWindowsマシンに安全にアクセスすることができるように なるはずです. 合わせて,Dynamic DNSの設定などもおこなうと,より便利になるかもしれま せん.

参考