このポストでは、OpenBSD 7.9 amd64 マシンを用いて、手を動かしながら IPsec の初歩的な挙動を観察する。具体的には、ホストマシン・仮想マシン間の ICMP パケットが、IPsec を使うことで暗号化される様子を確認する。

仮想マシンの作成

仮想マシンの作成には vmctl(8) および vmd(8) を使用する。まずインストールイメージと仮想マシンディスクイメージを用意する:

$ doas mkdir -p /home/vm
$ cd /home/vm
$ doas ftp https://cdn.openbsd.org/pub/OpenBSD/7.9/amd64/install79.iso
$ doas vmctl create -s 12G guest.qcow2

作業ディレクトリ (/home/vm)、ディスクサイズ (-s 12G)、ディスクイメージ名 (guest.qcow2) に特別な意味はない。

次に、vmd を起動する:

$ doas rcctl enable vmd
$ doas rcctl start vmd

最後に、上で用意した guest.qcow2 に install79.iso を用いて OpenBSD をインストールすることで仮想マシンが出来上がる:

$ doas vmctl start -m 1G -L -c -r /home/vm/install79.iso -d /home/vm/guest.qcow2

各オプションの意味は以下のとおり:

  • -m 仮想マシンのメモリサイズ
  • -L ローカルネットワークインタフェースの追加
  • -c 自動でコンソールに接続
  • -r ISO イメージの指定
  • -d ディスクイメージの指定

OpenBSD の具体的なインストール手順は割愛する。インストールが完了したら ~. をタイプしてコンソールから抜け、インストールイメージなしで再起動し仮想マシンの準備が完了となる:

$ doas vmctl stop guest
$ doas vmctl start -m 1G -L -c -d /home/vm/guest.qcow2

ホストマシン・仮想マシン間の疎通確認

以降で ping を送り合うために、ホストマシンと仮想マシンの IP アドレスを確認する。ホストマシン側の仮想イーサネットインタフェースは通常 tap* のような名前で、仮想マシン側の仮想 NIC は vio* のような名前となっている。以降の例ではそれぞれ tap0, vio0 であるとする。また、ホストマシンのシェルプロンプトを $, 仮想マシンのシェルプロンプトを # と書く。

まずは両者の IP アドレスを実際に確認する:

$ ifconfig tap0 | grep inet
	inet 100.64.1.2 netmask 0xfffffffe
# ifconfig vio0 | grep inet
	inet6 fe80::fce1:bbff:fed1:c939%vio0 prefixlen 64 scopeid 0x1
	inet 100.64.1.3 netmask 0xfffffffe

次に、仮想マシンからホストマシンへ ping を送り疎通を確認する:

# ping -c 1 100.64.1.2

このとき、ホストマシンで tap0 のパケットをキャプチャすると以下のようなログが見られ、疎通が確認できる:

$ doas tcpdump -i tap0
tcpdump: listening on tap0, link-type EN10MB
18:50:49.978542 100.64.1.3 > 100.64.1.2: icmp: echo request
18:50:49.978639 100.64.1.2 > 100.64.1.3: icmp: echo reply

IPsec を観察

以降では、実際に IPsec の ESP (Encapsulating Security Payload) によって ICMP パケットが暗号化される様を観察していく。

IPsec の設定・有効化には ipsecctl(8) を使う。この例では簡単のため IKE (Internet Key Exchange) は用いない。まずホストマシン・仮想マシン間のトラフィックをどう保護するかの関連付けである SA (Security Association) とトラフィックの保護を明示する FLOW を手動で設定する。SA, FLOW の設定は /etc/ipsec.conf に以下のように記述する (パーミッションは 600 にしておくこと):

$ doas cat /etc/ipsec.conf
esp transport from 100.64.1.2 to 100.64.1.3 \
        spi 0x1001:0x1002 \
        auth hmac-sha2-256 enc aes \
        authkey 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb \
        enckey 0x1111111111111111111111111111111111111111111111111111111111111111:0x2222222222222222222222222222222222222222222222222222222222222222
flow esp from 100.64.1.2 to 100.64.1.3
$ doas chmod 600 /etc/ipsec.conf

各要素を順に解説する:

  • esp transport from ... to ... ホストマシンから仮想マシンへのトラフィックには transport モードの ESP を使用
  • spi 0x1001:0x1002 (ホストから見た) アウトバウンドの SPI (Security Parameter Index) は 0x1001、インバウンドは 0x1002
  • auth hmac-sha2-256 enc aes パケット本体の暗号化には aes を使い、暗号文の完全性は hmac-sha2-256 で認証
  • authkey ..., enckey 暗号化・認証の鍵
  • flow esp from ... to ... ホストマシン・仮想マシン間のトラフィックを保護せよ

仮想マシン側にも同様の設定を行う:

# cat /etc/ipsec.conf
esp transport from 100.64.1.3 to 100.64.1.2 \
        spi 0x1002:0x1001 \
        auth hmac-sha2-256 enc aes \
        authkey 0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
        enckey 0x2222222222222222222222222222222222222222222222222222222222222222:0x1111111111111111111111111111111111111111111111111111111111111111
flow esp from 100.64.1.3 to 100.64.1.2
# chmod 600 /etc/ipsec.conf

設定をロードし IPsec を有効化する:

$ doas ipsecctl -f /etc/ipsec.conf
# ipsecctl -f /etc/ipsec.conf

最後に、仮想マシンからホストマシンへ ping を送り、その際のパケットを観察する:

# ping -c 1 100.64.1.2
$ doas tcpdump -i tap0
tcpdump: listening on tap0, link-type EN10MB
18:08:17.899224 100.64.1.3 > 100.64.1.2: esp spi 0x00001002 seq 2232 len 120
18:08:17.899357 100.64.1.2 > 100.64.1.3: esp spi 0x00001001 seq 2232 len 120

ICMP echo request/reply が esp により保護されていることが分かる。また、連続で ping を送った際のパケットの中身を見ることにより暗号化の雰囲気も確かめられる:

$ doas tcpdump -X -i tap0 src 100.64.1.3 and dst 100.64.1.2
tcpdump: listening on tap0, link-type EN10MB
18:12:08.278399 100.64.1.3 > 100.64.1.2: esp spi 0x00001002 seq 2268 len 120
  0000: 4500 008c 564e 0000 ff32 9a6c 6440 0103  E...VN...2.ld@..
  0010: 6440 0102 0000 1002 0000 08dc eda7 5a44  d@............ZD
  0020: 350e b060 9f2f 0295 086c fca7 e1b4 0256  5..`./...l.....V
  0030: 4134 b986 b1fc 7c8b a084 28a6 1b76 3991  A4....|...(..v9.
  0040: d97f 55ff 1367 1885 2b4c 1b00 75e2 e7e6  ..U..g..+L..u...
  0050: 9246 c60e 4915 974e 9e12 37f5 00b0 166e  .F..I..N..7....n
  0060: aafd fae1 bf35                           .....5

18:12:11.236566 100.64.1.3 > 100.64.1.2: esp spi 0x00001002 seq 2269 len 120
  0000: 4500 008c 71c1 0000 ff32 7ef9 6440 0103  E...q....2~.d@..
  0010: 6440 0102 0000 1002 0000 08dd 4637 8866  d@..........F7.f
  0020: bb89 75e9 6c95 bdf7 6dc9 3dce 2f95 c319  ..u.l...m.=./...
  0030: e7fd bb32 1eb3 8887 1d3e 2a0e b732 debc  ...2.....>*..2..
  0040: 9f33 78dc a053 651a 77be 2855 d449 62fc  .3x..Se.w.(U.Ib.
  0050: d655 ad5f 9cb3 97fe 98f5 7f17 8f36 e12f  .U._.........6./
  0060: 4a5a f829 3033                           JZ.)03

18:12:41.891498 100.64.1.3 > 100.64.1.2: esp spi 0x00001002 seq 2270 len 120
  0000: 4500 008c dbc3 0000 ff32 14f7 6440 0103  E........2..d@..
  0010: 6440 0102 0000 1002 0000 08de f1d9 bfc6  d@..............
  0020: 4038 5d7e 6e38 ef5a 06f3 da73 2ddc 5716  @8]~n8.Z...s-.W.
  0030: fdf2 a027 cf77 f4a2 f933 236e 60bc 17b7  ...'.w...3#n`...
  0040: 7282 0369 1bae a525 0cc1 18d2 8ede 1aaf  r..i...%........
  0050: c020 edcb fd8f a3e1 e86b db70 21f8 aa07  . .......k.p!...
  0060: 31db a96d f5fc                           1..m..