6.12.3. vpn RHEL 시스템 역할을 사용하여 PSK 인증을 사용하여 IPsec 사이트 간 VPN 구성
사이트 간 VPN은 두 개의 개별 네트워크 간에 암호화된 터널을 설정하여 안전하지 않은 공용 네트워크에서 연결합니다. vpn RHEL 시스템 역할을 사용하면 IPsec 사이트 간 VPN 연결을 생성하는 프로세스를 자동화할 수 있습니다.
사이트 간 VPN을 사용하면 지사소의 장치가 마치 동일한 로컬 네트워크의 일부인 것처럼 회사 본사의 리소스에 액세스할 수 있습니다.
인증을 위해 PSK(사전 공유 키)는 두 피어에만 알려진 공유 시크릿을 사용하는 간단한 방법입니다. 이 접근 방식은 쉽게 배포가 가능한 우선 순위인 기본 설정에 적합합니다. 그러나 키를 엄격하게 기밀로 유지해야 합니다. 키에 대한 액세스 권한이 있는 공격자는 연결을 손상시킬 수 있습니다.
사전 요구 사항
- 컨트롤 노드와 관리형 노드를 준비했습니다.
- 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
-
관리 노드에 연결하는 데 사용하는 계정에는 이러한 노드에 대한
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: subnets: - 192.0.2.0/24 managed-node-02.example.com: subnets: - 198.51.100.0/24 - 203.0.113.0/24 auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true예제 플레이북에 지정된 설정은 다음과 같습니다.
호스트: < ;list>VPN을 구성하려는 게이트웨이로 YAML 사전을 정의합니다. 항목이 Ansible 관리 노드가 아닌 경우 FQDN(정규화된 도메인 이름) 또는 IP 주소를
hostname매개변수에 지정해야 합니다. 예를 들면 다음과 같습니다.... - hosts: ... external-host.example.com: hostname: 192.0.2.1역할은 각 관리 노드에서 VPN 연결을 구성합니다. 연결 이름은
-to-입니다 (예:managed-node-01.example.com-to-managed-node-02.example.com). 역할은 외부(관리되지 않음) 노드에 Libreswan을 구성할 수 없습니다. 이러한 피어에 구성을 수동으로 생성해야 합니다.subnets: <yaml_list_of_subnets>- 터널을 통해 연결된 CIDR(Classless inter-domain routing) 형식으로 서브넷을 정의합니다.
auth_method: psk-
피어 간 PSK 인증을 활성화합니다. 역할은 제어 노드에서
openssl을 사용하여 PSK를 생성합니다. auto: <startup_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이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.
Playbook을 실행합니다.
$ ansible-playbook ~/playbook.yml
검증
연결이 성공적으로 시작되었는지 확인합니다. 예를 들면 다음과 같습니다.
# 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 연결이 활성화된 경우에만 성공합니다. 플레이북의
auto변수를start이외의 값으로 설정하는 경우 먼저 관리 노드에서 연결을 수동으로 활성화해야 할 수 있습니다.
문제 해결
플레이북이 구문 오류와 함께 실패하면 YAML 구조를 검증합니다.
$ ansible-playbook --syntax-check ~/playbook.yml관리형 노드에 연결할 수 없는 경우 SSH 연결 및 인증을 확인합니다.
$ ansible managed-node-01.example.com -m ping플레이북이 완료되었지만 VPN 연결이 설정되지 않은 경우 관리 노드에서 IPsec 로그를 확인합니다.
$ ansible managed-node-01.example.com -m shell -a 'journalctl -u ipsec -n 50'플레이북 실행 중 자세한 출력을 보려면 상세 모드로 실행합니다.
$ ansible-playbook -vvv ~/playbook.yml-
vpn_manage_firewall: true에도 방화벽이 연결을 차단하는 경우firewalld가 관리 노드에서 실행 중이고 IPsec 서비스가 활성 영역에 추가되었는지 확인합니다.