6.12.4. vpn RHEL 시스템 역할을 사용하여 인증서 기반 인증을 사용하여 IPsec 메시 VPN 구성


IPsec 메시는 모든 서버가 다른 모든 서버와 안전하고 직접 통신할 수 있는 완전히 상호 연결된 네트워크를 생성합니다. vpn RHEL 시스템 역할을 사용하면 관리형 노드 간의 인증서 기반 인증을 사용하여 VPN 메시 구성을 자동화할 수 있습니다.

IPsec 메시는 여러 데이터 센터 또는 클라우드 공급자에 걸쳐 있는 분산 데이터베이스 클러스터 또는 고가용성 환경에 이상적입니다. 각 서버 쌍 간에 직접 암호화된 터널을 설정하면 중앙 병목 현상 없이 보안 통신을 수행할 수 있습니다.

인증의 경우 CA(인증 기관)에서 관리하는 디지털 인증서를 사용하면 안전하고 확장 가능한 솔루션이 제공됩니다. 메시의 각 호스트는 신뢰할 수 있는 CA에서 서명한 인증서를 제공합니다. 이 방법은 강력하고 검증 가능한 인증을 제공하고 사용자 관리를 단순화합니다. CA에서 액세스를 중앙에서 부여하거나 취소할 수 있으며 Libreswan은 인증서 해지 목록(CRL)에 대해 각 인증서를 확인하여 인증서가 목록에 표시되면 액세스를 거부하여 이를 적용합니다.

사전 요구 사항

  • 컨트롤 노드와 관리형 노드를 준비했습니다.
  • 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
  • 관리 노드에 연결하는 데 사용하는 계정에는 이러한 노드에 대한 sudo 권한이 있습니다.
  • 각 관리 노드에 대해 PKCS #12 파일을 준비합니다.

    • 각 파일에는 다음이 포함됩니다.

      • 서버의 개인 키
      • 서버 인증서
      • CA 인증서
      • 필요한 경우 중간 인증서
    • 파일의 이름은 < managed_node_name_as_in_the_inventory > .p12 입니다.
    • 파일은 플레이북과 동일한 디렉터리에 저장됩니다.
    • 서버 인증서에는 다음 필드가 포함되어 있습니다.

      • EKU(Extended Key Usage)는 TLS 웹 서버 인증으로 설정됩니다.
      • CN(일반 이름) 또는 SAN(주체 대체 이름)은 호스트의 FQDN(정규화된 도메인 이름)으로 설정됩니다.
      • X509v3 CRL 배포 지점에는 CRL(Certificate Revocation Lists)에 대한 URL이 포함되어 있습니다.

프로세스

  1. ~/inventory 파일을 편집하고 cert_name 변수를 추가합니다.

    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. 자격 증명 모음을 생성합니다.

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
    2. ansible-vault create 명령이 편집기를 열고 < key > : < value > 형식으로 중요한 데이터를 입력합니다.

      pkcs12_pwd: <password>
    3. 변경 사항을 저장하고 편집기를 종료합니다. Ansible은 자격 증명 모음의 데이터를 암호화합니다.
  3. 다음 콘텐츠를 사용하여 플레이북 파일(예: ~/playbook.yml )을 생성합니다.

    - 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: Initialize IPsec NSS database if not initialized
          ansible.builtin.command:
            cmd: ipsec initnss
          when: db_files.matched == 0
    
        - 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

    예제 플레이북에 지정된 설정은 다음과 같습니다.

    opportunistic: true
    여러 호스트 간에 opportunistic 메시를 활성화합니다. policies 변수는 암호화하거나 암호화할 수 있고 일반 텍스트 연결을 계속 사용하는 서브넷 및 호스트 트래픽에 대해 정의합니다.
    auth_method: cert
    인증서 기반 인증을 활성화합니다. 이를 위해서는 인벤토리에서 각 관리 노드 인증서의 닉네임을 지정해야 합니다.
    policies: <list_of_policies>

    YAML 목록 형식으로 Libreswan 정책을 정의합니다.

    기본 정책은 private-or-clear 입니다. 개인 으로 변경하기 위해 플레이북에는 기본 cidr 항목에 대한 따라 정책이 포함되어 있습니다.

    Ansible 제어 노드가 관리형 노드와 동일한 IP 서브넷에 있는 경우 플레이북 실행 중에 SSH 연결이 손실되는 것을 방지하려면 제어 노드의 IP 주소에 대한 명확한 정책을 추가합니다. 예를 들어 192.0.2.0/24 서브넷에 대해 메시를 구성하고 제어 노드에서 IP 주소 192.0.2.1 을 사용하려면 플레이북에 표시된 대로 192.0.2.1/32 에 대한 명확한 정책이 필요합니다.

    정책에 대한 자세한 내용은 Libreswan이 설치된 시스템의 ipsec.conf(5) 도움말 페이지를 참조하십시오.

    vpn_manage_firewall: true
    역할이 관리 노드의 firewalld 서비스에서 필요한 포트를 열도록 정의합니다.
    vpn_manage_selinux: true
    역할이 IPsec 포트에 필요한 SELinux 포트 유형을 설정하도록 정의합니다.

    플레이북에 사용되는 모든 변수에 대한 자세한 내용은 제어 노드의 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 파일을 참조하십시오.

  4. 플레이북 구문을 확인합니다.

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml

    이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.

  5. Playbook을 실행합니다.

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

검증

  1. 메시의 노드에서 다른 노드를 ping하여 연결을 활성화합니다.

    [root@managed-node-01]# ping managed-node-02.example.com
  2. 연결이 활성화되어 있는지 확인합니다.

    [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'

문제 해결

  • 플레이북이 구문 오류와 함께 실패하면 YAML 구조를 검증합니다.

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
  • 관리형 노드에 연결할 수 없는 경우 SSH 연결 및 인증을 확인합니다.

    $ ansible managed-node-01.example.com -m ping
  • PKCS #12 가져오기에 실패하면 자격 증명 모음의 암호가 PKCS #12 파일 암호와 일치하고 인증서 파일의 이름이 인벤토리 호스트 이름에 따라 올바르게 지정되었는지 확인합니다.
  • 메시 연결이 설정되지 않은 경우 관리형 노드에서 IPsec 로그를 확인합니다.

    $ ansible managed-node-01.example.com -m shell -a 'journalctl -u ipsec -n 50'
  • 인증서 유효성 검사가 실패하면 인벤토리 파일의 cert_name 값이 인증서의 CN(일반 이름) 필드와 일치하는지 확인합니다.
  • 플레이북 실행 중 자세한 출력을 보려면 상세 모드로 실행합니다.

    $ ansible-playbook --ask-vault-pass -vvv ~/playbook.yml
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 문서 정보

Legal Notice

Theme

© 2026 Red Hat
맨 위로 이동