それマグで!

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

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

パケットがipsecトンネルに入るか否かを確認する。(l2tp/ipsc)

パケットがトンネルに入るか否かを確認する。

xl2tpd / ipsecipsec と l2tpd が併せて語られる記事をいっぱい見かけたけど、ipsecipsec で単体で、独立して動作しているよね?って思ったので、念のための念のために確認した。

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 は単体でで動いているので確認した。