CentOS Stream 9
Sponsored Link

strongSwan : サーバーの設定2025/03/19

 

IPsec ベースの VPN ソリューション [strongSwan] のインストールと設定です。

当例では以下のような環境で strongSwan サーバーを設定します。

インターネットを経由するため、事前に、自身の環境で strongSwan サーバー側のローカルネットワークとインターネットの境界ルーターに、IP マスカレードの設定が必要です。

下例の場合、strongSwan クライアントからインターネットを経由して strongSwan サーバーのグローバル IP アドレス宛てに来るパケットを、[Router#1] 上で、strongSwan サーバーの IP アドレス (10.0.0.30) の 500/UDP, 4500/UDP ポートに転送するよう設定します。

  +------------------------+
  | [  strongSwan Server ] |
  |      dlp.srv.world     +--------+
  |                        |        |
  +-----------+------------+        |
        enp1s0|10.0.0.30/24         |
              |                     |
              |       Local Network |
       +------+-----+               |
-------|  Router#1  |---------------|-----
       +------+-----+               |
              |                     |
    Internet  |  Internet           |
              |                     |
       +------+-----+               |
-------|  Router#2  |---------------|-----
       +------+-----+               |
              |       Local Network |
              |                     |
        enp1s0|192.168.10.30/24     |
  +-----------+------------+        |
  |  [ strongSwan Client]  |        |
  |                        +--------+
  |                        |172.16.100.x (VPN IP)
  +------------------------+

[1]

こちらを参考に SSL/TLS 証明書を取得しておきます

[2] strongSwan をインストールします。
# EPEL からインストール

[root@dlp ~]#
dnf --enablerepo=epel -y install strongswan
[3] strongSwan の設定です。
Firewalld でルーティングルールを設定するため、Firewalld 稼働中が前提です。
# 証明書へのリンク作成

[root@dlp ~]#
ln -s /etc/letsencrypt/live/dlp.srv.world/fullchain.pem \
/etc/strongswan/swanctl/x509/fullchain.pem

[root@dlp ~]#
ln -s /etc/letsencrypt/live/dlp.srv.world/privkey.pem \
/etc/strongswan/swanctl/private/privkey.pem

[root@dlp ~]#
ln -s /etc/letsencrypt/live/dlp.srv.world/chain.pem \
/etc/strongswan/swanctl/x509ca/chain.pem
[root@dlp ~]#
vi /etc/strongswan/swanctl/conf.d/ikev2.conf
# 新規作成

connections {
    ikev2 {
        version = 2
        proposals = default,aes256-sha256-modp4096,aes256-sha256-modp2048,aes256gcm16-sha256-modp1024
        unique = never
        send_cert = always
        pools = ipv4
        fragmentation = yes

        local {
            # strongSwan サーバーのホスト名
            # 証明書に登録したホスト名と合わせる
            id = dlp.srv.world
            certs = fullchain.pem
        }
        remote {
            auth = eap-mschapv2
            eap_id = %any
        }
        children {
            child-ikev2 {
                # ローカルネットワーク
                local_ts = 10.0.0.0/24
            }
        }
    }
}

pools {
    ipv4 {
        # VPN クライアントに割り当てるネットワーク
        addrs = 172.16.100.0/24
        # VPN クライアントに割り当てるネームサーバー
        dns = 8.8.8.8
    }
}

secrets {
    # VPN ユーザーを設定
    eap-1 {
        id = vpnuser01
        secret = "userPassword01"
    }
    eap-2 {
        id = vpnuser02
        secret = "userPassword02"
    }
}

[root@dlp ~]#
chmod 600 /etc/strongswan/swanctl/conf.d/ikev2.conf
[root@dlp ~]#
vi /etc/strongswan/masquerade.sh
# 新規作成

#!/bin/bash

# ローカルネットワークに接続可能なインターフェース
IF=enp1s0

case "$1" in
    "start")
        firewall-cmd --zone=public --add-masquerade
        firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -o ${IF} -j ACCEPT
        firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o ${IF} -j MASQUERADE
        firewall-cmd --add-service=ipsec
        ;;
    "stop")
        firewall-cmd --zone=public --remove-masquerade
        firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -o ${IF} -j ACCEPT
        firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o ${IF} -j MASQUERADE
        firewall-cmd --remove-service=ipsec
        ;;
    *)
        echo "Unknown option is specified"
        ;;
esac

[root@dlp ~]#
chmod 700 /etc/strongswan/masquerade.sh

[root@dlp ~]#
systemctl edit strongswan
# 新規作成

[Service]
ExecStartPost=/etc/strongswan/masquerade.sh start
ExecStopPost=/etc/strongswan/masquerade.sh stop

[root@dlp ~]#
systemctl enable --now strongswan
[4] SELinux を有効にしている場合は、ポリシーの変更が必要です。
[root@dlp ~]#
vi swan-ipsec.te
# 以下の内容で新規作成

module swan-ipsec 1.0;

require {
        type ipsec_conf_file_t;
        type init_t;
        type lsmd_t;
        type passt_repair_exec_t;
        class file { getattr execute execute_no_trans };
}

#============= init_t ==============
allow init_t ipsec_conf_file_t:file { execute execute_no_trans };;
allow lsmd_t passt_repair_exec_t:file getattr;

[root@dlp ~]#
checkmodule -m -M -o swan-ipsec.mod swan-ipsec.te

[root@dlp ~]#
semodule_package --outfile swan-ipsec.pp --module swan-ipsec.mod

[root@dlp ~]#
semodule -i swan-ipsec.pp

関連コンテンツ