SSブログ

BeagleBoard-xMをVPNサーバにしてみる [beagleboard]

BeagleBoard-xMにはUbuntu 12.04をインストールして,USB WiFiを使えるようにした

今回はこれをVPNサーバにしてみる.
プロトコルはPPTPが簡単らしいのだが,docomoのSPモードだと使えないのでL2TP/IPsecを使うことにする.あと,IPsecは事前共有鍵認証を使うことにする.

ではまず必要なパッケージとして,openswanとxl2tpdをインストールしてやる.

最初にopenswanのインストールだが,androidのICSにはバグがあってIPsecがつながらない.ただ,回避策はあって,openswanのソースにパッチを当ててビルドしてやればいい.

では,ソースとパッチのダウンロード.
wget http://download.openswan.org/openswan/openswan-2.6.38.tar.gz
wget http://people.redhat.com/pwouters/osw/openswan-2.6.38-android-ics-natoa.patch

ダウンロードしたら展開.
tar -xzvf openswan-2.6.38.tar.gz

ビルドに必要なツールをインストール.
sudo apt-get install build-essential libgmp3-dev gawk flex bison

そしたらパッチをあててビルド,インストールしてやる.
cd openswan-2.6.38/
patch -p1 < ../openswan-2.6.38-android-ics-natoa.patch 
sudo make ARCH=arm programs
sudo make ARCH=arm install

ちなみに,Openswanの最新バージョンは,2.6.39のようだ.2.6.39ならパッチは必要ないかもしれないが確認していないので分からない.

では,次にxl2tpdをインストール.
こちらは単純に,
sudo apt-get install xl2tpd

でOK.

そしたら,設定開始.
まずはカーネルパラメータの設定.
sudo vi /etc/sysctl.conf

以下を追記
###################################################################
# add settings
###################################################################
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
net.ipv4.conf.wlan0.send_redirects = 0
net.ipv4.conf.wlan0.accept_redirects = 0


そしたら設定値の反映.
sudo sysctl -p


次にopenswanの設定.
sudo vi /etc/ipsec.conf


元々ある記述のうち,config setupのprotostack=netkeyに変更するのと,conn ***以下を追記してやる.ファイル全体を示すと以下のようになる.
# /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
	protostack=netkey
	# Use this to log to a file, or disable logging on embedded systems (like openwrt)
	#plutostderrlog=/dev/null

# Add connections here

# sample VPN connection
# for more examples, see /etc/ipsec.d/examples/
#conn sample
#		# Left security gateway, subnet behind it, nexthop toward right.
#		left=10.0.0.1
#		leftsubnet=172.16.0.0/24
#		leftnexthop=10.22.33.44
#		# Right security gateway, subnet behind it, nexthop toward left.
#		right=10.12.12.1
#		rightsubnet=192.168.0.0/24
#		rightnexthop=10.101.102.103
#		# To authorize this connection, but not actually start it, 
#		# at startup, uncomment this.
#		#auto=add

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

conn L2TP-PSK-noNAT
	forceencaps=yes
	authby=secret
	pfs=no
	auto=add
	keyingtries=3
	ike=aes-sha1;modp3072       # ike phase1 の設定 (暗号化アルゴリズムは AES 、ハッシュアルゴリズムは SHA1 、Diffie-Hellman グループは 15 (3,072bit))
	phase2=esp                  # ike phase2 の設定 (セキュリティプロトコルは ESP)
	phase2alg=aes-sha1;modp3072 # ike phase2 の設定 (暗号化アルゴリズムは AES 、ハッシュアルゴリズムは SHA1 、Diffie-Hellman グループは 15 (3,072bit))
	rekey=no
	ikelifetime=8h
	keylife=1h
	type=transport
	left=10.0.1.100             # 自サーバの IPv4 アドレスを設定する。
	leftprotoport=17/1701
	right=%any
	rightprotoport=17/%any
	# 以下は iOS クライアント向けの設定。
	dpddelay=40
	dpdtimeout=130
	dpdaction=clear

ちなみに,「left=10.0.1.100 # 自サーバの IPv4 アドレスを設定する。」の部分はあくまで例なので,自分のサーバのIPアドレスを設定してやる.

IPsecの事前共有鍵(pre-shared key)の設定.
sudo vi /etc/ipsec.secrets

ファイルがない場合は作成してやる.で,以下を追記してやる.
10.0.1.100 %any: PSK "hogehoge"

ここで,先頭のIPアドレスは上記で設定した自分のサーバのIPアドレスだ.また,hogehogeが事前共有鍵になる.なのでファイルのアクセス権を変更しておく.
sudo chmod 600 /etc/ipsec.secrets


ここまでできたら,IPsecを再起動.
sudo /etc/init.d/ipsec restart


設定の確認をしてみる.
sudo ipsec verify

N/A, WARNINGとDISABLEDは気にしなくていいらしいが,FAILEDが出るとNGだ.だが,openswanをソースからビルドすると,「Two or more interfaces found, checking IP forwarding」の部分がFAILEDと出ることがあるようだが気にしなくていいらしい.
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.2.0-51-omap (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]
Two or more interfaces found, checking IP forwarding            [OK] <--- FAILEDと出るかも
Checking NAT and MASQUERADEing                                  [OK]
Checking for 'ip' command                                       [OK]
Checking /bin/sh is not /bin/dash                               [WARNING]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]


次にxl2tpdの設定.
sudo vi /etc/xl2tpd/xl2tpd.conf

以下を追記してやる.
[global]

[lns default]
ip range = 10.0.1.201 - 10.0.1.210
local ip = 10.0.1.100
length bit = yes
refuse chap = yes
require authentication = yes
name = l2tp
pppoptfile = /etc/ppp/l2tpd-options

ここで,ip rangeはVPN接続してきたクライアントに割り当てるIPアドレスの範囲で,local ipは自分のサーバのIPアドレスだ.これもあくまで例なので,自分の環境にあわせて設定してやる.

pppの設定.
sudo vi /etc/ppp/l2tpd-options

ファイルが無いので新規作成し以下を記入する.コメントがあるとうまく動かないようなので削除すべし.
name l2tp           # /etc/xl2tpd/xl2tpd.conf で設定した name と合わせる
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
ms-dns 10.0.1.1     # DNS サーバの IPv4 アドレス    
proxyarp
nodefaultroute
lock
nobsdcomp 
mtu 1280
mru 1280


chap認証設定.
sudo vi /etc/ppp/chap-secrets

以下を追記
hogehoge	l2tp	"fugafuga"		*

ここで,hogehogeはUserName, fugafugaはパスワードになる.

ここで,いったんxl2tpdの再起動.
sudo /etc/init.d/xl2tpd restart


ファイヤーウォールでUDP/500とUDP/4500を通すように設定.
sudo ufw allow 500/udp
sudo ufw allow 4500/udp


ESP を通すための設定と,xl2tpd を IPsec 以外から使えないようにする設定と,LAN の NAT をさせる設定とを適切な場所に追加.
sudo vi /etc/ufw/before.rules

*filter に対応する COMMIT の手前に(COMMITの直前に)以下を記載.
# for ESP protocol of IPsec
-A INPUT -p 50 -j ACCEPT
# restricts l2tp to be used under ipsec
-A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT
-A INPUT -p udp -m udp --dport l2tp -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -p udp -m policy --dir out --pol ipsec -m udp --sport l2tp -j ACCEPT
-A OUTPUT -p udp -m udp --sport l2tp -j REJECT --reject-with icmp-port-unreachable


次に*filter の COMMIT の後に以下を記載.
# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic from 192.168.222.0/24
-A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't be processed

COMMIT
# end of nat rules


フォワーディングはデフォルト許可に設定.
sudo vi /etc/default/ufw

以下の設定に変更.
DEFAULT_FORWARD_POLICY="ACCEPT"


ufwを有効化.
sudo ufw enable


IPsec自動起動設定.
sudo update-rc.d ipsec start 90 2 3 4 5 . stop 1 0 1 6 .


あとは,ルーターの設定として,UDP/500とUDP/4500を自分のサーバに転送するように設定してやればOK.


これで完了.
お疲れさまでした.


参考サイト
いっぱいあるけど,特に参考にしたのは以下のサイトです.
Debian GNU/Linux で L2TP / IPsec を使用する VPN サーバを設定する (サーバ側で NAPT しない場合) – Open the Next
○○的な気まぐれ日記 » Androidから自宅サーバー(ubuntu12.04)にアクセスする
VPNでandroidと自宅LANがつながった | 人生崖っぷち

先人に感謝します.

nice!(0)  トラックバック(0) 
共通テーマ:日記・雑感

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。