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=add
を auto=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 で接続する方法とデバッグ起動などを調べてある。
- https://takuya-1st.hatenablog.jp/entry/2023/08/08/173640
- https://takuya-1st.hatenablog.jp/entry/2023/08/08/172452
- https://takuya-1st.hatenablog.jp/entry/2023/08/03/182213