mineoのデュアル契約スマホ(p9 lite/android 6.0)で、さくらのVPSで動くxl2tpdに接続する。libreswan 3.19 / xl2tpd 1.3.8 / ppp 2.4.7使用。(20173)

yaourt -S xl2tpd libreswan ppp

ネットワーク環境

スマホはプロバイダのNAT(LSN)の後ろにいる。100.ii.jj.kk はプライベートアドレスではないが、LSNでそれっぽく使用する”特殊用途アドレス”らしい。

                      .
[server]              .   [ISP]
a.b.c.d---internet---61.205.Z.W <- サーバーからはこれが見える
                      .       |
. . . . . . . . . . . .    NAT(LSN)
                      .       |
[スマホ]100.ii.jj.kk-------(pppd?)

パケットフィルタリング(iptables)

  • IPSecでないl2tpは蹴る(念のため)

    -A INPUT  -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT
    -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
    
  • VPN経由でのみアクセスさせるものは、-j accept_if_IPSec_in などとすると幸せ。

    :accept_if_IPSec_in -
     -A accept_if_IPSec_in -m policy --pol ipsec --dir in -j ACCEPT
    

IPSec ( libreswan 3.19-1 )

/etc/ipsec.d/*.conf/etc/ipsec.d/*.secrets がそれぞれ、 /etc/ipsec.conf/etc/ipsec.secretsからincludeされるようにしておく。

設定例をweb検索してみたが、IPSec(libreswan)の設定でそのまま使えるものがなかった。 android 6はIPSecのドラフト版の(とても古い、マイナーな)仕様を一部に使っているらしい。過渡的な状況かもしれないが、今は手当てが必要。

/etc/ipsec.d/example.conf

  • 出発点として、ここから辿れるここの、android 5で有効なコンフィグを元にした。古いディレクティブでエラーが出るので、適当に直した。多分OK。
  • aes256-sha2_256 が必要(android側が要求) -> ike= と phase2alg= を変更。
  • ”;modp1024” の明示が必要(libreswanのデフォルトリストから外れている) -> ike= とphase2alg= に追加
  • sha2-truncbug=yesが必要(android6がなぜか SHA2 HMACのドラフト版を使用するため)。この対策により、他のリモートが接続出来なくなる可能性あり。

.

# blank line

# secret file must be:
#$LEFT_IP %any : PSK "<psk>"

conn example_connection
    auto = add
    #auto = start
    left=a.b.c.d
    leftid=a.b.c.d
    leftsubnet=a.b.c.d/32
    leftnexthop=%defaultroute
    leftprotoport=17/1701
    rightprotoport=17/%any
    right=%any
    #rightsubnetwithin=0.0.0.0/0  ===> Error "rightsubnet"
    rightsubnet=0.0.0.0/0
    forceencaps=yes
    authby=secret
    pfs=no
    type=transport
    #auth=esp     ===> Error "esp"
    phase2=esp
    ike=aes256-sha2_256;modp1024
    phase2alg=aes256-sha2_256;modp1024
    dpddelay=15
    dpdtimeout=30
    dpdaction=clear
    sha2-truncbug=yes

# vim: set ts=4 sw=4 nowrap:

/etc/ipsec.d/example.secrets

a.b.c.d %any : PSK "<psk_string>"
  • a.b.c.dはサーバーの固定グローバルIPアドレス

l2tp (xl2tpd 1.3.8)

/etc/xl2tpd/xl2tpd.conf

  • ここでのrefuse/require と、options.xl2tpd内の refuse-/require-の優先順位が不明。今のところ mschap-v2を使わせることができていない。

.

[global]
listen-addr = <server IP>

[lns default]
ip range=192.168.6.2-192.168.6.15
local ip = 192.168.6.1
require chap = yes
refuse pap = yes
require authentication=yes
name = xl2tpd_on_server
ppp debug=yes
pppoptfile=/etc/ppp/options.xl2tpd
length bit = yes

/etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"<username>"   "xl2tpd_on_server" "<password>"  *

/etc/ppp/options.xl2tpd

  • nameの値は /etc/ppp/chap-secretsの server欄と照合される。
  • 今のところ、mschap-v2を使わせる方法がわからないため、MPPEを有効にできない。

.

login
lcp-echo-interval 10
lcp-echo-failure 2
noipx

name xl2tpd_on_server

# to use mppe, need mschap-v2, so all four must be refused {eap, pap, chap, mschap}
refuse-eap
refuse-pap
require-chap
refuse-mschap
#require-mschap-v2
# commented out because I could not make pppd via xl2tpd to use mschap-v2
#require-mppe

nodefaultroute
proxyarp

#bsdcomp
#deflate
#accomp
#noccp
#nopcomp
#nopredictor1
#novj
#novjccomp
#debug 7

androidのVPN設定

VPNネットワーク設定

  • 「名前」:適当
  • 「タイプ」:L2TP/IPSec PSK
  • 「IPSec事前共有鍵」: <psk_string>
  • 「サーバーアドレス」: a.b.c.d
  • 「L2TPセキュリティ保護」:(未使用)
  • 「IPSec ID」:(未使用)
  • 「DNS検索ドメイン」:(未使用)
  • 「転送ルート」:(未使用) 行き先が指定のネットワークアドレスに合致するパケットのみ、VPN経由で送信。

VPN接続時

  • 「ユーザー名」:<username>
  • 「パスワード」:<password>