Raspberry PiをVPNサーバにしてAndroidから繋ぐ

kiuyu

2013/05/31

2013年12月22日追記

その後、SoftEther VPNで環境を作り直しました。手順は別ページに記載しています。

やりたいこと

Raspberry PiをL2TP/IPSecなVPNサーバに仕立てて、AndroidからVPN経由で出先から自宅のネットワークに繋ぎたい。ヤマハのRTを買おうかと思ったが高いのでRaspberry PiをVPNサーバに仕立てる。

環境

手順

OS入れる

使うディストリビューションはRaspbian。インストールというかddしてよしなに設定や更新する。DHCPではなく静的にIPアドレスを割り当てること。

パッケージインストール

# apt-get install lsof openswan xl2tpd

openswanがX.509証明書が云々と尋ねてくるが、よくわからんのでNoにした。証明書買うのもお金がかかるし。。。

sysctrl.conf変更

以下のような具合に追記する。

##############################################################
# VPN
net.ipv4.ip_forward=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.eth0.send_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.lo.accept_redirects=0

追記後に反映するためsysctl -pする。

# sysctl -p

openswanの設定

/etc/ipsec.conf開き、以下のように編集。めんどうなのとよくわからないのでほぼサンプルのまま。

/etc/ipsec.conf - Openswan IPsec configuration file
# This file:  /usr/share/doc/openswan/ipsec.conf-sample
#
# Manual:     ipsec.conf.5

version 2.0     # conforms to second version of ipsec.conf specification

# basic configuration
config setup
       # Do not set debug options to debug configuration issues!
       # plutodebug / klipsdebug = "all", "none" or a combation from below:
       # "raw crypt parsing emitting control klips pfkey natt x509 dpd private"
       # eg:
       # plutodebug="control parsing"
       # Again: only enable plutodebug or klipsdebug when asked by a developer
       #
       # enable to get logs per-peer
       # plutoopts="--perpeerlog"
       #
       # Enable core dumps (might require system changes, like ulimit -C)
       # This is required for abrtd to work properly
       # Note: incorrect SElinux policies might prevent pluto writing the core
       dumpdir=/var/run/pluto/
       #
       # NAT-TRAVERSAL support, see README.NAT-Traversal
       nat_traversal=yes
       # exclude networks used on server side by adding %v4:!a.b.c.0/24
       # It seems that T-Mobile in the US and Rogers/Fido in Canada are
       # using 25/8 as "private" address space on their 3G network.
       # This range has not been announced via BGP (at least upto 2010-12-21)
       virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
       # OE is now off by default. Uncomment and change to on, to enable.
       oe=off
       # which IPsec stack to use. auto will try netkey, then klips then mast
       protostack=auto
       # Use this to log to a file, or disable logging on embedded systems (like openwrt)
       #plutostderrlog=/dev/null

# Add connections here

conn L2TP
       keyingtries=0
       type=transport
       compress=yes
       authby=secret
       forceencaps=yes
       pfs=no
       auto=add
       ike=aes-sha1;modp3072
       phase2=esp
       phase2alg=aes-sha1;modp3072
       rekey=no
       salifetime=3h
       ikelifetime=1h
       left=192.168.1.20 # Raspberry PiのIPアドレスにする
       leftprotoport=17/1701
       right=%any
       rightprotoport=17/%any

さらに/etc/ipsec.secretsを編集し、事前共有鍵を設定する。

# 192.168.1.20はRaspberry PiのIPアドレス
192.168.1.20 %any: PSK "事前共有鍵とする文字列"

UTF-8で保存したら共有鍵は日本語でも接続できたが、クライアントによってハマりそうだなあ。

これで設定は終わりなのでopenswanをリスタートする。

# service ipsec restart

ベリファイをかけてFAILEDが無いことを確認。

# 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.37/K3.6.11+ (netkey)
Checking for IPsec support in kernel                        	[OK]
 SAref kernel support                                       	[N/A]
 NETKEY:  Testing XFRM related proc values                  	[OK]
	[OK]
	[OK]
Checking that pluto is running                              	[OK]
 Pluto listening for IKE on udp 500                         	[OK]
 Pluto listening for NAT-T on udp 4500                      	[OK]
Checking for 'ip' command                                   	[OK]
Checking /bin/sh is not /bin/dash                           	[WARNING]
Checking for 'iptables' command                             	[OK]
Opportunistic Encryption Support                            	[DISABLED]

xl2tpdの設定

/etc/xl2tpd/xl2tpd.confを編集してxl2tpdを設定する。ip rangeは環境に応じて変更、local ipはRaspberry PiのIPアドレスにする。

[global]
port = 1701

[lns default]
ip range = 192.168.1.201 - 192.168.1.210
local ip = 192.168.1.20
length bit = yes
refuse chap = yes
require authentication = yes
pppoptfile = /etc/ppp/l2tpd.pppopt

xl2tpdをリスタートする。

# service xl2tpd restart

pppoptfileの作成

先のxl2tpd.confで指定したpppoptfile (/etc/ppp/l2tpd.pppopt)を作成する。

# vi /etc/ppp/l2tpd.pppopt

内容は以下の具合。ms-dnsにはDNSを指定する。ここではルータのIPアドレス(192.168.1.1)を指定しているが、プロバイダから指示されたDNSやGoogleのDNS(8.8.8.8)でもVPN接続時に名前解決できた。

asyncmap 0
auth
crtscts
lock
modem
debug
proxyarp
lcp-echo-interval 180
lcp-echo-failure 3

refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2

ms-dns 192.168.1.1

pppd認証の設定

/etc/ppp/chap-secretsを編集してユーザー名、パスワードを設定し、ppp認証できるようにする。

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
UserName * Password *

ユーザー名やパスワードにダブルクォーテーションは不要。

サービス自動起動の設定

openswanとxl2tpdが自動起動するようにする。

# insserv ipsec
# insserv xl2tpd

以上でRaspberry Piの設定は終了。

ポートマッピング

ルータの設定を変更し、UDPの500番、4500番、およびESPをRaspberry PI(192.168.1.20)にマッピングする。

クライアントからのアクセス

クライアント(ISW11K)を設定し接続する。自宅のグローバルIPアドレスを調べておく。

  1. 設定→無線とネットワーク→VPN設定→VPNの追加をタップ
  2. L2TP/IPSec PSK VPNを追加をタップ
  3. VPN名を「自宅」に設定
  4. VPNサーバーの設定を自宅のグローバルIPアドレスに設定
  5. IPSec事前共有鍵の設定を/etc/ipsec.secretsで指定した文字列に設定

上記を設定して保存。

保存後、VPNの「自宅」をタップすると「自宅に接続」というダイアログが表示されるので、ユーザー名とパスワードに/etc/ppp/chap-secretsで設定した値を指定し接続する。つながらないときは、自宅のWiFi?につないでないか?と/var/log/syslogを眺めてみる。syslogに何も出てないようであれば、ルータに弾かれている可能性が大。

あとは自宅ネットワークに繋がれていることを確認(自宅サーバに繋いでもいいし、ブラウザでグローバルIPを確認できるページに繋げば自宅のIPが表示されるし)して終了。

自宅のグローバルIPアドレス

考えてみると変動するよな。固定IPじゃないし。後でDDNSサービスを設定しよう。