Android 6 MarshmallowでL2TP/IPsec VPNが動作しない問題を解決する(xl2tpd+openswan)
自宅サーバーやAWSなどでL2TP/IPSec VPNサーバーを構築している方は結構いらっしゃるのではないかと勝手に思っている。当方環境では、Android 6 Marshmallowにアップデートした瞬間、これまでの設定ではxl2tpd+openswanで構築した環境にアクセスすることが出来なくなってしまった。解消方法をメモ程度に記載する。
Android 6でxl2tpd+openswanなL2TP/IPSec VPNサーバーにアクセスしてみる
PPTPでは接続できているが、xl2tpd+openswanで構築したL2TP/IPsecサーバーには接続することが出来ない。この問題は下記のフォーラムでも多くの記載があり、Android6のバグなのではないかと思われる。
実際にxl2tpd+openswan環境にアクセスしてみると
Android6端末で接続を試みると、/var/log/auth.logには下記のような内容が残る。
# tail -f /var/log/auth.log
May 2001:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: responding to Main Mode from unknown peer [クライアントIP]
May 2001:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: transition from state STATE_MAIN_R0 to state STATE_MAIN_R1
May 2001:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: STATE_MAIN_R1: sent MR1, expecting MI2
May 2001:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: NAT-Traversal: Result using draft-ietf-ipsec-nat-t-ike (MacOS X): both are NATed
May 2001:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2
May 2001:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: STATE_MAIN_R2: sent MR2, expecting MI3
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: Main mode peer ID is ID_IPV4_ADDR: '100.83.5.98'
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: switched from "L2TP-PSK-NAT" to "L2TP-PSK-NAT"
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: deleting connection "L2TP-PSK-NAT" instance with peer [クライアントIP] {isakmp=#0/ipsec=#0}
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: new NAT mapping for #1, was [クライアントIP]:13314, now [クライアントIP]:13319
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: STATE_MAIN_R3: sent MR3, ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=aes_256 prf=OAKLEY_SHA2_256 group=modp1024}
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: Dead Peer Detection (RFC 3706): enabled
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: ignoring informational payload, type IPSEC_INITIAL_CONTACT msgid=00000000
May 2001:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: received and ignored informational message
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: the peer proposed: [サーバーWAN側IP]/32:17/0 -> 100.83.5.98/32:17/0
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: responding to Quick Mode proposal {msgid:65800dc8}
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: us: 192.168.11.2/32===192.168.11.2:17/%any
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: them: [クライアントIP][クライアントIP]:17/0
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: transition from state STATE_QUICK_R0 to state STATE_QUICK_R1
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: STATE_QUICK_R1: sent QR1, inbound IPsec SA installed, expecting QI2
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: Dead Peer Detection (RFC 3706): enabled
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: transition from state STATE_QUICK_R1 to state STATE_QUICK_R2
May 2001:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: STATE_QUICK_R2: IPsec SA established transport mode {ESP=>0x0af8f8fe ```## 原因
どうやら、Android端末では、ipsecの設定で暗号化アルゴリズムをきちんと設定してあげる必要があるようだ。
ただし、Android 6 MarhsmallowのSHA2は標準のものとは少し異なっているため、他の環境との共存が出来る設定を行わなくてはならない。
LibreswanのFAQにもその旨が記載されているが、当該のコマンドはopenswanでは対応していない。
https://libreswan.org/wiki/FAQ
<blockquote>It seems that android 6.0 now defaults to ESP with SHA2, but it uses a bad implementation of SHA2. You can work around that using sha2-truncbug=yes but that would break all non-android clients that usetheproperRFCSHA2implementation. ItmightbepossibletoavoidSHA2completelyanduseesp=aes_gcm-nullinstead (whichisalsofaster)
Seethesha2-truncbugmanpageentryofipsec.confformoreinformation. Thereisalsoanandroidbug 194269 aboutthisissue.</blockquote>
## 対策
仕方ないので、openswanをアンインストールし、libreswanを新規にインストール。openswanの設定ファイルは基本的に流用可能であった。
### Libreswanのインストール
apt-get remove openswan
apt-get install libreswan
<br />libreswanをインストールしたら、このようなメッセージが続々と表示されたため、-f installは行わず、必要なパッケージを全てインストール。
以下のパッケージには満たせない依存関係があります:
libreswan : 依存: libunbound2 (>= 1.4.1) しかし、インストールされようとしていません
依存: libnss3-tools しかし、インストールされようとしていません
E: 未解決の依存関係です。’apt-get -f install’ を実行してみてください (または解法を明示してください)。
<br />## Libreswan用Android対策設定をする
libreswanの設定ファイルはopenswanと同じものが使用できるため、追記のみで問題なし。
下記の設定を追記する。
ike=3des-sha1,aes-sha1,aes256-sha2_256,aes256-sha2_512
phase2alg=3des-sha1,aes-sha1,aes256-sha2_256,aes256-sha2_512
sha2-truncbug=yes
“`
設定完了後、ipsecをリスタートする。
sudo service ipsec restart
当方の環境では、これでAndroid6からもL2TP/IPsec接続が可能となった。また、MacやiPhoneでも接続出来ることを確認している。
ディスカッション
ピンバック & トラックバック一覧
[…] どうやら、Android の L2TP/IPsec における SHA2 の実装がドラフト版の古いものであることが原因のようです。 Issue も上がってます。2 Libreswan の Wiki3 によるとサーバー側の /etc/ipsec.d/l2tp-psk.conf に sha2-truncbug=yes を追加すればいいみたいですが、RFC に則った実装をしているクライアントが全部死ぬっぽいので、回避策として ike=、phase2alg= オプションを指定する必要があるようです。*4 […]