前々から設定しかけてはうまくいかなかった、Android向けL2TP/IPSecがようやく動くようになったので、どんな設定をしたかをまとめてみます。対象はDebian squeezeです。
パッケージとして必要になるのは、openswanとxl2tpdです。これらをapt-get installします。
まずopenswanの設定をします。これはIPSecの実装の一つです。もともとFreeS/Wanというプロジェクトがあったのですが、その開発が止まったためforkしてできたのがOpenswanです。ほかにStrongswanという実装もあるようですが、ここでは触れません。
/etc/ipsec.confというファイルが存在しているので、それを編集します。冗長なコメントは消しています。
# /etc/ipsec.conf - Openswan IPsec configuration file version 2.0 # conforms to second version of ipsec.conf specification # basic configuration config setup # NAT-TRAVERSAL support, see README.NAT-Traversal # exclude networks used on server side by adding %v4:!a.b.c.0/24 virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 # 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 nhelpers=0 # Add connections here include /etc/ipsec.d/*.conf
次に、L2TP向けの設定ファイル/etc/ipsec.d/l2tp-psk.confを新規に作成します。
conn L2TP-PSK-NAT rightsubnet=0.0.0.0/0 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.secretsを編集します。ハイライトされた行を追加します。your-passwordを自分が設定したいパスワードにしてください。このパスワードがIPSec事前共有鍵になります。
# RCSID $Id: ipsec.secrets.proto,v 1.3.6.1 2005/09/28 13:59:14 paul Exp $ # This file holds shared secrets or RSA private keys for inter-Pluto # authentication. See ipsec_pluto(8) manpage, and HTML documentation. # RSA private key for this host, authenticating it to any other host # which knows the public part. Suitable public keys, for ipsec.conf, DNS, # or configuration of other implementations, can be extracted conveniently # with "ipsec showhostkey". #: PSK "1234567890" : PSK "your-password" # this file is managed with debconf and will contain the automatically created RSA keys include /var/lib/openswan/ipsec.secrets.inc
次に、sysctl関連の設定をします。/etc/sysctl.d/for-ipsec.confファイルを作成し、以下のように設定します。自分はすべてのインターフェースに{accept,send}_redirectsを設定しています。各自のインターフェース名に合わせて設定してください。
# forward net.ipv4.ip_forward=1 # redirect net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.ppp0.accept_redirects = 0 net.ipv4.conf.br0.accept_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.ppp0.send_redirects = 0 net.ipv4.conf.br0.send_redirects = 0 net.ipv4.conf.lo.send_redirects = 0
ファイルを作成したら、sysctl -p /etc/sysctl.d/for-ipsec.confを実行してこのsysctl設定を有効化します。リブート時には/etc/init.d/procpsの中でこのファイルが自動的に読まれます。
ここで、一度ipsecを起動してみます。/etc/init.d/ipsec startして、ipsec verifyを実行してみてください。問題なければ以下のような出力が出ます。[NG]という出力があれば、何か設定に失敗していることになります。
Checking your system to see if IPsec got installed and started correctly: Version check and ipsec on-path [OK] Linux Openswan U2.6.28/K2.6.38-bpo.2-686-bigmem (netkey) Checking for IPsec support in kernel [OK] NETKEY detected, 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 Checking for 'ip' command [OK] Checking for 'iptables' command [OK] Opportunistic Encryption Support [DISABLED]
ipsecはデフォルトでは自動起動になっていないので、insserv ipsecを実行して自動起動するようにしてください。
最後は、xl2tpdの設定です。/etc/xl2tp.confを以下のように設定します。
[global] ; Global parameters: auth file = /etc/xl2tpd/l2tp-secrets ; access control = no ;debug avp = yes ;debug network = yes ;debug packet = yes ;debug state = yes ;debug tunnel = yes [lns default] ; Our fallthrough LNS definition name = l2tpd ip range = 192.168.126.1-192.168.126.20 local ip = 192.168.126.2 require chap = yes ; * Require CHAP auth. by peer refuse pap = yes ; * Refuse PAP authentication require authentication = yes ; * Require peer to authenticate ppp debug = yes ; * Turn on PPP debugging pppoptfile = /etc/ppp/options.l2tpd.lns ; * ppp options file length bit = yes
2行目で、ppp認証用のユーザー、パスワードを記述したファイル名を指定します。10,11行目でVPNに振るアドレスを指定します。各自にあったIPアドレスレンジを使ってください。16行目では、xl2tpdが起動するpppdの設定ファイル名を指定しています。うまく動かないときは、各種デバッグオプションを有効にしてみてください。
/etc/xl2tpd/l2tp-secretsは以下のように書きます。user, passwdは適切なものにしてください。
# Secrets for authenticating l2tp tunnels # us them secret user * passwd
/etc/ppp/options.l2tpd.lnsの設定例は以下になります。
ipcp-accept-local ipcp-accept-remote require-mschap-v2 noccp nodefaultroute auth #crtscts idle 1800 mtu 1280 mru 1280 debug lock proxyarp connect-delay 5000 #nobsdcomp ms-dns 192.168.3.4 netmask 255.255.255.0 logfile /var/log/xl2tpd.log
最初、MTU/MRUのサイズを指定しないで動かしていたら外部との通信がうまくいかなかったので、かなり小さめ(1280)にしています。16行目のネームサーバは適切なものに変更してください。
あとは/etc/init.d/xl2tpd restartを実行して、Android側の設定をしてゆきます。VPNのタイプはL2TP/IPSec PSK、VPNサーバ名とIPSec事前共有鍵(ipsec.secretsの値)を設定します。L2TPセキュリティ保護は無効にします。
あとは接続を実行し、l2tp-secretsに書いたユーザー名、パスワードを入力すれば接続できるはずです。設定がおかしいと、一瞬pppセッションが確立したあとすぐ切られる、というような状況が起きることがあるので気を付けてください。
知人から、これらに関していくつか助言をいただいています。
[blackbirdpie id=”237744346173153281″]
ICSとOpenswanの組み合わせでは動かないことがあるようです。
[blackbirdpie id=”237735014954070016″]
新しいkernelにはopenl2tpというin-kernel l2tpモジュールがあるそうです。ただし、まだuserlandはDebianパッケージが(sidにも)ありません。
参考:
追記(2012/8/24):
MS-CHAP-v2の脆弱性と攻撃ツールの流通が報告されていますが、pppの設定を見ての通り、L2TP/IPSecでもMS-CHAP-v2を使っています。暗号化されたトンネルの下でpppを確立するため、直ちに危険というわけではありませんが、PSK共有鍵方式だと安全とはいえないようです。
証明書ベースの接続(CRT VPN)の設定を今後は調べてみようと思います。
1 comment
Comments are closed.