IPSec(libreswan)サーバを構築して動作検証する



# 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](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](https://qiita.com/dan-go/items/3ee70e9ea195bbb9e3c5)

Linux サーバ間 IPsec 接続 (libreswan)
[https://fsck.jp/?p=972](https://fsck.jp/?p=972)

# 各種設定
## サーバ名
片方を ***dusty***
もう片方を ***jackie***
とする

サーバ名は以下のサイトで適当に英名を出して決定しました
[http://www.elerl.com/elseeds/NameMaker/en/](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）
  * ディスク最大サイズ ２０ＧＢ、”仮想ディスクを単一ファイルとして格納” を選択
  * ハードウェアカスタマイズをクリック
    * メモリを２ＧＢに設定
    * ネットワークアダプタを２つ追加
    * LANセグメントの追加（作成）をする（Dusty-Private を作成して割当）
  * ”完了” を押して仮想マシンを起動する
* Ubuntu インストール手順
  * 以下、特に明記の無いものはで初期設定のまま ”Done” を選択肢次の項目へと移行している
  * ”Try or install Ubuntu Server” を選択
  * 言語で "English" を選択
  * keyboard configuration に ”Japanese” を選択
  * Choose type of install に ”Ubuntu Server minimized” を選択
    * ネットワークアダプタ１つ目の設定
      * Net Mask 192.168.203.0/24
      * IP Address 192.168.203.141
    * ネットワークアダプタ２つ目の設定
      * Net Mask 172.22.0.0/24
      * IP Address 172.22.0.1
    * ネットワークアダプタ３つ目の設定
      * Net Mask 172.22.0.0/24
      * IP Address 172.22.0.100
  * Your name, Your Server's name, Pick a username の３箇所に ”dusty” と入力
  * Choose a password に ”dusty1234” と入力
  * SSH Setup で ”Install OpenSSH server” にチェックを入れてインストール選択する
  * Featured Server snaps ではなにも選択せず Done
  * インストールを開始、環境によるが終了まで２０分～程度
  * ”Reboot Now” を選択肢再起動する


## 以降の作業は全て Teraterm から SSH ログインして root で行います

**以降の作業は全て Teraterm から SSH ログインして root で行います**

Teraterm の使い方等は別途調べてください
+ Teraterm で 192.168.203.141 に SSH接続
+ dusty/dusty1234 でログイン
ログイン後に 
``` bash
$ sudo su -
パスワード（dusty1234） を入力
```
として root へ昇格します

## 設定確認
以下のコマンドを入力し IP アドレスの確認を行います
```ip addr```

出力結果を見てインストール時に設定した IPアドレスが想定通りかを確認します

 ``` bash
 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

``` yaml
# 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

``` yaml
# 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 をインストールします
以下に入力したコマンドの履歴を示します、実行結果は省きます

 ``` bash
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を間違えないようにしましょう**

## 初期化

``` bash
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```


``` bash
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を間違えないようにしましょう**

## 初期化

``` bash
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```

``` bash
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 を作成します

見やすいように公開鍵を省略した例
``` ini
# 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==
```

省略無し全表示
``` ini
# 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 を作成します

見やすいように公開鍵を省略した例

``` ini
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==
```

``` ini
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 の設定ファイルを並べて見比べる

``` ini
# 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==
```

``` ini
# 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](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 側

``` bash
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 側

``` bash
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```

正常動作時の出力例
``` bash
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```

``` bash
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
```

``` bash
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 を諦めた理由
## 理由１ systemd が上手く動作しなかった、
``` docker run -d --privileged --name docker_test centos /sbin/init```
とすることで起動できるとのことだったがそれも上手くいかず、2021年より前のLinuxだと動いた

## 理由２ ipsecから権限関係と思われるエラーが出て直せなかった
エラーメッセージ等失念しましたが systemctl を使えるようにした後に ipsec を起動したところファイルが読めない的なエラーが出て ipsec が起動できませんでした、該当ファイルを調査したところ権限問題は無さそうでしたので原因不明のままです

libreswan の Docker Image があるようなのでできないことはないんだろうと思いますが、自分はできませんでした

curtine/libreswan
[https://hub.docker.com/r/curtine/libreswan/](https://hub.docker.com/r/curtine/libreswan/)

# PSK 認証したい場合
```/etc/ipsec.d/hostkey.secrets```
に以下のように追記します
```
[left ip] [right ip] : PSK "mypresharedkey"
例１：
999.999.999.999 999.999.999.999 : PSK "hogehogehoge..."
例２：
 : PSK "hogehogehoge..."
※例２のようにIPアドレスを省略しても動いたので不要？？
```

libreswanの認証方法
[https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/securing_networks/con_authentication-methods-in-libreswan_configuring-a-vpn-with-ipsec](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/securing_networks/con_authentication-methods-in-libreswan_configuring-a-vpn-with-ipsec)

# 備忘録

* ネットワーク設定を変更したら 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 を見比べて同一かどうかを確認

以上です