さくらのVPSにOpenVPNを建ててAndroidから繋げるようにした

先日PPTP経由で接続する方法を書きましたが、実はSPモードの仕様でSPモード経由での接続が行えませんでした。
L2TP/IPsecなら接続できるということなのですが、こちらはAndroidのバグで特定バージョンから接続できないという不具合があるらしく、OpenVPNに方針変更しました。

OpenVPNは現在最新バージョンが2.3.0なのですが、試した人がまだ少なく詰まった時に調べるのが面倒なので
とりあえず枯れた2.2.2環境を作って見ることにしました。

公式からソースをダウンロードします。
CentOSならyum install openvpnでもいけるらしいです。

$ cd /usr/local/src
$ wget http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz
$ tar xzf openvpn-2.2.2.tar.gz
$ cd openvpn-2.2.2 ; pwd
$ ./configure
./configure で pamlibが無いというエラーが出た場合には yum install pam-devel する。
lzoで圧縮して通信する場合にはlzo-develもインストールしておきます。
$ sudo yum install lzo-devel.x86_64
$ ./configure
$ make 
$ sudo make install

設定ファイルを/etc/openvpn/にコピーします。
続けて認証局と証明書を作成します。
$ mkdir /etc/openvpn
$ ls -ld /etc/openvpn
$ cp -ip sample-config-files/server.conf /etc/openvpn/
$ cp -ip easy-rsa/2.0 /etc/openvpn/easy-rsa
$
$ cd /etc/openvpn/easy-rsa
$ . ./vars
$ ./clean-all
$ ./build-ca 
============================================================
Generating a 1024 bit RSA private key
…..++++++
……………………..++++++
writing new private key to ‘ca.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [KG]:JP
State or Province Name (full name) [NA]:TOKYO
Locality Name (eg, city) [BISHKEK]:Chiyoda
Organization Name (eg, company) [OpenVPN-TEST]:example.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:
Email Address [me@myhost.mydomain]:postmaster@example.com
============================================================

証明書の入力部分については適宜入力する。
この後の手順で作成する鍵についても同じ内容で作成すること。

サーバ用の鍵を作成。
$ ./build-key-server server

============================================================
Generating a 1024 bit RSA private key
………………………++++++
………++++++
writing new private key to ‘server.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [KG]:JP
State or Province Name (full name) [NA]:TOKYO
Locality Name (eg, city) [BISHKEK]:Chiyoda
Organization Name (eg, company) [OpenVPN-TEST]:example.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:client1
Email Address [me@myhost.mydomain]:postmaster@example.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: #空欄のまますすめる
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’JP’
stateOrProvinceName :PRINTABLE:’TOKYO’
localityName :PRINTABLE:’Chiyoda’
organizationName :PRINTABLE:’example.com’
commonName :PRINTABLE:’server’
emailAddress :IA5STRING:’postmaster@example.com’
Certificate is to be certified until Feb 14 10:48:11 2023 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
============================================================

同様にクライアント用の鍵とDiffie-Hellman鍵交換のパラメータを生成する。
とりあえずクライアント2台分作った。
$ ./build-key client1
$ ./build-key client2
$ ./build-dh

TLS-AUTH HMAC 共有鍵を生成する。
$ /usr/local/sbin/openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key


OpenVPNのサーバ側の設定を行う。
$ vi /etc/openvpn/server.conf 

port 1194
proto udp
dev tun
ca easy-rsa/keys/ca.crt #証明書は/etc/openvpnからの相対パスで指定する
cert easy-rsa/keys/server.crt
key easy-rsa/keys/server.key  # This file should be kept secret
dh easy-rsa/keys/dh1024.pem
server 192.168.2.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1" #すべての通信をVPN経由で行う
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client #VPNに接続したクライアント同士の通信を行う
keepalive 10 120
tls-auth easy-rsa/keys/ta.key 0 # This file is secret
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
client-to-client

OpenVPNサービスを起動する。
$ service openvpn start
$ chkconfig openvpn on

iptablesに設定を追加する。
$ iptables -A INPUT -p udp --dport 1194 -j ACCEPT
$ iptables -A INPUT -i tun+ -j ACCEPT
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -A FORWARD -i tun+ -j ACCEPT
$ iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
$ iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
$ iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
$
$ service iptables save
$ service iptables restart


クライアント用の設定を作成する。
client.ovpn というファイルをPC上で作成した。(※UTF-8で作成すること)
同じ証明書、鍵を使わない構成でクライアント毎に作成する。

client
tls-auth ta.key 1
dev tun
proto udp
remote [サーバアドレス] 1194
ca ca.crt
cert client1.crt
key client1.key
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3

Android端末のSDカードにopenvpnフォルダを作成し、下記ファイルをコピーする。

client.ovpn
ca.crt
client1.crt
client1.key
ta.key

Android端末にOpenVPN用のアプリをインストールする。
標準の設定ではOpenVPNはサポートされていないため、一昔前はroot環境必須だったが
今ではアプリのインストールだけでrootなしでも利用できる。

公式アプリもあるが、全ての通信をVPN経由で行う設定が見当たらなかったため下記のアプリを使用した。
おすすめのアプリは OpenVPN for Android ですがサーバ側ですべての通信をVPN経由で行うよう設定していれば公式アプリでも問題ありません。
公式アプリの OpenVPN Connect は定義ファイルをインポートする以外の設定が殆ど無く、また英語のみです。
OpenVPN for Android | Google Play
OpenVPN Connect | Google Play

openvpn1
右上のフォルダアイコンをタップし、SDカードのopenvpnにコピーした「client.ovpn」を選択する。
インポートが完了したら画面上のFDアイコンをタップし保存する。
本来はPCなどで接続確認済みの設定ファイルを利用することが推奨されている。

openvpn2
インポートした設定の名前部分をタップするとVPN接続を開始する。

openvpn3
接続に成功したがこのままではVPN用のローカル空間以外へのアクセスはVPN経由にならない。
一旦接続を中止し、設定から「規定の経路に使用」というチェックを行う。
また、DNSが設定されていないためこちらも手動で設定した。
※サーバ側の設定で経路やDNSの指定を行なっている場合には不要です。

openvpn4OpenVPN経由でのスピードテスト。
左はau LTEでの通信。右はOpenVPN経由だがPPTP経由に比べやや高い値となっている。

8796の人が設定を追記してくれました。
さくらのVPSにOpenVPNを建ててAndroidから繋げるようにした(パクり) : 8796.jp管理日誌

参考:
OpenVPNで外出先のMBAからさくらVPS通して自宅サーバにつなげる環境をつくるの巻 – kenjiskywalker no memo
OpenVPN を使って仮想LAN接続してみる | レンタルサーバー・自宅サーバー設定・構築のヒント



  • このエントリーをはてなブックマークに追加