それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

L2TP/ipsecのvpnサーバーに OpenWrt からつなぐ

OpenWrt からL2TP/IPsecにつなぐ

接続相手は、NTT フレッツ HGW(RP-500MI)のVPNサーバー。

基本的にはNTTのHGWにUbuntuでL2TP/IPSecで繋いだのと同じ法

インストール

opkg install xlt2ptd strongswan

動作確認したときのインストール状態

strongswanは次のパッケージを入れている。(IKEv2とかも使える状態)

strongswan strongswan-charon strongswan-default strongswan-ipsec strongswan-mod-aes strongswan-mod-attr strongswan-mod-connmark strongswan-mod-constraints strongswan-mod-des strongswan-mod-dnskey strongswan-mod-eap-identity strongswan-mod-eap-mschapv2 strongswan-mod-fips-prf strongswan-mod-gcm strongswan-mod-gmp strongswan-mod-hmac strongswan-mod-kernel-netlink strongswan-mod-md4 strongswan-mod-md5 strongswan-mod-nonce strongswan-mod-pem strongswan-mod-pgp strongswan-mod-pkcs1 strongswan-mod-pubkey strongswan-mod-random strongswan-mod-rc2 strongswan-mod-resolve strongswan-mod-revocation strongswan-mod-sha1 strongswan-mod-sha2 strongswan-mod-socket-default strongswan-mod-sshkey strongswan-mod-stroke strongswan-mod-updown strongswan-mod-vici strongswan-mod-x509 strongswan-mod-xauth-generic strongswan-mod-xcbc strongswan-swanctl

l2tp 関連は次のパッケージを入れている

kmod-l2tp kmod-pppol2tp ppp-mod-pppol2tp xl2tpd

ppp 関連は次のパッケージを入れている

kmod-ppp kmod-pppoe kmod-pppol2tp kmod-pppox luci-proto-ppp ppp ppp-mod-pppoe ppp-mod-pppol2tp

ipsec の接続

/etc/ipsec.conf にinclude で次のファイルを読むように指示

include /etc/config/custom/strongswan/ipsec.conf

/etc/config に設置するようにした。

/etc/config/custom/strongswan/ipsec.conf で接続先毎にフォルダを作って格納することにした。

include ./www.example.tld/ipsec.conf
include ./interlink-vpn/ipsec.conf
include ./server/ipsec.conf

相対パスは、include時点のファイル自身(/etc/config/custom/strongswan/ipsec.conf)から見た相対パスになる。

./www.example.tld/ipsec.conf    (/etc/config/custom/strongswan/www.example.tld/ipsec.conf)

conn www.example.tld
  type=transport
  authby=secret
  rekey=yes
  keyingtries=1
  keyexchange=ikev1
  ike=aes256-sha-modp1024
  esp=aes256-sha1
  left=%any4
  leftid=@my1
  leftprotoport=udp/l2tp
  right=www.example.tld
  rightid=%any
  rightprotoport=udp/l2tp
  dpdaction=restart
  closeaction=restart
  auto=add

left にドメインを指定するとき、%any4 をつけないと、AAAAが優先されIPv6で繋いでしまうので注意。

今回は、NTTのホームゲートウェイ(HGW)を相手に接続するのでV4アドレスが必須である。

共有鍵も同じように、接続ごとにフォルダに分ける。

/etc/ipsec.secrets

# include
include /etc/config/custom/strongswan/ipsec.secrets

/etc/config/custom/strongswan/ipsec.secrets

include ./interlink-vpn/ipsec.secrets
include ./server/ipsec.secrets
include ./www.example.tld/ipsec.secrets

include の相対パスは、conf と同じく、include記載ファイルからの相対パスで解釈される。

./www.example.tld/ipsec.secrets    ( = /etc/config/custom/strongswan/www.example.tld/ipsec.secrets)

@my1 : PSK 3vpWkK7K

leftid=@my1と記載したので 共有鍵のIDに同じ名前を付与する。

接続する

ipsec reload  # conf を再読み込み
ipsec rereadsecrets  # secrets を再読み込み
ipsec up www.example.tld # 接続
ipsec status  www.example.tld  # 状況表示

no shared key found になる場合は、secrets の PSK の記載方法が間違っているので、strongswan のマニュアルにあるIDSelector について確認すること

xl2tpd の接続

/etc/xl2tpd/xl2tpd.conf

[lac] を追加

[lac www.example.tld ]
lns = www.example.tld 
require authentication = yes
pppoptfile = /etc/ppp/options.l2tpd.www.example.tld 
length bit = yes
require chap= yes
refuse pap = yes
redial = yes
redial timeout = 10
max redials = 6

/etc/ppp/options.l2tpd.www.example.tld

パスワードとnoauthを追加

name takuya
password  myPassword
mtu 1280 # この値は適当、ちゃんと計算するべき
noauth

再起動

service xl2tpd stop
service xl2tpd start

接続

xl2tpd-control -d connect-lac www.example.tld 

うまく行かないときは、ログを見ながら( logread -f )設定を見直す。

ppp の確認

接続確立したら ppp が生えている。

ip a s ppp1
23: ppp1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp
    inet 192.168.10.249 peer 192.168.10.1/32 scope global ppp1
       valid_lft forever preferred_lft forever

luci でファイアウォールの設定

luci ではアンマネージドにしておくと、存在だけがわかるので良いかもしれない。

パケットの経路に関してはこのデバイスをターゲットに色々と書けば良い。

luci webui で接続管理

luci で接続管理ができるようなWEB-UIパッケージを探したけど、見つからない。

opkg find luci-proto* | cut -d ' ' -f 1
luci-proto-3g
luci-proto-autoip
luci-proto-bonding
luci-proto-gre
luci-proto-hnet
luci-proto-ipip
luci-proto-ipv6
luci-proto-modemmanager
luci-proto-ncm
luci-proto-nebula
luci-proto-openconnect
luci-proto-openfortivpn
luci-proto-ppp
luci-proto-pppossh
luci-proto-qmi
luci-proto-relay
luci-proto-sstp
luci-proto-vpnc
luci-proto-vxlan
luci-proto-wireguard
luci-proto-xfrm

luci-proto-ppp はそれっぽい気もするが、PPPoE かPPP(ttyX)が対象で使えなかった。これと言った管理はできないので、アンマネージドで存在だけ見ておいて、あとはスクリプトで設定したほうが良さそうだった。

自動接続

自動接続に関しては、スクリプトとhotplugi.d を駆使して行えばいいだろう。

PPPoEが接続されたタイミングで、L2TP/IPSecを繋げば良い。スクリプトを追加すれば良い

ipsecに関しては、auto=addauto=start にしてもいい。

わたしは、必要虹つなげばいいとおもったので、今回は自動化をしない。

その他細かいipsec/xl2tpd/pppの設定 で切断時の自動的な再接続を制御できる。

手動接続

ipsecを繋いでから、pppをつなぐ。

接続

ipsec up www.example.tld
xl2tpd-control -d connect-lac www.example.tld

切断

xl2tpd-control -d disconnect-lac www.example.tld
ipsec down www.example.tld

手動で接続し切断できれば十分であるはずである。

ルーティング

接続後にルーティングを入れたりDNS参照を変えたりする必要がある場合はip route などを使って制御する。

xl2tpd/ppp のオプションでpppXデバイスが作られたタイミングで、IP割当やルーティングを行うスクリプトを指定して毎回同じ設定をロードしてもいい

関連記事

OpenWRT で繋ぐ前に、Ubuntuで使い方を調べたときの記事

IPsecでの暗号化の確認。xl2tpd で接続する方法とデバッグ起動などを調べてある。

参考資料