パケットがトンネルに入るか否かを確認する。
xl2tpd / ipsec で ipsec と l2tpd が併せて語られる記事をいっぱい見かけたけど、ipsec は ipsec で単体で、独立して動作しているよね?って思ったので、念のための念のために確認した。
ipsec を準備する
2台のマシンを用意する。
lxc launch ubuntu:22.04 server lxc launch ubuntu:22.04 client lxc exec server -- apt update && apt install strongswan lxc exec client -- apt update && apt install strongswan
ipsec の設定をする。 left が自分で、right が接続相手(peer)であることを留意しながら書く。
サーバー側設定
## mkdir /etc/ipsec.d/conf cat <<EOF >> /etc/ipsec.conf include /etc/ipsec.d/conf/*.conf EOF ## cat <<EOF > /etc/ipsec.d/conf/my-l2tp-psk.conf ## ltp2用 conn my authby=secret type=transport keyexchange=ikev1 ike=aes256-sha1-modp1024 esp=aes256-sha1 right=%any leftprotoport=udp/l2tp left=10.17.238.232 rightprotoport=udp/l2tp auto=start EOF cat <<EOF >> /etc/ipsec.secrets : PSK my-preshared-secret-key EOF systemctl restart ipsec
クライアント側
## mkdir /etc/ipsec.d/conf cat <<EOF >> /etc/ipsec.conf include /etc/ipsec.d/conf/*.conf EOF ## cat <<EOF > /etc/ipsec.d/conf/my-l2tp-psk.conf ## ltp2用 conn my authby=secret type=transport keyexchange=ikev1 ike=aes256-sha1-modp1024 esp=aes256-sha1 left=%any # 自分 leftprotoport=udp/l2tp right=10.17.238.232# 相手 rightprotoport=udp/l2tp auto=add EOF ## cat <<EOF >> /etc/ipsec.secrets : PSK my-preshared-secret-key EOF systemctl restart ipsec
設定をリロードで起動
systemctl restart ipsec # または ipsec reload # ときに、ipsec rereadall ipsec up my
接続される
connection 'my' established successfully
接続後のxfrm 確認
xfrm は すべてのルーティング処理が終わってから本当の最後の最後に実行されてる処理
root@u01:~# ip xfrm policy src 10.17.238.232/32 dst 10.17.238.163/32 proto udp sport 1701 dport 1701 dir out priority 366847 tmpl src 0.0.0.0 dst 0.0.0.0 proto esp spi 0xcfdcd987 reqid 1 mode transport src 10.17.238.163/32 dst 10.17.238.232/32 proto udp sport 1701 dport 1701 dir in priority 366847 tmpl src 0.0.0.0 dst 0.0.0.0 proto esp reqid 1 mode transport
この場合、次のパケットがマッチする。
src 10.17.238.232/udp/1701 → dst 10.17.238.163/udp/1701 ## とその逆 dst 10.17.238.232/udp/1701 ← src 10.17.238.163/udp/1701
のADDR/Portのパケットが、トンネルに入ることがわかる。
このことから、1701 パケットはESPに入る(=暗号化・カプセル化される)
xl2tpd などは、このポートを通ることを前提にしている。
l2tp/ipsec で 1701 以外のポートを使うのはこのためだ。
ESP 化を確認(トンネル通過)
ブリッジで監視をする🚗
sudo tcpdump -i lxdbr0
ncat で通信を始める。
root@u01:~# ncat -u -l 10.17.238.232 1701
root@u02:~# ncat -u 10.17.238.232 1701 --source-port 1701
条件にマッチするので、カプセル化されている。
ESP化から除外される確認(トンネル非通過)
ブリッジで監視する。
sudo tcpdump -i lxdbr0
ncat で通信を始める。
root@u01:~# ncat -u -l 10.17.238.232 1701
root@u02:~# ncat -u 10.17.238.232 1701 --source-port 1700
条件に未マッチなので、カプセル化されない。
IPSecとXfrmの状況の確認
ipsec では rightport / leftport などを使ってこれらのESP化を制御している。
たとえば、xl2tpd では、ESP化指定した条件(IP/ポート/プロトコル)で通信することで、暗号化しつつL2TPを実現している。
たとえば、ipsec(一般的にいわれるIPSec)ではこの条件を特定IPすべてにすることで、全パケットを暗号化している。
l2tp/ipsec とは
l2tp over ipsec で、暗号化(コンフィデンシャル)は、ipsecにより担保される。
ipsec は単体でで動いているので確認した。