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을 생성합니다.
사전 요구 사항
- 컨트롤 노드 및 관리형 노드를 준비했습니다.
- 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
-
관리 노드에 연결하는 데 사용하는 계정에는
sudo
권한이 있습니다.
절차
다음 콘텐츠를 사용하여 플레이북 파일(예:
~/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
--- - 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 Copied! 예제 플레이북에 지정된 설정은 다음과 같습니다.
호스트: < ;list>
VPN을 구성하려는 호스트를 사용하여 YAML 사전을 정의합니다. 항목이 Ansible 관리형 노드가 아닌 경우
hostname
매개변수에서 FQDN(정규화된 도메인 이름) 또는 IP 주소를 지정해야 합니다. 예를 들면 다음과 같습니다.... - hosts: ... external-host.example.com: hostname: 192.0.2.1
... - hosts: ... external-host.example.com: hostname: 192.0.2.1
Copy to Clipboard Copied! 역할은 각 관리 노드에서 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
,start
및ignore
입니다. 자세한 내용은 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
파일을 참조하십시오.플레이북 구문을 확인합니다.
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.
Playbook을 실행합니다.
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
검증
연결이 성공적으로 시작되었는지 확인합니다. 예를 들면 다음과 같습니다.
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
# 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 Copied! 이 명령은 VPN 연결이 활성화된 경우에만 성공합니다. 플레이북의
auto
변수를start
이외의 값으로 설정하는 경우 먼저 관리 노드에서 연결을 수동으로 활성화해야 할 수 있습니다.
6.13.2. vpn
RHEL 시스템 역할을 사용하여 PSK 인증을 사용하여 호스트 간 IPsec VPN 생성 및 데이터 및 컨트롤 플레인 분리
IPsec을 사용하여 VPN을 통해 서로 직접 호스트를 연결할 수 있습니다. 예를 들어, 인터셉트 또는 중단되는 제어 메시지의 위험을 최소화하여 보안을 강화하기 위해 데이터 트래픽과 제어 트래픽에 대해 별도의 연결을 구성할 수 있습니다. vpn
RHEL 시스템 역할을 사용하면 별도의 데이터 및 컨트롤 플레인 및 PSK 인증을 사용하여 IPsec 호스트 간 연결 생성 프로세스를 자동화할 수 있습니다.
사전 요구 사항
- 컨트롤 노드 및 관리형 노드를 준비했습니다.
- 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
-
관리 노드에 연결하는 데 사용하는 계정에는
sudo
권한이 있습니다.
절차
다음 콘텐츠를 사용하여 플레이북 파일(예:
~/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
--- - 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 Copied! 예제 플레이북에 지정된 설정은 다음과 같습니다.
호스트: < ;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
,start
및ignore
입니다. 자세한 내용은 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
파일을 참조하십시오.플레이북 구문을 확인합니다.
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.
Playbook을 실행합니다.
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
검증
연결이 성공적으로 시작되었는지 확인합니다. 예를 들면 다음과 같습니다.
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
# 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 Copied! 이 명령은 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
입니다. - 파일은 플레이북과 동일한 디렉터리에 저장됩니다.
절차
~/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
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 Copied! cert_name
변수를 각 호스트의 인증서에 사용된 CN(일반 이름) 필드 값으로 설정합니다. 일반적으로 CN 필드는 FQDN(정규화된 도메인 이름)으로 설정됩니다.중요한 변수를 암호화된 파일에 저장합니다.
자격 증명 모음을 생성합니다.
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! ansible-vault create
명령이 편집기를 열고 <key > : < value
> 형식으로 중요한 데이터를 입력합니다.pkcs12_pwd: <password>
pkcs12_pwd: <password>
Copy to Clipboard Copied! - 변경 사항을 저장하고 편집기를 종료합니다. Ansible은 자격 증명 모음의 데이터를 암호화합니다.
다음 콘텐츠를 사용하여 플레이북 파일(예:
~/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
- 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 Copied! 예제 플레이북에 지정된 설정은 다음과 같습니다.
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
파일을 참조하십시오.플레이북 구문을 확인합니다.
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.
Playbook을 실행합니다.
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
검증
메시의 노드에서 다른 노드를 ping하여 연결을 활성화합니다.
ping managed-node-02.example.com
[root@managed-node-01]# ping managed-node-02.example.com
Copy to Clipboard Copied! 연결이 활성 상태인지 확인합니다.
ipsec trafficstatus
[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 Copied!