6.13. RHEL 시스템 역할을 사용하여 VPN 연결 구성


VPN은 신뢰할 수 없는 네트워크를 통해 트래픽을 안전하게 전송하기 위한 암호화된 연결입니다. vpn RHEL 시스템 역할을 사용하면 VPN 구성 생성 프로세스를 자동화할 수 있습니다.

참고

vpn RHEL 시스템 역할은 IPsec 구현인 Libreswan만 VPN 공급자로 지원합니다.

6.13.1. vpn RHEL 시스템 역할을 사용하여 PSK 인증을 사용하여 호스트 간 IPsec VPN 생성

IPsec을 사용하여 VPN을 통해 서로 직접 호스트를 연결할 수 있습니다. 호스트는 PSK(사전 공유 키)를 사용하여 서로 인증할 수 있습니다. vpn RHEL 시스템 역할을 사용하면 PSK 인증을 사용하여 IPsec 호스트 간 연결 생성 프로세스를 자동화할 수 있습니다.

기본적으로 이 역할은 터널 기반 VPN을 생성합니다.

사전 요구 사항

절차

  1. 다음 콘텐츠를 사용하여 플레이북 파일(예: ~/playbook.yml )을 생성합니다.

    ---
    - 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
    Copy to Clipboard

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

    호스트: &lt ;list>

    VPN을 구성하려는 호스트를 사용하여 YAML 사전을 정의합니다. 항목이 Ansible 관리형 노드가 아닌 경우 hostname 매개변수에서 FQDN(정규화된 도메인 이름) 또는 IP 주소를 지정해야 합니다. 예를 들면 다음과 같습니다.

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

    역할은 각 관리 노드에서 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>
    연결의 시작 메서드를 지정합니다. 유효한 값은 add,ondemand,startignore 입니다. 자세한 내용은 Libreswan이 설치된 시스템의 ipsec.conf(5) 도움말 페이지를 참조하십시오. 이 변수의 기본값은 null이며 자동 시작 작업이 없음을 의미합니다.
    vpn_manage_firewall: true
    역할이 관리 노드의 firewalld 서비스에서 필요한 포트를 열도록 정의합니다.
    vpn_manage_selinux: true
    역할이 IPsec 포트에 필요한 SELinux 포트 유형을 설정하도록 정의합니다.

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

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

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

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

  3. Playbook을 실행합니다.

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

검증

  • 연결이 성공적으로 시작되었는지 확인합니다. 예를 들면 다음과 같습니다.

    # 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'
    Copy to Clipboard

    이 명령은 VPN 연결이 활성화된 경우에만 성공합니다. 플레이북의 auto 변수를 start 이외의 값으로 설정하는 경우 먼저 관리 노드에서 연결을 수동으로 활성화해야 할 수 있습니다.

6.13.2. vpn RHEL 시스템 역할을 사용하여 PSK 인증을 사용하여 호스트 간 IPsec VPN 생성 및 데이터 및 컨트롤 플레인 분리

IPsec을 사용하여 VPN을 통해 서로 직접 호스트를 연결할 수 있습니다. 예를 들어, 인터셉트 또는 중단되는 제어 메시지의 위험을 최소화하여 보안을 강화하기 위해 데이터 트래픽과 제어 트래픽에 대해 별도의 연결을 구성할 수 있습니다. vpn RHEL 시스템 역할을 사용하면 별도의 데이터 및 컨트롤 플레인 및 PSK 인증을 사용하여 IPsec 호스트 간 연결 생성 프로세스를 자동화할 수 있습니다.

사전 요구 사항

절차

  1. 다음 콘텐츠를 사용하여 플레이북 파일(예: ~/playbook.yml )을 생성합니다.

    ---
    - 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
    Copy to Clipboard

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

    호스트: &lt ;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>
    연결의 시작 메서드를 지정합니다. 유효한 값은 add,ondemand,startignore 입니다. 자세한 내용은 Libreswan이 설치된 시스템의 ipsec.conf(5) 도움말 페이지를 참조하십시오. 이 변수의 기본값은 null이며 자동 시작 작업이 없음을 의미합니다.
    vpn_manage_firewall: true
    역할이 관리 노드의 firewalld 서비스에서 필요한 포트를 열도록 정의합니다.
    vpn_manage_selinux: true
    역할이 IPsec 포트에 필요한 SELinux 포트 유형을 설정하도록 정의합니다.

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

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

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

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

  3. Playbook을 실행합니다.

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

검증

  • 연결이 성공적으로 시작되었는지 확인합니다. 예를 들면 다음과 같습니다.

    # 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'
    Copy to Clipboard

    이 명령은 VPN 연결이 활성화된 경우에만 성공합니다. 플레이북의 auto 변수를 start 이외의 값으로 설정하는 경우 먼저 관리 노드에서 연결을 수동으로 활성화해야 할 수 있습니다.

6.13.3. vpn RHEL 시스템 역할을 사용하여 인증서 기반 인증을 사용하여 여러 호스트에서 IPsec 메시 VPN 생성

Libreswan은 opportunistic 메시를 생성하여 각 호스트에서 단일 구성으로 많은 호스트 간에 IPsec 연결을 설정할 수 있도록 지원합니다. 메시에 호스트를 추가하는 경우 기존 호스트의 구성을 업데이트할 필요가 없습니다. 보안을 강화하려면 Libreswan에서 인증서 기반 인증을 사용하십시오.

vpn RHEL 시스템 역할을 사용하면 관리형 노드 간의 인증서 기반 인증을 사용하여 VPN 메시 구성을 자동화할 수 있습니다.

사전 요구 사항

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

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

      • CA(인증 기관) 인증서
      • 노드의 개인 키
      • 노드의 클라이언트 인증서
    • 파일의 이름은 < managed_node_name_as_in_the_inventory > .p12 입니다.
    • 파일은 플레이북과 동일한 디렉터리에 저장됩니다.

절차

  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
    Copy to Clipboard

    cert_name 변수를 각 호스트의 인증서에 사용된 CN(일반 이름) 필드 값으로 설정합니다. 일반적으로 CN 필드는 FQDN(정규화된 도메인 이름)으로 설정됩니다.

  2. 중요한 변수를 암호화된 파일에 저장합니다.

    1. 자격 증명 모음을 생성합니다.

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

      pkcs12_pwd: <password>
      Copy to Clipboard
    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: 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
    Copy to Clipboard

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

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

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

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

    Ansible 제어 노드가 관리형 노드와 동일한 IP 서브넷에 있는 경우 플레이북 실행 중에 SSH 연결이 손실되는 것을 방지하려면 제어 노드의 IP 주소에 대한 명확한 정책을 추가합니다. 예를 들어, Mesh를 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
    Copy to Clipboard

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

  5. Playbook을 실행합니다.

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

검증

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

    [root@managed-node-01]# ping managed-node-02.example.com
    Copy to Clipboard
  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'
    Copy to Clipboard
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

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

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

Red Hat 소개

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

Theme

© 2025 Red Hat, Inc.