Top > AndroidスマートフォンからLinuxサーバにVPN接続する

キーワード: Android VPN L2TP IPsec PSK CentOS Linux 設定 サーバ


やりたいこと

Androidスマートフォンから自宅のファイルサーバ(cifs/smb)に直接アクセスしたい.

必要なものと条件

openswan.logo.jpg
  • Android端末
    • OS Version 2.3.4 (Xperia acro SO-02Cを使用)
  • ネットワーク環境
    • l2tpサーバにはローカルIPが乗っていて, NATで外部と通信する環境が前提.
    • グローバルIPの乗っているNATルータにて, espプロトコルをl2tpサーバにForwardできること.
xl2tpd.gif
  • l2tpサーバ
    • CentOS6
    • xl2tpd (xl2tpd-1.3.1-1.el6)
    • openswan (openswan-2.6.32-9.el6, epelリポジトリより)
    • lsof (ipsecのテスト時に必要)

サーバ構築手順

必要なモノをいれる

# yum -y install xl2tpd
# yum -y install openswan --enablerepo=epel
# yum -y install lsof

ファイルを作成する

/etc/ipsec.conf

version 2.0

config setup
        protostack=netkey
        nat_traversal=yes
        virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
        oe=off

include /etc/ipsec.d/*.conf

/etc/ipsec.d/l2tp-psk.conf

conn L2TP-PSK-NAT
  rightsubnet=0.0.0.0/0
  forceencaps=yes
  also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
  authby=secret
  pfs=no
  auto=add
  keyingtries=3
  rekey=no
  ikelifetime=8h
  keylife=1h
  type=transport
  left=%defaultroute
  leftprotoport=17/1701
  right=%any
  rightprotoport=17/%any

/etc/ipsec.d/ipsec.secrets

: PSK "pass12345"

このパスワードは, Android側でVPNの追加をするときに使う.

/etc/xl2tpd/xl2tpd.conf

[global]

[lns default]
ip range = 192.168.1.220-192.168.1.225
local ip = 192.168.1.11
require chap = yes
refuse pap = yes
require authentication = yes
name = princovpn
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

/etc/ppp/options.xl2tpd

ipcp-accept-local
ipcp-accept-remote
ms-dns  192.168.1.254
ms-wins 192.168.1.254
netmask 255.255.255.0
persist
#noccp
auth
crtscts
idle 1800
mtu 1280
mru 1280
nodefaultroute
debug
lock
proxyarp
connect-delay 5000

MTU, MRUは環境に合わせて最大値を設定する.
1280ならどんな環境でも安心して接続できるので, 接続テストをしながら大きくしてゆくと良い.

CCPについて, オプション付きだとAndroidから接続したときログに

pppd[9963]: Unsupported protocol 'Compression Control Protocol' (0x80fd) received

と文句を言って正常な通信ができないため, noccp をコメントアウトした.
Androidのバージョンに依って変わってくるのかもしれない.

/etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client        server          secret                  IP addresses
princo             princovpn       "pass54321"     *

このclient/secretは, Android側でネットワークに接続をするときにユーザー名/パスワードとして使う.

OSの設定を変更する

/etc/sysctl.conf

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# 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

反映する.

# sysctl -p

起動とテスト

# service ipsec start
# service xl2tpd start
# chkconfig ipsec on
# chkconfig xl2tpd on
# ipsec verify

↓実行結果

Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                                 [OK]
Linux Openswan U2.6.32/K2.6.32-71.29.1.el6.x86_64 (netkey)
Checking for IPsec support in kernel                            [OK]
 SAref kernel support                                           [N/A]
 NETKEY:  Testing for disabled ICMP send_redirects              [OK]
NETKEY detected, testing for disabled ICMP accept_redirects     [OK]
Checking that pluto is running                                  [OK]
 Pluto listening for IKE on udp 500                             [OK]
 Pluto listening for NAT-T on udp 4500                          [OK]
Two or more interfaces found, checking IP forwarding            [OK]
Checking NAT and MASQUERADEing                                  [OK]
Checking for 'ip' command                                       [OK]
Checking /bin/sh is not /bin/dash                               [OK]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]

ルータの設定

下記のプロトコルとポートをl2tpサーバにForward設定する.

  • ESP
  • UDP 500
  • UDP 4500

Android側(VPNクライアント)の設定・接続方法

android.jpeg
  1. 設定
  2. 無線とネットワーク
  3. VPN設定
  4. VPNの追加
  5. L2TP/IPSec PSK VPNを追加
    • VPN名: すきな設定名
    • VPNサーバの設定: VPNサーバのグローバルIPあどれすまたはホスト名
    • IPSec事前共有キーの設定: /etc/ipsec.d/ipsec.secrets に書いた内容
  6. 保存
  7. VPN一覧からVPN設定名(ネットワークに接続します)をタップ
  8. ユーザ名, パスワードを入力(/etc/ppp/chap-secrets で書いた内容)
  9. 接続

VPN一覧のVPN設定名が「接続されています」になり, 画面の一番上にVPNアイコンが表示されれば成功.

VPNセッションの確立が成功すると, サーバ側には下記のログが出力される.

Feb  8 10:59:14 vpnserver xl2tpd[12109]: Connection established to xx.xx.xx.xx, 37741.
 Local: 41482, Remote: 16144 (ref=0/0).  LNS session is 'default'
Feb  8 10:59:14 vpnserver xl2tpd[12109]: Call established with xx.xx.xx.xx, Local: 56180, Remote: 48622, Serial: -1007334605
Feb  8 10:59:14 vpnserver pppd[13728]: pppd 2.4.5 started by princo, uid 0
Feb  8 10:59:14 vpnserver pppd[13728]: Using interface ppp0
Feb  8 10:59:14 vpnserver pppd[13728]: Connect: ppp0 <--> /dev/pts/3
Feb  8 10:59:17 vpnserver pppd[13728]: Deflate (15) receive compression enabled
Feb  8 10:59:17 vpnserver pppd[13728]: found interface eth1 for proxy arp
Feb  8 10:59:17 vpnserver pppd[13728]: local  IP address 192.168.1.11
Feb  8 10:59:17 vpnserver pppd[13728]: remote IP address 192.168.1.220

AndroidがVPNに接続されていると, すべてのグローバルIPとの通信も VPNサーバ経由になる.
VPNを通しての通信は, 通常と比べて25%減くらいの速度になる.


参考:


添付ファイル: fileandroid.jpeg 473件 [詳細] fileopenswan.logo.jpg 485件 [詳細] filexl2tpd.gif 489件 [詳細]

新規 編集 添付 名前変更 バックアップ   ホーム バックアップ リンク元   最終更新のRSS