Ubuntu 22.04에서 StrongSwan을 사용한 IKEv2 VPN 서버 설정 방법

소개

A virtual private network, or VPN, allows you to securely encrypt traffic as it travels through untrusted networks, such as those at the coffee shop, a conference, or an airport.

인터넷 키 교환 v2(IKEv2)는 서버와 클라이언트 간의 직접 IPSec 터널링을 허용하는 프로토콜입니다. IKEv2 VPN 구현에서 IPSec은 네트워크 트래픽의 암호화를 제공합니다. IKEv2는 일부 플랫폼(OS X 10.11+, iOS 9.1+ 및 Windows 10)에서 네이티브로 지원되며 추가 애플리케이션이 필요하지 않으며 클라이언트의 문제를 매끄럽게 처리합니다.

이 튜토리얼에서는 Ubuntu 22.04 서버에서 StrongSwan을 사용하여 IKEv2 VPN 서버를 설정하는 방법을 알아볼 것입니다. 그런 다음 Windows, macOS, Ubuntu, iOS 및 Android 클라이언트로 연결하는 방법을 배우게 될 것입니다.

필수 사항

이 튜토리얼을 완료하려면 다음이 필요합니다:

단계 1 — StrongSwan 설치

먼저 VPN 서버로 구성할 오픈 소스 IPSec 데몬인 StrongSwan을 설치합니다. 또한 인프라의 자격 증명을 제공하기 위해 인증 기관 (CA)를 생성할 수 있도록 공개 키 인프라 (PKI) 구성 요소를 설치합니다.

로컬 패키지 캐시를 업데이트하여 시작합니다:

  1. sudo apt update

다음을 입력하여 소프트웨어를 설치합니다:

  1. sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins

추가로 libcharon-extauth-plugins 패키지는 여러 클라이언트가 공유 사용자 이름 및 암호를 사용하여 서버에 인증할 수 있도록합니다. libstrongswan-extra-plugins 패키지는 Strongswan이 Curve25519 암호 스위트를 사용하는 타원 곡선 암호 스위트를 지원하도록 포함되어 있습니다.

이제 모든 것이 설치되었으므로 인증서 생성으로 이동합니다.

단계 2 — 인증 기관 생성

IKEv2 서버는 클라이언트에게 자신을 식별하기 위한 인증서가 필요합니다. 필요한 인증서를 생성하기 위해 strongswan-pki 패키지는 인증 기관 및 서버 인증서를 생성하는 유틸리티인 pki와 함께 제공됩니다.

시작하려면 작업할 모든 에셋을 저장할 몇 개의 디렉토리를 만듭니다. 디렉토리 구조는 최종적으로 생성할 모든 항목을 이동할 /etc/ipsec.d의 일부 디렉토리와 일치합니다.

  1. mkdir -p ~/pki/{cacerts,certs,private}

그런 다음 다른 사용자가 개인 파일을 볼 수 없도록 권한을 제한하세요.

  1. chmod 700 ~/pki

모든 것을 저장할 디렉토리 구조가 준비되었으므로 루트 키를 생성할 수 있습니다. 이것은 루트 인증 기관 인증서를 서명하는 데 사용될 4096비트 RSA 키입니다.

다음 명령을 실행하여 키를 생성하세요.

  1. pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

그런 다음 방금 생성한 키를 사용하여 루트 인증 기관을 생성할 수 있습니다.

  1. pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
  2. --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

--lifetime 3650 플래그는 인증 기관의 루트 인증서가 10년 동안 유효하도록합니다. 일반적으로 인증 기관의 루트 인증서는 변경되지 않습니다. 이것은 모든 서버 및 클라이언트에 다시 배포해야하기 때문에 안전한 기본 만료 값입니다.

원한다면 특별한 이름 (DN) 값을 다른 값으로 변경할 수 있습니다. 여기서 공통 이름 (CN 필드)은 단순히 지시자이므로 인프라의 어떤 것과 일치할 필요가 없습니다.

이제 루트 인증 기관이 가동 중이므로 VPN 서버가 사용할 인증서를 생성할 수 있습니다.

단계 3 — VPN 서버용 인증서 생성하기

이제 VPN 서버를 위한 인증서와 키를 생성합니다. 이 인증서는 방금 생성한 CA 인증서를 사용하여 클라이언트가 서버의 신뢰성을 확인할 수 있게 합니다.

먼저, 다음 명령을 사용하여 VPN 서버를 위한 개인 키를 생성합니다:

  1. pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

이제 이전 단계에서 생성한 인증서 기관의 키를 사용하여 VPN 서버 인증서를 생성하고 서명합니다. 다음 명령을 실행하지만, 공통 이름 (CN) 및 대체 주소 (SAN) 필드를 VPN 서버의 DNS 이름 또는 IP 주소로 변경하십시오:

  1. pki --pub --in ~/pki/private/server-key.pem --type rsa \
  2. | pki --issue --lifetime 1825 \
  3. --cacert ~/pki/cacerts/ca-cert.pem \
  4. --cakey ~/pki/private/ca-key.pem \
  5. --dn "CN=server_domain_or_IP" --san server_domain_or_IP \
  6. --flag serverAuth --flag ikeIntermediate --outform pem \
  7. > ~/pki/certs/server-cert.pem

참고: DNS 이름 대신 IP 주소를 사용하는 경우, 여러 --san 항목을 지정해야 합니다. 이전 명령 블록에서 서명자 이름을 지정하는 줄(--dn ...)은 다음과 같이 추가 항목으로 수정해야 합니다:

--dn "CN=IP 주소" --san @IP_주소 --san IP_주소 \

이 추가된 --san @IP_주소 항목은 일부 클라이언트가 서버의 신원을 확인할 때 TLS 인증서에 서버의 DNS 항목과 IP 주소 항목이 모두 있는지 확인하기 때문입니다.

--flag serverAuth 옵션은 암호화된 터널이 설정되기 전에 인증된 서버용 인증서를 명시적으로 사용할 것을 나타냅니다. --flag ikeIntermediate 옵션은 오래된 macOS 클라이언트를 지원하기 위해 사용됩니다.

이제 StrongSwan이 필요로 하는 모든 TLS/SSL 파일을 생성했으므로 다음 명령을 사용하여 파일을 /etc/ipsec.d 디렉토리에 이동할 수 있습니다:

  1. sudo cp -r ~/pki/* /etc/ipsec.d/

이 단계에서는 클라이언트와 서버 간 통신을 보안하는 데 사용될 인증서 쌍을 생성했습니다. 또한 CA 키로 인증서에 서명하여 클라이언트가 CA 인증서를 사용하여 VPN 서버의 신뢰성을 검증할 수 있습니다. 이러한 인증서가 모두 준비되었으므로 SrongSwan을 구성할 준비가되었습니다.

단계 4 — StrongSwan 구성

StrongSwan에는 일부 예제가 있는 기본 구성 파일이 있지만 대부분의 구성은 직접해야합니다. 처음부터 시작하기 전에 참조를 위해 파일을 백업하겠습니다:

  1. sudo mv /etc/ipsec.conf{,.original}

선호하는 텍스트 편집기를 사용하여 새로운 빈 구성 파일을 생성하고 엽니다. 여기서는 nano를 사용합니다:

  1. sudo nano /etc/ipsec.conf

참고: VPN의 서버 부분을 구성하는 이 섹션을 작업하는 동안 연결의 왼쪽오른쪽 설정을 만날 것입니다. IPSec VPN을 다룰 때, 여기서의 왼쪽은 관례적으로 구성 중인 로컬 시스템을 가리킵니다. 이 경우에는 서버입니다. 이러한 설정의 오른쪽 지시문은 폰 및 다른 컴퓨터와 같은 원격 클라이언트를 가리킵니다.

이 튜토리얼의 이후에 클라이언트를 구성할 때, 클라이언트 구성 파일은 다양한 왼쪽 지시문을 사용하여 자신을 참조하고, 서버는 오른쪽 쪽 용어를 사용하여 참조됩니다.

먼저, StrongSwan에게 디버깅을 위해 데몬 상태를 기록하고 중복 연결을 허용하도록 지시하겠습니다. 다음 줄을 파일에 추가하세요:

/etc/ipsec.conf
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

그런 다음 VPN을 위한 구성 섹션을 생성합니다. 또한 StrongSwan에게 IKEv2 VPN 터널을 생성하도록 지시하고, 시작시 이 구성 섹션을 자동으로 로드하도록 지시합니다. 다음 줄을 파일에 추가하세요:

/etc/ipsec.conf
. . .
conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes

또한, 클라이언트가 예상치 못하게 연결을 끊을 경우 “떠 있는” 연결을 지우도록 dead-peer 검출을 구성하겠습니다. 다음 줄을 추가하세요:

/etc/ipsec.conf
. . .
conn ikev2-vpn
    . . .
    dpdaction=clear
    dpddelay=300s
    rekey=no

다음으로, 서버의 “왼쪽” 쪽 IPSec 매개변수를 구성하겠습니다. 다음 매개변수는 각각 서버가 클라이언트에서의 연결을 수락하고 자신을 올바르게 식별하도록 구성됨을 보장합니다. 이러한 설정을 /etc/ipsec.conf 파일에 추가할 때, 해당 설정이 무엇이고 왜 사용되는지에 대해 익숙해지면 추가하게 될 것입니다:

  • left=%any %any 값은 서버가 수신된 연결을 기반으로 이후 클라이언트와의 통신에 사용할 네트워크 인터페이스를 선택함을 보장합니다. 예를 들어, 클라이언트를 사설 네트워크를 통해 연결하는 경우 서버는 연결의 나머지 부분에 대한 트래픽을 수신하는 사설 IP 주소를 사용합니다.
  • leftid=@server_domain_or_IP 이 옵션은 서버가 클라이언트에 제시하는 이름을 제어합니다. leftcert 다음 옵션과 결합되면 leftid 옵션은 서버의 구성된 이름과 공개 인증서에 포함된 Distinguished Name (DN)이 일치하도록 보장합니다.
  • leftcert=server-cert.pem 이 옵션은 단계 3에서 구성한 서버의 공개 인증서 경로입니다. 이 옵션이 없으면 서버가 클라이언트와 인증을 수행하거나 IKEv2 설정을 완료할 수 없습니다.
  • leftsendcert=always always 값은 서버에 연결하는 모든 클라이언트가 초기 연결 설정의 일부로 서버의 공개 인증서 사본을 항상 수신하도록 보장합니다.
  • leftsubnet=0.0.0.0/0 추가할 마지막 “left” 측 옵션은 서버 뒤에 도달 가능한 서브넷에 대해 클라이언트에게 알립니다. 이 경우 0.0.0.0/0은 IPv4 주소의 전체 집합을 나타내며, 이는 서버가 기본적으로 모든 트래픽을 VPN을 통해 전송하도록 클라이언트에게 알려줍니다.

이제 관련 “left” 측 옵션 각각에 대해 익숙해졌으므로 다음과 같이 모두 파일에 추가하십시오:

/etc/ipsec.conf
. . .
conn ikev2-vpn
    . . .
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0

참고: 서버 ID(leftid)를 구성할 때, VPN 서버가 도메인 이름으로 식별될 경우에만 @ 문자를 포함하십시오:

/etc/ipsec.conf
    . . .    leftid=@vpn.example.com
    . . .

서버가 IP 주소로 식별될 경우 IP 주소만 입력하십시오:

/etc/ipsec.conf
    . . .
    leftid=your_server_ip
    . . .

다음으로, 클라이언트의 “오른쪽” 측 IPSec 매개변수를 구성할 수 있습니다. 다음 매개변수 각각은 서버에게 클라이언트로부터의 연결 수락 방법, 클라이언트가 서버에 인증하는 방법, 그리고 클라이언트가 사용할 개인 IP 주소 범위와 DNS 서버를 알려줍니다. 이러한 설정을 /etc/ipsec.conf 파일에 추가하십시오. 이러한 설정이 무엇이며 왜 사용되는지에 익숙해지면:

  • right=%any 연결의 right 측에 대한 %any 옵션은 서버가 어떤 원격 클라이언트에서도 들어오는 연결을 수락하도록 지시합니다.
  • rightid=%any 이 옵션은 서버가 암호화된 터널이 설정되기 전에 신원을 제공하는 클라이언트의 연결을 거부하지 않도록 보장합니다.
  • rightauth=eap-mschapv2 이 옵션은 클라이언트가 서버에 인증하는 데 사용할 인증 방법을 구성합니다. 여기서는 Windows, macOS 및 Android 디바이스와 같은 다양한 호환성을 지원하기 위해 eap-mschapv2가 사용됩니다.
  • rightsourceip=10.10.10.0/24 이 옵션은 서버가 지정된 10.10.10.0/24 IP 풀에서 클라이언트에게 개인 IP 주소를 할당하도록 지시합니다.
  • rightdns=8.8.8.8,8.8.4.4 이 IP 주소는 Google의 공개 DNS 리졸버입니다. 다른 공개 리졸버, VPN 서버의 리졸버 또는 클라이언트가 액세스할 수 있는 다른 리졸버로 변경할 수 있습니다.
  • rightsendcert=never 이 옵션은 클라이언트가 자신을 인증하기 위해 인증서를 보낼 필요가 없음을 서버에 지시합니다.

이제 VPN에 필요한 “right” 측 옵션에 익숙해졌으므로 다음 줄을 /etc/ipsec.conf에 추가하십시오:

/etc/ipsec.conf
. . .
conn ikev2-vpn
    . . .
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never

이제 StrongSwan에 클라이언트에게 연결할 때 사용자 자격 증명을 요청하도록 지시하겠습니다:

/etc/ipsec.conf
. . .
conn ikev2-vpn
    . . .
    eap_identity=%identity

마지막으로 Linux, Windows, macOS, iOS 및 Android 클라이언트를 지원하기 위해 다음 줄을 추가하십시오. 이러한 줄은 StrongSwan이 다양한 클라이언트가 사용할 수 있는 키 교환, 해싱, 인증 및 암호화 알고리즘 (일반적으로 Cipher Suites로 참조됨)을 지정합니다:

/etc/ipsec.conf
. . .
conn ikev2-vpn
    . . .
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

각 지원되는 암호 스위트는 쉼표로 구분됩니다. 예를 들어 chacha20poly1305-sha512-curve25519-prfsha512는 한 스위트이고, aes256gcm16-sha384-prfsha384-ecp384는 다른 스위트입니다. 여기에 나열된 암호 스위트는 Windows, macOS, iOS, Android 및 Linux 클라이언트 간의 넓은 호환성 범위를 보장하기 위해 선택되었습니다.

완전한 구성 파일은 다음과 같아야 합니다:

/etc/ipsec.conf
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

각 줄을 올바르게 추가했는지 확인한 후 파일을 저장하고 닫으십시오. 만약 nano를 사용했다면 CTRL + X, Y, 그런 다음 ENTER를 눌러주세요.

이제 VPN 매개변수를 구성했으므로 사용자가 서버에 연결할 수 있는 계정을 만들어야합니다.

단계 5 — VPN 인증 구성

VPN 서버는 이제 클라이언트 연결을 수락하도록 구성되었지만 아직 자격 증명이 구성되지 않았습니다. 특별한 구성 파일인 ipsec.secrets에서 몇 가지를 구성해야합니다:

  • StrongSwan에 서버 인증서의 개인 키를 찾을 위치를 알려야합니다. 따라서 서버가 클라이언트를 인증할 수 있습니다.
  • 또한 VPN에 연결할 수 있는 사용자 목록을 설정해야합니다.

편집을 위해 비밀 파일을 엽니다:

  1. sudo nano /etc/ipsec.secrets

먼저 StrongSwan에 개인 키를 찾을 위치와 구문 분석 방법을 알려야합니다.

/etc/ipsec.secrets
: RSA "server-key.pem"

줄이 : 문자로 시작하고 그 뒤에 공백이 있어야합니다. 따라서 전체 줄이 : RSA "server-key.pem"으로 읽혀야합니다.

그런 다음 사용자 자격 증명을 정의합니다. 원하는 대로 사용자 이름 또는 비밀번호 조합을 만들 수 있습니다:

/etc/ipsec.secrets
your_username : EAP "your_password"

파일을 저장하고 닫습니다. VPN 매개변수 작업을 완료했으므로 VPN 서비스를 다시 시작하여 구성이 적용되도록합니다:

  1. sudo systemctl restart strongswan-starter

이제 VPN 서버가 서버 옵션과 사용자 자격 증명 모두로 완전히 구성되었으므로 가장 중요한 부분을 구성해야 합니다: 방화벽입니다.

단계 6 — 방화벽 및 커널 IP 전달 구성

StrongSwan 구성이 완료되었으므로 VPN 트래픽을 허용하고 전달하기 위해 방화벽을 구성해야 합니다.

사전 준비 단계에서 초기 서버 설정 튜토리얼을 따랐다면 UFW 방화벽이 활성화되어 있어야 합니다. 아직 UFW를 구성하지 않았다면 현재 세션이 닫히지 않도록 방화벽을 통해 SSH 연결을 허용하는 규칙을 추가하여 시작해야 합니다:

  1. sudo ufw allow OpenSSH

그런 다음 다음을 입력하여 방화벽을 활성화합니다:

  1. sudo ufw enable

그런 다음 UDP 트래픽을 표준 IPSec 포트 5004500으로 허용하는 규칙을 추가합니다:

  1. sudo ufw allow 500,4500/udp

다음으로, IPSec 패킷의 라우팅 및 전달을 위한 몇 가지 하위 수준 정책을 추가하기 위해 UFW의 구성 파일 중 하나를 엽니다. 그러나 이를 수행하기 전에 서버에서 인터넷 액세스에 사용되는 네트워크 인터페이스를 찾아야 합니다. 기본 경로와 관련된 디바이스를 쿼리하여 이 인터페이스를 찾습니다:

  1. ip route show default

공용 인터페이스는 “dev”라는 단어를 따라야 합니다. 예를 들어, 이 결과는 eth0이라는 인터페이스를 보여줍니다.

Output
default via your_server_ip dev eth0 proto static

공용 네트워크 인터페이스가 준비되면 텍스트 편집기에서 /etc/ufw/before.rules 파일을 엽니다. 이 파일의 규칙은 일반적인 입력 및 출력 규칙의 나머지 이전에 방화벽에 추가됩니다. 이들은 네트워크 주소 변환(NAT)을 구성하여 서버가 클라이언트 및 인터넷 간의 연결을 올바르게 라우팅할 수 있도록합니다.

  1. sudo nano /etc/ufw/before.rules

파일의 맨 위에 ( *filter 줄 이전에) 다음 구성 블록을 추가하십시오. 위 구성에서 eth0의 각 인스턴스를 ip route로 찾은 인터페이스 이름과 일치하도록 변경하십시오. *nat 줄은 방화벽이 VPN 클라이언트와 인터넷 간의 트래픽을 올바르게 라우팅하고 조작할 수 있도록 규칙을 생성합니다. *mangle 줄은 일부 VPN 클라이언트와 관련된 잠재적 문제를 방지하기 위해 최대 패킷 세그먼트 크기를 조정합니다:

/etc/ufw/before.rules
*nat
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
COMMIT

*mangle
-A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT

*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
. . .

다음으로, *filter 및 체인 정의 줄 다음에 구성 블록을 하나 더 추가하십시오:

/etc/ufw/before.rules
. . .
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]

-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT

이러한 줄은 방화벽이 VPN 클라이언트가 연결할 수 있도록 ESP (Encapsulating Security Payload) 트래픽을 전달하도록 지시합니다. ESP는 VPN 패킷이 신뢰할 수 없는 네트워크를 통과하는 동안 추가 보안을 제공합니다.

작업을 마치면 각 줄을 올바르게 추가했는지 확인한 후 파일을 저장하고 닫습니다. nano를 사용한 경우 CTRL + X, Y, 그런 다음 ENTER를 눌러 저장하십시오.

방화벽을 다시 시작하기 전에 서로 다른 인터페이스 간의 라우팅을 허용하도록 몇 가지 네트워크 커널 매개변수를 변경해야합니다. 이러한 설정을 제어하는 파일은 /etc/ufw/sysctl.conf입니다. 파일에서 몇 가지 구성이 필요합니다.

먼저 VPN과 공개 네트워크 인터페이스 간의 트래픽을 이동할 수 있도록 IPv4 패킷 전달을 활성화해야합니다. 그런 다음 패킷 단편화 문제를 방지하기 위해 Path MTU 탐색을 비활성화합니다. 마지막으로 중간자 공격을 방지하기 위해 ICMP 리디렉트를 수락하지 않고 ICMP 리디렉트를 보내지 않습니다.

nano 또는 선호하는 텍스트 편집기를 사용하여 UFW의 커널 매개변수 구성 파일을 엽니까:

  1. sudo nano /etc/ufw/sysctl.conf

이제 파일 끝에 다음 설정 net/ipv4/ip_forward=1을 추가하여 인터페이스 간의 패킷 전달을 활성화합니다:

/etc/ufw/sysctl.conf
. . .
net/ipv4/ip_forward=1

다음으로 다음 라인을 파일 끝에 추가하여 ICMP 리디렉트 패킷의 송수신을 차단합니다:

/etc/ufw/sysctl.conf
. . .
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0

마지막으로 다음 라인을 파일 끝에 추가하여 Path MTU 탐색을 해제합니다:

/etc/ufw/sysctl.conf
. . .
net/ipv4/ip_no_pmtu_disc=1

작업을 마쳤을 때 파일을 저장합니다. 이제 UFW가 재시작될 때마다 이러한 설정이 적용되므로 방화벽을 비활성화하고 다시 활성화하여 모든 변경 사항을 적용할 수 있습니다:

  1. sudo ufw disable
  2. sudo ufw enable

프로세스를 확인하라는 메시지가 표시됩니다. 새로운 설정으로 UFW를 다시 활성화하려면 Y를 입력하세요.

단계 7 — Windows, macOS, Ubuntu, iOS 및 Android에서 VPN 연결 테스트

모든 것이 설정되었으니 이제 시도해 보는 것이 좋습니다. 먼저 VPN에 연결할 클라이언트 장치에 생성한 CA 인증서를 복사하고 설치해야 합니다. 이를 수행하는 가장 쉬운 방법은 서버에 로그인하여 인증서 파일의 내용을 출력하는 것입니다.

  1. cat /etc/ipsec.d/cacerts/ca-cert.pem

다음과 유사한 출력이 표시됩니다:

Output
-----BEGIN CERTIFICATE----- MIIFNDCCAxygAwIBAgIIHCsidG5mXzgwDQYJKoZIhvcNAQEMBQAwODELMAkGA1UE . . . H2YUdz8XNHrJHvMQKWFpi0rlEcMs+MSXPFWE3Q7UbaZJ/h8wpSldSUbQRUlphExJ dJ4PX+MUJO/vjG1/ie6Kh25xbBAc3qNq8siiJZDwrg6vjEK7eiZ1rA== -----END CERTIFICATE-----

이 출력을 컴퓨터에 복사하여 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 라인을 포함하여 인식할 수 있는 이름으로 파일에 저장하십시오. 예를 들어 ca-cert.pem과 같이합니다. 생성하는 파일에는 .pem 확장자가 있는지 확인하십시오.

또는 SFTP를 사용하여 파일을 컴퓨터로 전송합니다.

컴퓨터에 ca-cert.pem 파일을 다운로드한 후 VPN에 연결을 설정할 수 있습니다.

Windows에서 연결하는 방법

루트 인증서를 가져오고 Windows를 VPN에 연결하려면 여러 가지 방법이 있습니다. 첫 번째 방법은 각 단계에 대한 그래픽 도구를 사용합니다. 두 번째 방법은 PowerShell 명령을 사용하며 VPN 구성에 맞게 스크립팅하고 수정할 수 있습니다.

참고: 이 지침은 버전 1903 및 1909를 실행하는 Windows 10 설치에서 테스트되었습니다.

그래픽 도구를 사용하여 Windows 구성

먼저 다음 단계를 따라 루트 인증서를 가져오세요:

  1. WINDOWS+R을 눌러 실행 대화 상자를 열고 mmc.exe를 입력하여 Windows 관리 콘솔을 시작합니다.

  2. 파일 메뉴에서 스냅인 추가 또는 제거로 이동하여 사용 가능한 스냅인 목록에서 인증서를 선택하고 추가를 클릭합니다.

  3. VPN을 모든 사용자와 함께 사용하려면 컴퓨터 계정을 선택하고 다음을 클릭합니다.

  4. 로컬 컴퓨터에서 구성을 수행하고 있으므로 로컬 컴퓨터를 선택한 다음 완료를 클릭합니다.

  5. 콘솔 루트 노드 아래에서 인증서(로컬 컴퓨터) 항목을 확장하고 신뢰할 수 있는 루트 인증 기관을 확장한 다음 인증서 항목을 선택하십시오:

  6. 작업 메뉴에서 모든 작업을 선택하고 가져오기를 클릭하여 인증서 가져오기 마법사를 표시합니다. 시작 설명을 넘어가려면 다음을 클릭하십시오.

  7. 가져올 파일 화면에서 찾아보기 버튼을 누르고 파일 유형을 “X.509 인증서 (.cer;.crt)”에서 “모든 파일 (.)”로 변경한 후 저장한 ca-cert.pem 파일을 선택하십시오. 그런 다음 다음을 클릭하십시오.

  8. 인증서 저장소신뢰할 수 있는 루트 인증 기관로 설정되어 있는지 확인하고, 다음을 클릭하십시오.

  9. 완료를 클릭하여 인증서를 가져옵니다.

그런 다음 다음 단계로 VPN을 구성하십시오:

  1. 제어판을 시작하고, 네트워크 및 공유 센터로 이동하십시오.
  2. 새로운 연결 또는 네트워크 설정을 클릭한 다음 작업장에 연결을 선택하십시오.
  3. 내 인터넷 연결 사용 (VPN)을 선택하십시오.
  4. VPN 서버 세부 정보를 입력하십시오. 인터넷 주소 필드에 서버의 도메인 이름 또는 IP 주소를 입력하고, VPN 연결을 설명하는 내용으로 목적지 이름을 작성하십시오. 그런 다음 완료를 클릭하십시오.

PowerShell을 사용하여 Windows 구성

PowerShell을 사용하여 루트 CA 인증서를 가져오려면 먼저 관리자 권한으로 PowerShell 프롬프트를 엽니다. 이를 위해 시작 메뉴 아이콘을 마우스 오른쪽으로 클릭하고 Windows PowerShell (관리자)를 선택하십시오. 또는 관리자 권한으로 명령 프롬프트를 열고 powershell을 입력할 수도 있습니다.

다음으로 Import-Certificate PowerShell cmdlet를 사용하여 인증서를 가져올 것입니다. 다음 명령에서 첫 번째 -CertStoreLocation 인수는 모든 프로그램과 사용자가 VPN 서버의 인증서를 확인할 수 있도록 컴퓨터의 신뢰할 수 있는 루트 인증 기관 저장소로 인증서가 가져와지도록합니다. -FilePath 인수는 인증서를 복사한 위치를 가리켜야합니다. 다음 예에서 경로는 C:\Users\sammy\Documents\ca-cert.pem입니다. 사용한 위치와 일치하도록 명령을 수정하십시오.

  1. Import-Certificate `
  2. -CertStoreLocation cert:\LocalMachine\Root\ `
  3. -FilePath C:\users\sammy\Documents\ca-cert.pem

명령은 다음과 같은 내용을 출력합니다:

Output
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root Thumbprint Subject ---------- ------- DB00813B4087E9367861E8463A60CEA0ADC5F002 CN=VPN root CA

이제 PowerShell을 사용하여 VPN을 구성하려면 다음 명령을 실행하십시오. -ServerAddress 줄에 서버의 DNS 이름 또는 IP 주소를 대체하십시오. 다양한 플래그는 Windows가 /etc/ipsec.conf에 설정한 옵션과 일치하는 적절한 보안 매개 변수로 올바르게 구성되도록합니다.

  1. Add-VpnConnection -Name "VPN Connection" `
  2. -ServerAddress "server_domain_or_IP" `
  3. -TunnelType "IKEv2" `
  4. -AuthenticationMethod "EAP" `
  5. -EncryptionLevel "Maximum" `
  6. -RememberCredential `

명령이 성공하면 출력이 없습니다. VPN이 올바르게 구성되었는지 확인하려면 Get-VPNConnection cmdlet을 사용하십시오:

  1. Get-VpnConnection -Name "VPN Connection"

다음과 같은 출력을 받게됩니다:

Output
Name : VPN Connection ServerAddress : your_server_ip AllUserConnection : False Guid : {B055A1AB-175C-4028-B4A8-D34309A2B20E} TunnelType : Ikev2 AuthenticationMethod : {Eap} EncryptionLevel : Maximum L2tpIPsecAuth : UseWinlogonCredential : False EapConfigXmlStream : #document ConnectionStatus : Disconnected RememberCredential : True SplitTunneling : False DnsSuffix : IdleDisconnectSeconds : 0

기본적으로 Windows는 오래된 느린 알고리즘을 선택합니다. Set-VpnConnectionIPsecConfiguration cmdlet을 실행하여 Windows가 IKEv2 키 교환에 사용할 암호화 매개변수를 업그레이드하고 패킷을 암호화하도록 설정하십시오.

  1. Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" `
  2. -AuthenticationTransformConstants GCMAES256 `
  3. -CipherTransformConstants GCMAES256 `
  4. -DHGroup ECP384 `
  5. -IntegrityCheckMethod SHA384 `
  6. -PfsGroup ECP384 `
  7. -EncryptionMethod GCMAES256

참고: VPN 연결을 삭제하고 다른 옵션으로 다시 구성하려는 경우 Remove-VpnConnection cmdlet을 실행할 수 있습니다.

  1. Remove-VpnConnection -Name "VPN Connection" -Force

-Force 플래그는 삭제를 확인하는 메시지를 건너뛸 것입니다. 이 명령을 사용하여 VPN을 제거하려면 VPN에서 연결을 해제해야 합니다.

VPN에 연결하기

인증서를 가져오고 두 가지 방법 중 하나를 사용하여 VPN을 구성한 후에 새 VPN 연결이 네트워크 목록 아래에 표시됩니다. VPN을 선택하고 연결을 클릭합니다. 사용자 이름과 암호를 입력하라는 메시지가 표시됩니다. 이를 입력하고 확인을 클릭하면 연결됩니다.

macOS에서 연결하기

다음 단계를 따라 인증서를 가져옵니다:

  1. 인증서 파일을 두 번 클릭합니다. Keychain Access가 시스템 키체인을 수정하려고 합니다라는 대화 상자가 나타납니다. 이를 허용하려면 암호를 입력하십시오.
  2. 암호를 입력한 후 키체인 수정을 클릭합니다.
  3. 새로 가져온 VPN 인증서를 두 번 클릭합니다. 이렇게하면 신뢰 수준을 지정할 수 있는 작은 속성 창이 표시됩니다. IP 보안 (IPSec)항상 신뢰로 설정하고 암호를 다시 입력하라는 메시지가 나옵니다. 이 설정은 암호를 입력한 후에 자동으로 저장됩니다.

이제 인증서가 가져와 신뢰되었으므로 다음 단계로 VPN 연결을 구성합니다:

  1. 시스템 환경 설정으로 이동하고 네트워크를 선택합니다.
  2. 네트워크 목록의 왼쪽 아래에있는 작은 “더하기” 버튼을 클릭합니다.
  3. 나타나는 팝업에서 인터페이스VPN으로 설정하고 VPN 유형IKEv2로 설정한 다음 연결에 이름을 지정합니다.
  4. 서버원격 ID 필드에 서버의 도메인 이름 또는 IP 주소를 입력합니다. 로컬 ID는 비워둡니다.
  5. 인증 설정을 클릭하고 사용자 이름을 선택한 다음 VPN 사용자에 대해 구성한 사용자 이름과 암호를 입력하십시오. 그런 다음 확인을 클릭합니다.

마지막으로 연결을 클릭하여 VPN에 연결합니다. 이제 VPN에 연결되었어야합니다.

우분투에서 연결하는 방법

우분투 머신에서 연결하려면 매번 연결할 때마다 StrongSwan을 서비스로 설정하고 관리할 수 있습니다. 양쪽에 대한 지침이 제공됩니다.

StrongSwan을 서비스로 관리

StrongSwan을 서비스로 관리하려면 다음 구성 단계를 수행해야 합니다.

먼저 apt를 사용하여 로컬 패키지 캐시를 업데이트합니다.

  1. sudo apt update

다음으로, 인증을 위한 필수 플러그인과 함께 StrongSwan을 설치합니다:

  1. sudo apt install strongswan libcharon-extra-plugins

이제 클라이언트가 서버의 신원을 확인할 수 있도록 CA 인증서의 사본이 /etc/ipsec.d/cacerts 디렉터리에 있어야 합니다. 다음 명령을 실행하여 ca-cert.pem 파일을 해당 위치로 복사합니다:

  1. sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

VPN이 필요할 때만 실행되도록 하려면 systemctl을 사용하여 StrongSwan이 자동으로 실행되지 않도록 설정합니다:

  1. sudo systemctl disable --now strongswan-starter

다음으로 VPN 서버에 인증할 사용자 이름과 암호를 구성해야 합니다. nano나 선호하는 편집기를 사용하여 /etc/ipsec.secrets를 편집합니다:

  1. sudo nano /etc/ipsec.secrets

다음 줄을 추가하고 강조된 사용자 이름과 암호 값을 서버에서 구성한 값과 일치하도록 수정합니다:

/etc/ipsec.secrets
your_username : EAP "your_password"

마지막으로, 클라이언트를 서버의 구성과 일치하도록 설정하려면 /etc/ipsec.conf 파일을 편집합니다:

/etc/ipsec.conf
config setup

conn ikev2-rw
    right=server_domain_or_IP
    # 이 값은 서버 구성의 'leftid' 값과 일치해야 합니다.
    rightid=server_domain_or_IP
    rightsubnet=0.0.0.0/0
    rightauth=pubkey
    leftsourceip=%config
    leftid=username
    leftauth=eap-mschapv2
    eap_identity=%identity
    auto=start

VPN에 연결하려면 다음을 입력합니다:

  1. sudo systemctl start strongswan-starter

다시 연결 해제하려면 다음을 입력합니다:

  1. sudo systemctl stop strongswan-starter

일회성 연결을 위해 charon-cmd 클라이언트 사용

StrongSwan을 서비스로 관리하려면 다음 구성 단계를 수행해야 합니다.

먼저 apt를 사용하여 로컬 패키지 캐시를 업데이트합니다.

  1. sudo apt update

다음으로, StrongSwan 및 인증에 필요한 플러그인을 설치해야 합니다:

  1. sudo apt install strongswan libcharon-extra-plugins

이제 클라이언트가 서버의 신원을 확인할 수 있도록 CA 인증서의 사본이 /etc/ipsec.d/cacerts 디렉토리에 있어야 합니다. 다음 명령을 실행하여 ca-cert.pem 파일을 해당 위치로 복사합니다:

  1. sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

이 시점에서 VPN 서버에 charon-cmd를 사용하여 VPN에 연결할 수 있습니다. 서버의 CA 인증서, VPN 서버의 IP 주소 및 구성한 사용자 이름을 사용하여 연결하십시오.

VPN에 연결하려면 다음 명령을 실행하십시오:

  1. sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username

프롬프트가 표시되면 VPN 사용자의 암호를 제공하고 VPN에 연결됩니다. 연결을 해제하려면 터미널에서 CTRL+C를 누르고 연결이 닫힐 때까지 기다리십시오.

iOS에서 연결

iOS 기기에서 VPN 연결을 구성하려면 다음 단계를 따르십시오:

  1. 루트 인증서가 첨부된 이메일을 자신에게 보냅니다.
  2. iOS 기기에서 이메일을 열고 첨부된 인증서 파일을 탭한 다음 설치를 탭하고 암호를 입력하십시오. 설치가 완료되면 완료를 탭하십시오.
  3. 설정, 일반, VPN으로 이동하고 VPN 구성 추가을 탭합니다. 이렇게 하면 VPN 연결 구성 화면이 표시됩니다.
  4. 유형을 탭하고 IKEv2를 선택합니다.
  5. 설명 필드에 VPN 연결을 위한 짧은 이름을 입력합니다. 이것은 원하는 대로 설정할 수 있습니다.
  6. 서버원격 ID 필드에 서버의 도메인 이름 또는 IP 주소를 입력합니다. 로컬 ID 필드는 비워둘 수 있습니다.
  7. 인증 섹션에 사용자 이름과 비밀번호를 입력한 다음 완료를 탭합니다.
  8. 방금 만든 VPN 연결을 선택하고 페이지 상단의 스위치를 탭하여 연결합니다.

안드로이드에서 연결하기

다음 단계를 따라 인증서를 가져옵니다:

  1. CA 인증서가 첨부된 이메일을 보냅니다. CA 인증서를 다운로드 폴더에 저장합니다.
  2. Play 스토어에서 StrongSwan VPN 클라이언트를 다운로드합니다.
  3. 앱을 엽니다. 오른쪽 상단의 “더보기” 아이콘 (. . .)을 탭하고 CA 인증서를 선택합니다.
  4. “더 보기” 아이콘을 다시 선택하세요 (. . .) 우측 상단에. 인증서 가져오기를 선택하세요.
  5. 다운로드 폴더에 있는 CA 인증서 파일로 이동하여 선택하여 앱에 가져옵니다.

이제 StrongSwan 앱에 인증서가 가져와졌으므로 다음 단계로 VPN 연결을 구성할 수 있습니다:

  1. 앱에서 상단에 있는 VPN 프로필 추가를 탭하세요.
  2. 서버에 VPN 서버의 도메인 이름 또는 공인 IP 주소를 입력하세요.
  3. VPN 유형으로 IKEv2 EAP (사용자 이름/비밀번호)가 선택되었는지 확인하세요.
  4. 사용자 이름비밀번호를 서버에서 정의한 자격 증명으로 입력하세요.
  5. 자동으로 선택을 선택 해제하고 CA 인증서 섹션에서 CA 인증서 선택를 클릭하세요.
  6. 화면 상단의 가져온 탭을 탭하고 가져온 CA를 선택하세요 (이름이 “VPN 루트 CA”로 표시됩니다. 이전에 “DN”을 변경하지 않았다면).
  7. 원하는 경우 프로필 이름 (선택 사항)을 더 구체적인 이름으로 입력하세요.

VPN에 연결하려면 StrongSwan 애플리케이션에서 방금 만든 프로필을 클릭하세요.

연결 문제 해결

인증서를 가져올 수 없는 경우 파일이 .pem 확장자가 있는지 확인하고 .pem.txt가 아닌지 확인하십시오.

VPN에 연결할 수 없는 경우 사용한 서버 이름 또는 IP 주소를 확인하십시오. 서버의 도메인 이름 또는 IP 주소는 인증서를 만들 때 공통 이름 (CN)으로 구성한 것과 일치해야합니다. 일치하지 않으면 VPN 연결이 작동하지 않습니다. 예를 들어, vpn.example.com의 CN으로 인증서를 설정한 경우 VPN 서버 세부 정보를 입력할 때 vpn.example.com을 사용해야합니다. 인증서를 생성할 때 사용한 명령 및 VPN 연결을 생성할 때 사용한 값도 다시 확인하십시오.

마지막으로, 도메인 이름을 사용하는 경우 VPN 구성에서 leftid 값이 @ 기호로 구성되어 있는지 확인하십시오:

/etc/ipsec.conf
    leftid=@vpn.example.com

IP 주소를 사용하는 경우 @ 기호가 생략되어 있는지 확인하십시오. 또한 server-cert.pem 파일을 생성할 때 --san @IP_주소--san IP_주소 플래그를 모두 포함했는지 확인하십시오.

결론

이 튜토리얼에서는 IKEv2 프로토콜을 사용하는 VPN 서버를 구축했습니다. 서버 및 클라이언트의 연결을 제어하는 지시문에 대해 배웠으며 Windows, macOS, iOS, Android 또는 Linux 클라이언트를 VPN에 연결하도록 구성했습니다.

/etc/ipsec.secrets 파일에 사용자를 추가하거나 제거하려면 다시 단계 5로 이동하십시오. 각 줄은 하나의 사용자를 위한 것이므로 사용자를 추가하거나 제거하거나 암호를 변경하는 것은 파일을 편집하는 것만으로 가능합니다.

이제 온라인 활동이 어디에서든 안전하게 유지되며 인터넷에 액세스하는 데 사용하는 모든 장치에서 안심할 수 있습니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-22-04