スマホから家のPCにリモートアクセスしたく、ためしにVM上のLinuxを使ってL2TP/IPescのVPN環境を構築してみた。

環境
No 分類 ソフト
01 OS Ubuntu Server13.04(VirtualBox上のVM)
02 IPsec Openswan
03 L2TP xl2tpd

Openswan、xl2tpdのインストール

 以下のコマンドでインストールする。
 途中X.509証明書を使うか聞かれるが、今回は使わないのでNoにした。
$ sudo apt-get install openswan xl2tpd

IPsecの設定

 以下のファイルに以下を設定。

/etc/ipsec.conf ・・・既存を修正

version	2.0	# conforms to second version of ipsec.conf specification
config setup
	dumpdir=/var/run/pluto/
	nat_traversal=yes
	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=off
protostack=netkey
include /etc/ipsec.d/l2tp-psk.conf

/etc/ipsec.d/l2tp-psk.conf ・・・ipsec.confからinclude 新規作成

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
	dpddelay=5
	dpdtimeout=30
	dpdaction=clear
	ikelifetime=8h
	keylife=1h
	type=transport
	left=192.168.11.200        <---VPNサーバのIPアドレス
	leftnexthop=%defaultroute
	leftprotoport=17/%any
	right=%any
	rightprotoport=17/%any

/var/lib/openswan/ipsec.secrets.inc ・・・/etc/ipsec.secretsからincluse 新規作成

: PSK "事前共有鍵(任意の文字列)"


L2TPの設定

 以下のファイルに以下を設定。

/etc/xl2tpd/xl2tpd.conf ・・・既存修正

[global]								; Global parameters:
[lns default]							; Our fallthrough LNS definition
ip range = 192.168.11.100-192.168.11.103	; * Allocate from this IP range  <--VPNクライアントに割り当てるIP
local ip = 192.168.11.200				; * Our local IP to use <---VPNサーバのIPアドレス
length bit = yes
require chap = yes
refuse pap = yes
require authentication = yes
name = VPN
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.lns

/etc/ppp/options.l2tpd.lns ・・・新規作成

asyncmap 0
auth
local
crtscts
debug
lock
proxyarp
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
logfile /var/log/xl2tpd.log
lcp-echo-interval 30
lcp-echo-failure 4
ms-dns 8.8.8.8             # GoogleのDNSサーバ
ms-dns 8.8.4.4             # GoogleのDNSサーバ
 本ファイルの設定内容は、「man pppd」で参照できる。
 ms-dnsはクライアントがWindowsのためのオプションのようだが、これを指定しないとVPN接続後にクライアント(今回はAndroidのスマホでためした)がDNSサーバが設定されておらず、ホスト名指定でインターネットに出られなかった。
 また、この設定の有無にかかわらず、VPNサーバ上ではDNSによるアドレス解決ができなかった。digコマンドに明示的に外部のDNSサーバのIPを指定してもだめで、+vcをつけて、UDPではなくTCPで外部のDNSサーバを引きにいくと、うまく引ける。なお、内部のDNSサーバでは+vcをつけてもだめだった。原因不明だが、実害はないので無視している。

/etc/ppp/chap-secrets ・・・既存修正

"ユーザー名" * "パスワード" *

カーネルパラメータの設定

/etc/sysctl.conf

net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0

ブロードバンドルータの設定

 ブロードバンドルータはインターネット側からのパケットが許可されていないのと、NAPTでIPアドレスとポート変換が必要なので、以下のポートを開放し、VPNサーバの同ポートへ転送されるようにした。
プロトコル ポート番号 用途
UDP 500 ISAKMP
UDP 4500 IPsec NAT Traversal

VPNサーバのファイアウォール設定

最初はファイアウォールを無効にしていたが、それは危険ということで設定してみた。
ただし、意味はよくわかっておらず、以下のページを参考に設定してみただけ。勉強しないと・・・
  ○○的な気まぐれ日記 http://mercurial.secret.jp/Whimsical_diary/archives/528

ポートの開放

 Ubuntuなので、ufwコマンドを使って以下のポートを許可した。
$ sudo ufw allow 500/udp   <--- ISAKMP
$ sudo ufw allow 4500/udp   <--- IPsec NAT Traversal
$ sudo ufw allow 1701/udp   <--- L2TP
$ sudo ufw allow to 192.168.11.200 proto esp  <--- VPNサーバ向けのESP

VPNクライアントがインターネットに出られるようにする設定

/etc/default/ufwのDEFAULT_FORWARD_POLICYをACCEPTにする。
/etc/ufw/before.rulesの最後にあるCOMMITの前に以下を追加。
-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
COMMITの後に以下を追加
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.11.0/24 -j MASQUERADE <--- クライアントのネットワークを指定
COMMIT

以上の設定で、AndroidのスマホからVPNで接続できた。
最終更新:2013年05月06日 18:01