ご注意下さい
この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。
前回の記事でL2TP/IPsec(openswan/xl2tpd)はAndroid(ICS)かiPhoneの同時利用は厳しいことがわかりました。
そこでOpenVPNに辿り着いたのですが、root化必須なものが多いんですね。
root化不要にこだわって探してみましたが、ありました。
OpenVPN Client。フリー版もあります。
今回は設定と性能ではまったので設定情報も載せることにします。
まずはOpenVPNのダウンロード。
各種証明書を作成します。
詳細は「VPNサーバー構築(OpenVPN) - CentOSで自宅サーバー構築」に譲ります。わかりやすいです。
# cd /etc/openvpn/easy-rsa/
# chmod 755 build-*
# vi vars <-- KEY_COUNTRYからKEY_EMAILまで編集
# source ./vars
# ./build-ca
# cp -p keys/ca.crt /etc/openvpn/.
# ./build-key-server server
# cp -p keys/server.crt /etc/openvpn/.
# cp -p keys/server.keys /etc/openvpn/.
# ./build-dh
# cp -p keys/dh1024.pem /etc/openvpn/
# openvpn --genkey --secret /etc/openvpn/ta.key
# cd /etc/openvpn; chmod 600 *.key
# cd /etc/openvpn/easy-rsa/
# ./build-key-pass android
設定ファイルは以下のようにtunモードで設定します。
port 1194 proto udp dev tun ★ルーティングモードの指定 ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh1024.pem server 192.168.50.0 255.255.255.0 ★VPNネットワークのネットワークを指定 push "route 192.168.xx.0 255.255.255.0" ★不要かも。VPNサーバの接続しているLANの指定 push "dhcp-option DNS 192.168.xx.xxx" ★DNSサーバの指定 push "redirect-gateway def1 bypass-dhcp" ★android側のデフォルトゲートウェイをVPNサーバ側に向ける keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status /var/log/openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log verb 0
実は最初はtapモード(ブリッジ接続モード)で構築したのですが素のandroidではブリッジ接続はサポートされていないようで接続出来ませんでした。今回はルーティングモードで構築をします。
続いてネットワーク関連の設定で、まずはIPフォワードの設定です。
/etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # Controls IP packet forwarding net.ipv4.ip_forward = 1 # Controls source route verification net.ipv4.conf.default.rp_filter = 1 # Do not accept source routing net.ipv4.conf.default.accept_source_route = 0 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 # Controls whether core dumps will append the PID to the core filename # Useful for debugging multi-threaded applications kernel.core_uses_pid = 1 # Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Controls the maximum size of a message, in bytes kernel.msgmnb = 65536 # Controls the default maxmimum size of a mesage queue kernel.msgmax = 65536 # Controls the maximum shared segment size, in bytes kernel.shmmax = 4294967295 # Controls the maximum number of shared memory segments, in pages kernel.shmall = 268435456 # for IPSec net.core.xfrm_larval_drop = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.eth1.send_redirects = 0 net.ipv4.conf.eth1.accept_redirects = 0
NATの設定も。
/etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Oct 29 13:46:52 2012 *nat :PREROUTING ACCEPT [4059:1968595] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A POSTROUTING -s 192.168.50.0/24 -o br0 -j MASQUERADE COMMIT # Completed on Mon Oct 29 13:46:52 2012 # Generated by iptables-save v1.3.5 on Mon Oct 29 13:46:52 2012 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [346:53022] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -i eth1 -j ACCEPT -A RH-Firewall-1-INPUT -i ppp0 -j ACCEPT -A RH-Firewall-1-INPUT -i tun0 -j ACCEPT ...
ここではまったのは前回のL2TP/IPsecでbridge-utilsをインストールしたのですが、br0というeth0をブリッジしたインタフェースが出来ていました。実際にはbr0からパケットが出ていたのですがeth0を指定しておりNATがかからない状況に…。
続いてサーバー側からCA証明書(/etc/openvpn/ca.crt)、クライアント証明書(/etc/openvpn/easy-rsa/keys/android.crt)、クライアント秘密鍵(/etc/openvpn/easy-rsa/keys/android.key)、TLS認証鍵(/etc/openvpn/ta.key)をクライアント側へ持ち込みます。
Xperia SXをUSB接続し、当該ファイル群をXperia SXに移送します。
続いてAndroid側での作業となります。OpenVPN Clientを開いて定義をしていきます。
まずはAuth.タブ。Sertification authorityにはca.crtを、Certificateにはandroid.crtを、Private keyにはandroid.keyを指定します。
続いて、Securityタブ。Key fileにta.keyを指定します。
OptionsタブでDNSサーバの指定や圧縮の指定など。
これで一通り完了なので早速androidから接続してみます。
接続後スループットを測定したのですが…。低速すぎる…。300kbpsとは…。
いろいろ調べてみたところMTU値を調整すればいいというが判明しました。
/etc/openvpn/server.confに以下の2行を追加します。
#Link link-mtu 1400 #mssfix 1280
するとopenvpn client側でMTU値がサーバ側とクライアント(android端末)で違うよ、とワーニング出力されたので、
以下のように設定します。
するとスループットが十分に満足できる値になりましたのでめでたし、めでたし。
これで中国からブロックされてしまうサイト(facebook/twitterなど)の閲覧やDoCoMoにブロックされてしまうサイトの閲覧が可能になりますー。
(何に使うんだか…ww)