5.13. RHEL システムロールを使用した VPN 接続の設定


VPN は、信頼できないネットワーク経由でトラフィックをセキュアに送信するための暗号化接続です。vpn RHEL システムロールを使用すると、VPN 設定の作成プロセスを自動化できます。

注記

vpn RHEL システムロールは、VPN プロバイダーとして、IPsec 実装である Libreswan のみをサポートしています。

5.13.1. vpn RHEL システムロールを使用して PSK 認証によるホスト間 IPsec VPN を作成する

IPsec を使用すると、VPN を介してホストを相互に直接接続できます。ホストは事前共有鍵 (PSK) を使用して相互に認証できます。vpn RHEL システムロールを使用すると、PSK 認証による IPsec ホスト間接続を作成するプロセスを自動化できます。

デフォルトでは、このロールはトンネルベースの VPN を作成します。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    Copy to Clipboard Toggle word wrap
    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - hosts:
                  managed-node-01.example.com:
                  managed-node-02.example.com:
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true

    サンプル Playbook で指定されている設定は次のとおりです。

    hosts: <list>

    VPN を設定するホストを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、hostname パラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。

    Copy to Clipboard Toggle word wrap
              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1

    このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は <host_A>-to-<host_B> です (例: managed-node-01.example.com-to-managed-node-02.example.com)。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなホストでは手動で設定を作成する必要があります。

    auth_method: psk
    ホスト間の PSK 認証を有効にします。ロールはコントロールノードで openssl を使用して PSK を作成します。
    auto: <start-up_method>
    接続の起動方法を指定します。有効な値は addondemandstart、および ignore です。詳細は、Libreswan がインストールされているシステム上の ipsec.conf(5) man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。
    vpn_manage_firewall: true
    ロールにより、管理対象ノード上の firewalld サービスで必要なポートを開くことを指定します。
    vpn_manage_selinux: true
    ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    Copy to Clipboard Toggle word wrap
    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    Copy to Clipboard Toggle word wrap
    $ ansible-playbook ~/playbook.yml

検証

  • 接続が正常に開始されたことを確認します。次に例を示します。

    Copy to Clipboard Toggle word wrap
    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'

    このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の auto 変数を start 以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。

関連情報

  • /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイル
  • /usr/share/doc/rhel-system-roles/vpn/ ディレクトリー

5.13.2. vpn RHEL システムロールを使用して、個別のデータプレーンとコントロールプレーンおよび PSK 認証によるホスト間 IPsec VPN を作成する

IPsec を使用すると、VPN を介してホストを相互に直接接続できます。たとえば、制御メッセージの傍受や妨害のリスクを最小限に抑えてセキュリティーを強化するために、データトラフィックと制御トラフィックの両方に個別の接続を設定できます。vpn RHEL システムロールを使用すると、個別のデータプレーンとコントロールプレーンおよび PSK 認証を使用して IPsec ホスト間接続を作成するプロセスを自動化できます。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    Copy to Clipboard Toggle word wrap
    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - name: control_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 203.0.113.1  # IP address for the control plane
                  managed-node-02.example.com:
                    hostname: 198.51.100.2 # IP address for the control plane
                auth_method: psk
                auto: start
              - name: data_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 10.0.0.1   # IP address for the data plane
                  managed-node-02.example.com:
                    hostname: 172.16.0.2 # IP address for the data plane
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true

    サンプル Playbook で指定されている設定は次のとおりです。

    hosts: <list>

    VPN を設定するホストを含む YAML ディクショナリーを定義します。接続の名前は <name>-<IP_address_A>-to-<IP_address_B> です (例: control_plane_vpn-203.0.113.1-to-198.51.100.2)。

    このロールは、各管理対象ノード上の VPN 接続を設定します。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなホストでは手動で設定を作成する必要があります。

    auth_method: psk
    ホスト間の PSK 認証を有効にします。ロールはコントロールノードで openssl を使用して事前共有鍵を作成します。
    auto: <start-up_method>
    接続の起動方法を指定します。有効な値は addondemandstart、および ignore です。詳細は、Libreswan がインストールされているシステム上の ipsec.conf(5) man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。
    vpn_manage_firewall: true
    ロールにより、管理対象ノード上の firewalld サービスで必要なポートを開くことを指定します。
    vpn_manage_selinux: true
    ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    Copy to Clipboard Toggle word wrap
    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    Copy to Clipboard Toggle word wrap
    $ ansible-playbook ~/playbook.yml

検証

  • 接続が正常に開始されたことを確認します。次に例を示します。

    Copy to Clipboard Toggle word wrap
    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
    ...
    006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'

    このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の auto 変数を start 以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。

関連情報

  • /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイル
  • /usr/share/doc/rhel-system-roles/vpn/ ディレクトリー

5.13.3. vpn RHEL システムロールを使用して、証明書ベースの認証による複数ホスト間の IPsec メッシュ VPN を作成する

Libreswan はオポチュニスティックメッシュの作成をサポートしています。これは、各ホストで 1 つの設定を使用して、多数のホスト間で IPsec 接続を確立するためのものです。メッシュにホストを追加する場合、既存のホストの設定を更新する必要はありません。セキュリティーを強化するには、Libreswan で証明書ベースの認証を使用します。

vpn RHEL システムロールを使用すると、証明書ベースの認証による管理対象ノード間の VPN メッシュの設定を自動化できます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している。
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • 各管理対象ノード用に PKCS #12 ファイルを用意した。

    • 各ファイルには次のものを含めます。

      • 認証局 (CA) 証明書
      • ノードの秘密鍵
      • ノードのクライアント証明書
    • ファイル名は <managed_node_name_as_in_the_inventory>.p12 とします。
    • ファイルは Playbook と同じディレクトリーに保存します。

手順

  1. ~/inventory ファイルを編集し、cert_name 変数を追加します。

    Copy to Clipboard Toggle word wrap
    managed-node-01.example.com cert_name=managed-node-01.example.com
    managed-node-02.example.com cert_name=managed-node-02.example.com
    managed-node-03.example.com cert_name=managed-node-03.example.com

    cert_name 変数は、各ホストの証明書で使用されるコモンネーム (CN) フィールドの値に設定します。通常、CN フィールドは完全修飾ドメイン名 (FQDN) に設定します。

  2. 機密性の高い変数を暗号化されたファイルに保存します。

    1. vault を作成します。

      Copy to Clipboard Toggle word wrap
      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      Copy to Clipboard Toggle word wrap
      pkcs12_pwd: <password>
    3. 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
  3. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    Copy to Clipboard Toggle word wrap
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Install LibreSwan
          ansible.builtin.package:
            name: libreswan
            state: present
    
        - name: Identify the path to IPsec NSS database
          ansible.builtin.set_fact:
            nss_db_dir: "{{ '/etc/ipsec.d/' if
              ansible_distribution in ['CentOS', 'RedHat']
              and ansible_distribution_major_version is version('8', '=')
              else '/var/lib/ipsec/nss/' }}"
    
        - name: Locate IPsec NSS database files
          ansible.builtin.find:
            paths: "{{ nss_db_dir }}"
            patterns: "*.db"
          register: db_files
    
        - name: Remove IPsec NSS database files
          ansible.builtin.file:
            path: "{{ item.path }}"
            state: absent
          loop: "{{ db_files.files }}"
          when: db_files.matched > 0
    
        - name: Initialize IPsec NSS database
          ansible.builtin.command:
            cmd: ipsec initnss
    
        - name: Copy PKCS #12 file to the managed node
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.p12"
            dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            mode: 0600
    
        - name: Import PKCS #12 file in IPsec NSS database
          ansible.builtin.shell:
            cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"'
    
        - name: Remove PKCS #12 file
          ansible.builtin.file:
            path: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            state: absent
    
        - name: Opportunistic mesh IPsec VPN with certificate-based authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - opportunistic: true
                auth_method: cert
                policies:
                  - policy: private
                    cidr: default
                  - policy: private
                    cidr: 192.0.2.0/24
                  - policy: clear
                    cidr: 192.0.2.1/32
            vpn_manage_firewall: true
            vpn_manage_selinux: true

    サンプル Playbook で指定されている設定は次のとおりです。

    opportunistic: true
    複数ホスト間のオポチュニスティックメッシュを有効にします。policies 変数は、どのサブネットとホストのトラフィックを暗号化する必要があるか、または暗号化できるか、またどのサブネットとホストでクリアテキストでの接続の使用を継続するかを定義します。
    auth_method: cert
    証明書ベースの認証を有効にします。これを行うには、インベントリーで各管理対象ノードの証明書のニックネームを指定する必要があります。
    policies: <list_of_policies>

    Libreswan ポリシーを YAML リスト形式で定義します。

    デフォルトのポリシーは private-or-clear です。これを private に変更するには、上記の Playbook に、デフォルトの cidr エントリーに応じた適切なポリシーを含めます。

    Ansible コントロールノードが管理対象ノードと同じ IP サブネットにある場合は、Playbook の実行中に SSH 接続が失われるのを防ぐために、コントロールノードの IP アドレスに clear ポリシーを追加します。たとえば、メッシュを 192.0.2.0/24 サブネット用に設定する必要があり、コントロールノードが IP アドレス 192.0.2.1 を使用する場合、Playbook に示されているように、192.0.2.1/32clear ポリシーが必要です。

    ポリシーの詳細は、Libreswan がインストールされているシステム上の ipsec.conf(5) man ページを参照してください。

    vpn_manage_firewall: true
    ロールにより、管理対象ノード上の firewalld サービスで必要なポートを開くことを指定します。
    vpn_manage_selinux: true
    ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイルを参照してください。

  4. Playbook の構文を検証します。

    Copy to Clipboard Toggle word wrap
    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  5. Playbook を実行します。

    Copy to Clipboard Toggle word wrap
    $ ansible-playbook --ask-vault-pass ~/playbook.yml

検証

  1. メッシュ内のノードで、別のノードに ping を送信して接続をアクティブ化します。

    Copy to Clipboard Toggle word wrap
    [root@managed-node-01]# ping managed-node-02.example.com
  2. 接続がアクティブであることを確認します。

    Copy to Clipboard Toggle word wrap
    [root@managed-node-01]# ipsec trafficstatus
    006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'

関連情報

  • /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイル
  • /usr/share/doc/rhel-system-roles/vpn/ ディレクトリー
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat, Inc.