IPSec(libreswan)サーバを構築して動作検証する
仕事で IPSec の検証する必要があり構築したのでメモを残します
本当は Docker でやりたかったのですができなかったので VMWare で実施しました
参考にしたサイト
4.6. Libreswan を使った仮想プライベートネットワーク (VPN) の保護
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/sec-securing_virtual_private_networks
【Linux】OSSでVPNを構築しよう
https://qiita.com/dan-go/items/3ee70e9ea195bbb9e3c5
Linux サーバ間 IPsec 接続 (libreswan)
https://fsck.jp/?p=972
各種設定
サーバ名
片方を dusty
もう片方を jackie
とする
サーバ名は以下のサイトで適当に英名を出して決定しました
http://www.elerl.com/elseeds/NameMaker/en/
IPアドレス設定
サーバ名 | IPSec GW | トンネルセグメント |
---|---|---|
dusty | 192.168.203.141 | 172.21.0.0/24 |
jackie | 192.168.203.142 | 172.22.0.0/24 |
192.168.203.141, 192.168.203.142 を IPSec Gateway(普通ならグローバルIPが指定される箇所) とし
172.21.0.0/24 と 172.22.0.0/24 をトンネル接続することを目標とします
トンネル名を mytunnel とします
dusty 設定表
項目名 | 値 |
---|---|
仮想マシン名 | Ubuntu22-64bit-Dusty |
LANセグメント | Dusty-Private |
サーバ名 | dusty |
ユーザー名 | dusty |
パスワード | dusty1234 |
ens33 Net Mask | 192.168.203.0/24 |
ens33 IP Address | 192.168.203.141 |
ens33 Gateway | 192.168.203.2 |
ens33 DNS | 8.8.8.8 |
ens34 Net Mask | 172.21.0.0/24 不使用 |
ens34 IP Address | 172.21.0.1 不使用 |
ens35 Net Mask | 172.21.0.0/24 |
ens35 IP Address | 172.21.0.100 |
jackie 設定表
項目名 | 値 |
---|---|
仮想マシン名 | Ubuntu22-64bit-Jackie |
LANセグメント | Jackie-Private |
サーバ名 | jackie |
ユーザー名 | jackie |
パスワード | jackie1234 |
ens33 Net Mask | 192.168.203.0/24 |
ens33 IP Address | 192.168.203.142 |
ens33 Gateway | 192.168.203.2 |
ens33 DNS | 8.8.8.8 |
ens34 Net Mask | 172.22.0.0/24 不使用 |
ens34 IP Address | 172.22.0.1 不使用 |
ens35 Net Mask | 172.22.0.0/24 |
ens35 IP Address | 172.22.0.100 |
環境構築
VMWare 17(フリー版)
ubuntu 22(ubuntu-22.04.2-live-server-amd64.iso)
以下、dusty の構築を解説します
jackie の構築は前述の表を参考にして入力値を適宜置き換えることで jackie の構築解説としてください
設定とインストール
- VMWare Player上の設定
- VMWare Player を起動
- ”新規仮想マシンの作成” をクリック
- ISOイメージを指定(今回は ubuntu-22.04.2-live-server-amd64.iso)
- 仮想マシン名を入力(Ubuntu22-64bit-Dusty or Ubuntu22-64bit-Jackie)
- ディスク最大サイズ 20GB、”仮想ディスクを単一ファイルとして格納” を選択
- ハードウェアカスタマイズをクリック
- メモリを2GBに設定
- ネットワークアダプタを2つ追加
- LANセグメントの追加(作成)をする(Dusty-Private を作成して割当)
- ”完了” を押して仮想マシンを起動する
- Ubuntu インストール手順
- 以下、特に明記の無いものはで初期設定のまま ”Done” を選択肢次の項目へと移行している
- ”Try or install Ubuntu Server” を選択
- 言語で "English" を選択
- keyboard configuration に ”Japanese” を選択
- Choose type of install に ”Ubuntu Server minimized” を選択
- ネットワークアダプタ1つ目の設定
- Net Mask 192.168.203.0/24
- IP Address 192.168.203.141
- ネットワークアダプタ2つ目の設定
- Net Mask 172.22.0.0/24
- IP Address 172.22.0.1
- ネットワークアダプタ3つ目の設定
- Net Mask 172.22.0.0/24
- IP Address 172.22.0.100
- ネットワークアダプタ1つ目の設定
- Your name, Your Server's name, Pick a username の3箇所に ”dusty” と入力
- Choose a password に ”dusty1234” と入力
- SSH Setup で ”Install OpenSSH server” にチェックを入れてインストール選択する
- Featured Server snaps ではなにも選択せず Done
- インストールを開始、環境によるが終了まで20分~程度
- ”Reboot Now” を選択肢再起動する
以降の作業は全て Teraterm から SSH ログインして root で行います
以降の作業は全て Teraterm から SSH ログインして root で行います
Teraterm の使い方等は別途調べてください
- Teraterm で 192.168.203.141 に SSH接続
- dusty/dusty1234 でログイン
ログイン後に
$ sudo su -
パスワード(dusty1234) を入力
として root へ昇格します
設定確認
以下のコマンドを入力し IP アドレスの確認を行います
ip addr
出力結果を見てインストール時に設定した IPアドレスが想定通りかを確認します
dusty@dusty:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1b:bf:ca brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.203.141/24 brd 192.168.203.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe1b:bfca/64 scope link
valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1b:bf:d4 brd ff:ff:ff:ff:ff:ff
altname enp2s2
inet 172.21.0.1/24 brd 172.21.0.255 scope global ens34
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe1b:bfd4/64 scope link
valid_lft forever preferred_lft forever
4: ens35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1b:bf:de brd ff:ff:ff:ff:ff:ff
altname enp2s3
inet 172.21.0.100/24 brd 172.21.0.255 scope global ens35
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe1b:bfde/64 scope link
valid_lft forever preferred_lft forever
dusty@dusty:~$
想定通りでない場合は /etc/netplan/00-installer-config.yaml を編集し
netplan apply
を実行し設定内容を反映させます
プライベートアドレスのルーティング設定
dusty 側は 172.22.0.0/24 に到達するために 172.21.0.100 を参照するよう指示します
jackie 側は 172.21.0.0/24 に到達するために 172.22.0.100 を参照するよう指示します
dusty ネットワーク設定ファイル
編集対象は ens35
# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
addresses:
- 192.168.203.141/24
routes:
- to: default
via: 192.168.203.2
nameservers:
addresses: [192.168.203.2, 8.8.8.8, 8.8.4.4]
search: []
ens34:
addresses:
- 172.21.0.1/24
nameservers:
addresses: []
search: []
ens35:
addresses: [172.21.0.100/24]
routes:
- to: 172.22.0.0/24
via: 172.21.0.100
version: 2
jackie 側ネットワーク設定ファイル
編集対象は ens35
# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
addresses:
- 192.168.203.142/24
routes:
- to: default
via: 192.168.203.2
nameservers:
addresses: [192.168.203.2, 8.8.8.8, 8.8.4.4]
search: []
ens34:
addresses:
- 172.22.0.1/24
nameservers:
addresses: []
search: []
ens35:
addresses: [172.22.0.100/24]
routes:
- to: 172.21.0.0/24
via: 172.22.0.100
version: 2
色々インストール
apt update, apt upgrade を行い、vim, netcat, telnet, iputils-ping net-tools, tcpdump, libreswan をインストールします
以下に入力したコマンドの履歴を示します、実行結果は省きます
root@dusty:~# history
1 apt update
2 apt upgrade
3 apt install -y vim
4 apt install -y netcat
5 apt install -y netcat telnet
6 apt install -y netcat iputils-ping net-tools
7 apt install -y tcpdump
8 apt install -y libreswan
9 history
jackie の構築
dusty の構築手順の文字・設定値を適切に入れ替え jackie 構築をしてください
dusty 側の作業、libreswan の設定RSA鍵の準備
dusty 側にRSA鍵を作成します
left, rightを間違えないようにしましょう
初期化
root@dusty:~# ipsec initnss
Initializing NSS database
初期化コマンドが失敗する場合は rm /var/lib/ipsec/nss/*.db を実行する
RSA鍵の作成
ipsec コマンドの newhostkey オプションでキーを作成する
ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
showhostkey オプションで公開鍵を確認する
ipsec showhostkey --left --ckaid [CKAID]
newhostkey で作成したファイルを参照することでも公開鍵を確認できる、どちらでも良い
cat /etc/ipsec.d/hostkey.secrets
root@dusty:~# ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
Generated RSA key pair with CKAID bcfc19195e575632b88905208c2938f30ac05d27 was stored in the NSS database
root@dusty:~#
root@dusty:~# ipsec showhostkey --left --ckaid bcfc19195e575632b88905208c2938f30ac05d27
# rsakey AwEAAcIUf
leftrsasigkey=0sAwEAAcIUfChAfmvj7v1uiSaQuGsxaMCnfLGo5xJO1lgHmDUaNw3SJH+k/2TxJOPfQj1VLCV0ixZZi8MRtWlphnqW+UgL/OqbKWACwOkSh08ElFyF7oqZGSdCuoN/5+OCBOA+quZAQY5hMbPn8vJx8zGEkMAaGvMzk8Uy2fFRTbJPkeVcFgQDoE/7qQJMtrV6kZCRg7kZbQxbOhZuTlVqgY98zjeflnSY1jjyAmYKVzKghkPvRoGDjbSzDb1ZOMtmC1RDztkXXcrLvLsAxsFwW2l+RYaRtmvZUp73T7DwKn5vWpUh1OjXRSpVb7fGeNH1h8NREvuhjGhYLI2e8Vpl1SOKFzMLWhanwNT+CtNxs5NjK+DHN7LL+Ewa2J4ectXMHKCoALmRHf6rKtAuAmDqQVWXFO1zJPjpsy607v4VqOGs2K3LkSHoXtJk9A7at4tLrm4rywTj9jEi6OU9QyYQjb6V1qIDx4FD4mpbG4Dm3fnULlI4ct8EQ+CQAKZSaHDSxsEo+BbJkMlQtj0FL320A/LJDib+orZDurF9tJkTGRU2eRc9xJ/iYcvH/1ddvn/6OrG7WIYDpeZTOAYjuZS5Tow8P2aNk7BtXUdIT4M/oQ4We2U/jIxl/hUvneaTDY9usXCL8y6/rN3M7w==
root@dusty:~#
root@dusty:~# ipsec showhostkey --list
< 1> RSA keyid: AwEAAcIUf ckaid: bcfc19195e575632b88905208c2938f30ac05d27
root@dusty:~#
作成した公開鍵は cat /etc/ipsec.d/hostkey.secrets で確認できます
jackie 側の作業、libreswan の設定RSA鍵の準備
jackie 側にRSA鍵を作成します
left, rightを間違えないようにしましょう
初期化
root@jackie:~# ipsec initnss
Initializing NSS database
初期化コマンドが失敗する場合は rm /var/lib/ipsec/nss/*.db を実行する
RSA鍵の作成
ipsec コマンドの newhostkey オプションでキーを作成する
ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
showhostkey オプションで公開鍵を確認する
ipsec showhostkey --right --ckaid [CKAID]
newhostkey で作成したファイルを参照することでも公開鍵を確認できる、どちらでも良い
cat /etc/ipsec.d/hostkey.secrets
root@jackie:~# ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
Generated RSA key pair with CKAID 24f7821e372cd198c436cb9da0024ddd2092eade was stored in the NSS database
root@jackie:~#
root@jackie:~# ipsec showhostkey --right --ckaid 24f7821e372cd198c436cb9da0024ddd2092eade
# rsakey AwEAAbl5p
rightrsasigkey=0sAwEAAbl5pGY3fypB6EcdFkgFAb1TLngPCcjJpF0Q4tIY1Z4nHQ7SCN9WVqJMTV+dC2kCcf7VFWiOJnj1ZXNReCwYbWjoPUws7A55uQmolj4rSFpFUjT/DmTxRfYncPU7QagKDRk0P6WIIDnbj1UPeA74lVO1hrSDhDrQf1km9mzet0a7wUK3LFtZ+TM0T6MqvMyl3kTRw2truLeUBGRmgY02yJnnD1TZVIjfBG+/pN80pIBb1cJb7s0WGIqcc6XgagMD6ujcL+0HGeQUT9ecnL8I4/t90wPXSXoJkkYxkDUud2xWVRXC5oIVIRkgHV1duCEhYK+L7fWcoV+aAjcrZ0d60/r1ymxQCUXoskLcIcwhcDwYIeZYgXYzJsocOEmC0126QX2YZkQ0xNpOg+g+7VzWuno1gQDNyH+tEMfGDe+3+IB1vwyDpLR9PRlEYxExZ9ONjZkE+9f4Gpqc7CU/d5/f5mTHXs7XqEOb1zipXlKjtEHjRZM6PbK9ac4YuZlr9NQndaJbySmF0EVZPcoxGY+QFv3jidDeVbYI/54Svb8RjhEMK0E2CmOggdYc0w==
root@jackie:~# ipsec showhostkey --list
< 1> RSA keyid: AwEAAbl5p ckaid: 24f7821e372cd198c436cb9da0024ddd2092eade
root@jackie:~#
作成した公開鍵は cat /etc/ipsec.d/hostkey.secrets で確認できます
設定ファイルの作成
dusty 側の作業、設定ファイルの作成
ファイル /etc/ipsec.d/my_host-to-host.conf を作成します
見やすいように公開鍵を省略した例
# vi /etc/ipsec.d/my_host-to-host.conf
conn mytunnel
authby=rsasig
auto=start
#leftid=@left.example.com
left=192.168.203.141
leftsubnet=172.21.0.0/24
leftrsasigkey=0sAw[...]N3M7w==
#rightid=@right.example.com
right=192.168.203.142
rightsubnet=172.22.0.0/24
rightrsasigkey=0sAw[...]Yc0w==
省略無し全表示
# vi /etc/ipsec.d/my_host-to-host.conf
conn mytunnel
authby=rsasig
auto=start
#leftid=@left.example.com
left=192.168.203.141
leftsubnet=172.21.0.0/24
leftrsasigkey=0sAwEAAcIUfChAfmvj7v1uiSaQuGsxaMCnfLGo5xJO1lgHmDUaNw3SJH+k/2TxJOPfQj1VLCV0ixZZi8MRtWlphnqW+UgL/OqbKWACwOkSh08ElFyF7oqZGSdCuoN/5+OCBOA+quZAQY5hMbPn8vJx8zGEkMAaGvMzk8Uy2fFRTbJPkeVcFgQDoE/7qQJMtrV6kZCRg7kZbQxbOhZuTlVqgY98zjeflnSY1jjyAmYKVzKghkPvRoGDjbSzDb1ZOMtmC1RDztkXXcrLvLsAxsFwW2l+RYaRtmvZUp73T7DwKn5vWpUh1OjXRSpVb7fGeNH1h8NREvuhjGhYLI2e8Vpl1SOKFzMLWhanwNT+CtNxs5NjK+DHN7LL+Ewa2J4ectXMHKCoALmRHf6rKtAuAmDqQVWXFO1zJPjpsy607v4VqOGs2K3LkSHoXtJk9A7at4tLrm4rywTj9jEi6OU9QyYQjb6V1qIDx4FD4mpbG4Dm3fnULlI4ct8EQ+CQAKZSaHDSxsEo+BbJkMlQtj0FL320A/LJDib+orZDurF9tJkTGRU2eRc9xJ/iYcvH/1ddvn/6OrG7WIYDpeZTOAYjuZS5Tow8P2aNk7BtXUdIT4M/oQ4We2U/jIxl/hUvneaTDY9usXCL8y6/rN3M7w==
#rightid=@right.example.com
right=192.168.203.142
rightsubnet=172.22.0.0/24
rightrsasigkey=0sAwEAAbl5pGY3fypB6EcdFkgFAb1TLngPCcjJpF0Q4tIY1Z4nHQ7SCN9WVqJMTV+dC2kCcf7VFWiOJnj1ZXNReCwYbWjoPUws7A55uQmolj4rSFpFUjT/DmTxRfYncPU7QagKDRk0P6WIIDnbj1UPeA74lVO1hrSDhDrQf1km9mzet0a7wUK3LFtZ+TM0T6MqvMyl3kTRw2truLeUBGRmgY02yJnnD1TZVIjfBG+/pN80pIBb1cJb7s0WGIqcc6XgagMD6ujcL+0HGeQUT9ecnL8I4/t90wPXSXoJkkYxkDUud2xWVRXC5oIVIRkgHV1duCEhYK+L7fWcoV+aAjcrZ0d60/r1ymxQCUXoskLcIcwhcDwYIeZYgXYzJsocOEmC0126QX2YZkQ0xNpOg+g+7VzWuno1gQDNyH+tEMfGDe+3+IB1vwyDpLR9PRlEYxExZ9ONjZkE+9f4Gpqc7CU/d5/f5mTHXs7XqEOb1zipXlKjtEHjRZM6PbK9ac4YuZlr9NQndaJbySmF0EVZPcoxGY+QFv3jidDeVbYI/54Svb8RjhEMK0E2CmOggdYc0w==
jackie 側の作業、設定ファイルの作成
ファイル /etc/ipsec.d/my_host-to-host.conf を作成します
見やすいように公開鍵を省略した例
conn mytunnel
authby=rsasig
auto=start
#leftid=@left.example.com
left=192.168.203.142
leftsubnet=172.22.0.0/24
leftrsasigkey=0sAw[...]Yc0w==
#rightid=@right.example.com
right=192.168.203.141
rightsubnet=172.21.0.0/24
rightrsasigkey=0sAw[...]N3M7w==
conn mytunnel
authby=rsasig
auto=start
#leftid=@left.example.com
left=192.168.203.142
leftsubnet=172.22.0.0/24
leftrsasigkey=0sAwEAAbl5pGY3fypB6EcdFkgFAb1TLngPCcjJpF0Q4tIY1Z4nHQ7SCN9WVqJMTV+dC2kCcf7VFWiOJnj1ZXNReCwYbWjoPUws7A55uQmolj4rSFpFUjT/DmTxRfYncPU7QagKDRk0P6WIIDnbj1UPeA74lVO1hrSDhDrQf1km9mzet0a7wUK3LFtZ+TM0T6MqvMyl3kTRw2truLeUBGRmgY02yJnnD1TZVIjfBG+/pN80pIBb1cJb7s0WGIqcc6XgagMD6ujcL+0HGeQUT9ecnL8I4/t90wPXSXoJkkYxkDUud2xWVRXC5oIVIRkgHV1duCEhYK+L7fWcoV+aAjcrZ0d60/r1ymxQCUXoskLcIcwhcDwYIeZYgXYzJsocOEmC0126QX2YZkQ0xNpOg+g+7VzWuno1gQDNyH+tEMfGDe+3+IB1vwyDpLR9PRlEYxExZ9ONjZkE+9f4Gpqc7CU/d5/f5mTHXs7XqEOb1zipXlKjtEHjRZM6PbK9ac4YuZlr9NQndaJbySmF0EVZPcoxGY+QFv3jidDeVbYI/54Svb8RjhEMK0E2CmOggdYc0w==
#rightid=@right.example.com
right=192.168.203.141
rightsubnet=172.21.0.0/24
rightrsasigkey=0sAwEAAcIUfChAfmvj7v1uiSaQuGsxaMCnfLGo5xJO1lgHmDUaNw3SJH+k/2TxJOPfQj1VLCV0ixZZi8MRtWlphnqW+UgL/OqbKWACwOkSh08ElFyF7oqZGSdCuoN/5+OCBOA+quZAQY5hMbPn8vJx8zGEkMAaGvMzk8Uy2fFRTbJPkeVcFgQDoE/7qQJMtrV6kZCRg7kZbQxbOhZuTlVqgY98zjeflnSY1jjyAmYKVzKghkPvRoGDjbSzDb1ZOMtmC1RDztkXXcrLvLsAxsFwW2l+RYaRtmvZUp73T7DwKn5vWpUh1OjXRSpVb7fGeNH1h8NREvuhjGhYLI2e8Vpl1SOKFzMLWhanwNT+CtNxs5NjK+DHN7LL+Ewa2J4ectXMHKCoALmRHf6rKtAuAmDqQVWXFO1zJPjpsy607v4VqOGs2K3LkSHoXtJk9A7at4tLrm4rywTj9jEi6OU9QyYQjb6V1qIDx4FD4mpbG4Dm3fnULlI4ct8EQ+CQAKZSaHDSxsEo+BbJkMlQtj0FL320A/LJDib+orZDurF9tJkTGRU2eRc9xJ/iYcvH/1ddvn/6OrG7WIYDpeZTOAYjuZS5Tow8P2aNk7BtXUdIT4M/oQ4We2U/jIxl/hUvneaTDY9usXCL8y6/rN3M7w==
left, right がややこしいので dusty, jackie の設定ファイルを並べて見比べる
# dusty
# vi /etc/ipsec.d/my_host-to-host.conf
conn mytunnel
authby=rsasig
auto=start
#leftid=@left.example.com
left=192.168.203.141
leftsubnet=172.21.0.0/24
leftrsasigkey=0sAw[...]N3M7w==
#rightid=@right.example.com
right=192.168.203.142
rightsubnet=172.22.0.0/24
rightrsasigkey=0sAw[...]Yc0w==
# jackie
conn mytunnel
authby=rsasig
auto=start
#leftid=@left.example.com
left=192.168.203.142
leftsubnet=172.22.0.0/24
leftrsasigkey=0sAw[...]Yc0w==
#rightid=@right.example.com
right=192.168.203.141
rightsubnet=172.21.0.0/24
rightrsasigkey=0sAw[...]N3M7w==
dusty の left は 192.168.203.141
jackie の left は 192.168.203.142
と、left, right が入れ替わっています、subnet等も同様です
left, right は主観で見た時の自分の機器(left)と対向側の機器(right)という視点で考えます
慣例?で left=設定のある機器、right=対向側の機器 とするらしいです
入れ替わっても動くらしいですが面倒なので実験してません、とりあえず基本的な設定・操作に従って作っていきます
left/right について多少書いてある記事
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/vpn_configurations_using_libreswan
トンネル作成
ipsec を再起動します
systemctl restart ipsec
トンネルを作成して有効化します
ipsec auto --add mytunnel
ipsec auto --up mytunnel
dusty 側
root@dusty:~# systemctl restart ipsec
root@dusty:~# ipsec auto --add mytunnel
002 "mytunnel": terminating SAs using this connection
002 "mytunnel" #3: deleting state (STATE_V2_IPSEC_R) aged 175.396s and sending notification
005 "mytunnel" #3: ESP traffic information: in=0B out=0B
002 "mytunnel" #2: deleting state (STATE_PARENT_R2) aged 175.436s and sending notification
002 added connection description "mytunnel"
root@dusty:~# ipsec auto --up mytunnel
188 "mytunnel" #6: STATE_V2_CREATE_I: sent IPsec Child req wait response
002 "mytunnel" #6: negotiated connection [172.21.0.0-172.21.0.255:0-65535 0] -> [172.22.0.0-172.22.0.255:0-65535 0]
004 "mytunnel" #6: STATE_V2_IPSEC_I: IPsec SA established tunnel mode {ESP=>0xb72ae0ea <0x680c73dd xfrm=AES_GCM_16_256-NONE-MODP2048 NATOA=none NATD=none DPD=passive}
root@dusty:~#
jackie 側
root@jackie:~# systemctl restart ipsec
root@jackie:~# ipsec auto --add mytunnel
002 "mytunnel": terminating SAs using this connection
002 "mytunnel" #7: deleting state (STATE_V2_IPSEC_R) aged 29.812s and sending notification
005 "mytunnel" #7: ESP traffic information: in=0B out=0B
002 "mytunnel" #6: deleting state (STATE_V2_IPSEC_I) aged 35.192s and sending notification
005 "mytunnel" #6: ESP traffic information: in=0B out=0B
002 "mytunnel" #5: deleting state (STATE_PARENT_I3) aged 35.211s and sending notification
002 added connection description "mytunnel"
root@jackie:~# ipsec auto --up mytunnel
188 "mytunnel" #10: STATE_V2_CREATE_I: sent IPsec Child req wait response
002 "mytunnel" #10: negotiated connection [172.22.0.0-172.22.0.255:0-65535 0] -> [172.21.0.0-172.21.0.255:0-65535 0]
004 "mytunnel" #10: STATE_V2_IPSEC_I: IPsec SA established tunnel mode {ESP=>0xd567964d <0x481a97c4 xfrm=AES_GCM_16_256-NONE-MODP2048 NATOA=none NATD=none DPD=passive}
root@jackie:~#
トンネルの削除は以下のコマンドで行う
ipsec auto --delete mytunnel
動作確認
以下のコマンドで ipsec の動作状況、エラー等を確認します
ipsec status
以下のコマンドで ipsecデーモン の動作状況、エラー等を確認します
systemctl status ipsec
以下のコマンドで established のキーワードがあれば正常動作しています
ipsec status | grep STAT
正常動作時の出力例
root@dusty:~# ipsec status | grep STAT
000 #2: "mytunnel":500 STATE_PARENT_R2 (received v2I2, PARENT SA established); EVENT_SA_REKEY in 1911s; newest ISAKMP; idle;
000 #3: "mytunnel":500 STATE_V2_IPSEC_R (IPsec SA established); EVENT_SA_REKEY in 27112s; isakmp#2; idle;
000 #4: "mytunnel":500 STATE_V2_IPSEC_R (IPsec SA established); EVENT_SA_REKEY in 27312s; newest IPSEC; eroute owner; isakmp#2; idle;
root@dusty:~#
疎通確認
dusty 側から jackie 側へ ping が通ることを確認する
ping 172.22.0.100
jackie 側から dusty 側へ ping が通ることを確認する
ping 172.21.0.100
ipsec が動作していなければ ping が通らないということも確認しておく
systemctl stop ipsec
として ipsec を停止する、停止した状態で前述の疎通確認をし、通信できないことを確認する
暗号化パケットになっているかの確認
dusty 側から jackie 側への ping を実行
ping 172.22.0.100
jackie 側で tcpdump を実行し ESP パケットを確認する
tcpdump -n -i ens33 not tcp port 22
root@dusty:~# ping 172.22.0.100
PING 172.22.0.100 (172.22.0.100) 56(84) bytes of data.
64 bytes from 172.22.0.100: icmp_seq=1 ttl=64 time=0.461 ms
64 bytes from 172.22.0.100: icmp_seq=2 ttl=64 time=0.600 ms
64 bytes from 172.22.0.100: icmp_seq=3 ttl=64 time=0.605 ms
64 bytes from 172.22.0.100: icmp_seq=4 ttl=64 time=0.755 ms
64 bytes from 172.22.0.100: icmp_seq=5 ttl=64 time=0.553 ms
root@jackie:~# tcpdump -n -i ens33 not tcp port 22
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:08:10.601665 IP 192.168.203.141 > 192.168.203.142: ESP(spi=0x75ea31c7,seq=0x26), length 120
13:08:10.601665 IP 172.21.0.100 > 172.22.0.100: ICMP echo request, id 5, seq 2, length 64
13:08:10.601735 IP 192.168.203.142 > 192.168.203.141: ESP(spi=0xfe380553,seq=0x26), length 120
13:08:11.249638 ARP, Request who-has 192.168.203.141 (00:0c:29:1b:bf:ca) tell 192.168.203.1, length 46
13:08:11.249845 ARP, Reply 192.168.203.141 is-at 00:0c:29:1b:bf:ca, length 46
13:08:11.625719 IP 192.168.203.141 > 192.168.203.142: ESP(spi=0x75ea31c7,seq=0x27), length 120
13:08:11.625719 IP 172.21.0.100 > 172.22.0.100: ICMP echo request, id 5, seq 3, length 64
13:08:11.625777 IP 192.168.203.142 > 192.168.203.141: ESP(spi=0xfe380553,seq=0x27), length 120
13:08:12.649675 IP 192.168.203.141 > 192.168.203.142: ESP(spi=0x75ea31c7,seq=0x28), length 120
13:08:12.649675 IP 172.21.0.100 > 172.22.0.100: ICMP echo request, id 5, seq 4, length 64
13:08:12.649749 IP 192.168.203.142 > 192.168.203.141: ESP(spi=0xfe380553,seq=0x28), length 120
13:08:13.252937 ARP, Request who-has 192.168.203.142 (00:0c:29:9d:33:b0) tell 192.168.203.1, length 46
13:08:13.252949 ARP, Reply 192.168.203.142 is-at 00:0c:29:9d:33:b0, length 28
13:08:13.520289 IP 192.168.203.1.51987 > 255.255.255.255.8610: UDP, length 16
13:08:13.520289 IP 192.168.203.1.51987 > 255.255.255.255.8610: UDP, length 16
13:08:13.673505 IP 192.168.203.141 > 192.168.203.142: ESP(spi=0x75ea31c7,seq=0x29), length 120
13:08:13.673505 IP 172.21.0.100 > 172.22.0.100: ICMP echo request, id 5, seq 5, length 64
13:08:13.673577 IP 192.168.203.142 > 192.168.203.141: ESP(spi=0xfe380553,seq=0x29), length 120
以上が IPSec の最低限の疎通確認までの作業です
以降は備忘録等になります
ポート番号の確認と疎通確認
IPSec は UDP 50, 500, 4500 を使用します
systemctl stop ipsec
として一旦 ipsec を停止します
UDP 4500 の疎通確認
以下の手順でサーバ・クライアントでnetcatを実行することで疎通確認が可能
# server
# 192.168.203.141 で実行
nc -lu 4500
# client
# 192.168.203.142 で実行
nc -u 192.168.203.141 4500
~適当になにかを入力してエンターを押す~
Docker を諦めた理由
理由1 systemd が上手く動作しなかった、
docker run -d --privileged --name docker_test centos /sbin/init
とすることで起動できるとのことだったがそれも上手くいかず、2021年より前のLinuxだと動いた
理由2 ipsecから権限関係と思われるエラーが出て直せなかった
エラーメッセージ等失念しましたが systemctl を使えるようにした後に ipsec を起動したところファイルが読めない的なエラーが出て ipsec が起動できませんでした、該当ファイルを調査したところ権限問題は無さそうでしたので原因不明のままです
libreswan の Docker Image があるようなのでできないことはないんだろうと思いますが、自分はできませんでした
curtine/libreswan
https://hub.docker.com/r/curtine/libreswan/
PSK 認証したい場合
/etc/ipsec.d/hostkey.secrets
に以下のように追記します
[left ip] [right ip] : PSK "mypresharedkey"
例1:
999.999.999.999 999.999.999.999 : PSK "hogehogehoge..."
例2:
: PSK "hogehogehoge..."
※例2のようにIPアドレスを省略しても動いたので不要??
備忘録
- ネットワーク設定を変更したら netplan apply 、実行しないと設定ファイルの内容が反映されない
- systemctl start ipsec で ipsec サーバの起動
- systemctl stop ipsec で ipsec サーバの停止
- systemctl restart ipsec で ipsec サーバの再起動
- ipsec auto --add [トンネル名] でトンネルの追加
- ipsec auto --up [トンネル名] でトンネルの有効化
- ipsec auto --delete [トンネル名] でトンネルの削除
- 公開鍵エラーの時は leftrsasigkey, rightrsasigkey へのコピペミスかも
- 公開鍵エラーの時は cat /etc/ipsec.d/hostkey.secrets の pubkey=??? の値と [left|right]sasigkey を見比べて同一かどうかを確認
以上です