Android 6 MarshmallowでL2TP/IPsec VPNが動作しない問題を解決する(xl2tpd+openswan)

2018年7月8日VPN, プロキシLinux, Ubuntu, プロキシ

自宅サーバーや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 20 01:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: responding to Main Mode from unknown peer [クライアントIP]
May 20 01:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: transition from state STATE_MAIN_R0 to state STATE_MAIN_R1
May 20 01:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: STATE_MAIN_R1: sent MR1, expecting MI2
May 20 01: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 20 01:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2
May 20 01:54:08 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: STATE_MAIN_R2: sent MR2, expecting MI3
May 20 01:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: Main mode peer ID is ID_IPV4_ADDR: '100.83.5.98'
May 20 01:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[1] [クライアントIP] #1: switched from "L2TP-PSK-NAT" to "L2TP-PSK-NAT"
May 20 01: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 20 01:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3
May 20 01:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: new NAT mapping for #1, was [クライアントIP]:13314, now [クライアントIP]:13319
May 20 01: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 20 01:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: Dead Peer Detection (RFC 3706): enabled
May 20 01:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: ignoring informational payload, type IPSEC_INITIAL_CONTACT msgid=00000000
May 20 01:54:09 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #1: received and ignored informational message
May 20 01: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 20 01:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: responding to Quick Mode proposal {msgid:65800dc8}
May 20 01:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: us: 192.168.11.2/32===192.168.11.2:17/%any
May 20 01:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: them: [クライアントIP][クライアントIP]:17/0
May 20 01:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: transition from state STATE_QUICK_R0 to state STATE_QUICK_R1
May 20 01:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: STATE_QUICK_R1: sent QR1, inbound IPsec SA installed, expecting QI2
May 20 01:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: Dead Peer Detection (RFC 3706): enabled
May 20 01:54:10 myserver pluto[30004]: "L2TP-PSK-NAT"[2] [クライアントIP] #2: transition from state STATE_QUICK_R1 to state STATE_QUICK_R2
May 20 01: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では対応していない。


<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 use the proper RFC SHA2 implementation. It might be possible to avoid SHA2 completely and use esp=aes_gcm-null instead (which is also faster)

See the sha2-truncbug man page entry of ipsec.conf for more information. There is also an android bug 194269 about this issue.</blockquote>
## 対策
仕方ないので、openswanをアンインストールし、libreswanを新規にインストール。openswanの設定ファイルは基本的に流用可能であった。

### Libreswanのインストール

apt-get remove openswan
apt-get install libreswan


libreswanをインストールしたら、このようなメッセージが続々と表示されたため、-f installは行わず、必要なパッケージを全てインストール。

以下のパッケージには満たせない依存関係があります:
libreswan : 依存: libunbound2 (>= 1.4.1) しかし、インストールされようとしていません
依存: libnss3-tools しかし、インストールされようとしていません
E: 未解決の依存関係です。’apt-get -f install’ を実行してみてください (または解法を明示してください)。


## 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でも接続出来ることを確認している。