LoginSignup
0
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-25

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
    • 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アドレスを省略しても動いたので不要??

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

備忘録

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

以上です

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1