自宅のネットワークにアクセスできるようにIPSec/L2TPのVPNサーバーを使っていた。strongswanとxl2tpdを利用している。

Debian JessieだったかStretchで使っていた設定ファイルをArch Linux ARMにそのまま移した。最新版では使えなくなった設定があるのでsudo journalctl -fで出てくるエラーをつぶして、サービスが動くようにした。

しかし、パケットが通らない。サーバーからpingを打っても、Destination Host Unreachableだった。

LANのip address rangeが192.168.0.0/24で、xl2tpdのip range =  192.168.0.200-192.168.0.220 から 192.168.2.200-192.168.2.220 sudo iptables に変えた。(local ipも合わせる)そして、sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE でNAT通すようにしたら、LANにアクセスできるようになった。

しかし、昔の設定が使えないのは謎なので、さらに調べていたら、どうもルーティングテーブルがおかしい。ip rangeを192.168.0.0/24にしている状態で、VPN接続を行う。そして、ip route get 192.168.0.200を実行すると

$ ip route get 192.168.0.200
192.168.0.200 dev eth0 table 220 src 192.168.0.25 uid 1001
cache

このようになる。

なんかよくわからないtable 220にppp0ではなくeth0経由で通信しようするように設定されている。とりあえず、ip route flush table 220(違ったかも)でルーティングテーブルのこのエントリを消すことで正しくVPNで接続したiPhoneにpingが通るようになった。

https://wiki.strongswan.org/issues/248

If I let charon (and not updown.sh) install the routes (install_routes=yes), this is what happens (10.32.32.200 is the 'other side'):

とあるので、install_routesというキーワードをヒントに検索したら、次のような設定があることが判明した。

https://wiki.strongswan.org/projects/strongswan/wiki/StrongswanConf

charon.install_routes yes Install routes into a separate routing table for established IPsec tunnels. If disabled a more efficient lookup for source and next-hop addresses is used since 5.5.2.

デフォルトではyesになっているのをnoに変更したら直った。設定ファイルは /etc/strongswan.d/charon.confにあった。

これで、なんとか使えるようになった。