본문 바로가기

컴퓨터/보안

strongSwan으로 IKEv2 VPN 구축하기 (윈도우, 안드로이드 클라이언트)

 

  IKEv2 VPN을 구축해보려고 찾아보니 strongSwan 구축 방법이 적힌 블로그 글이 가장 친절하게 나와서 따라하다가 버전이 바뀌고 환경이 달라서 잘 안되는 부분이 발생했다.

 

www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-18-04-2

 

How to Set Up an IKEv2 VPN Server with StrongSwan on Ubuntu 18.04 | DigitalOcean

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. IKEv2, or Internet Key Exchange v2, is a...

www.digitalocean.com

 

  구글 검색과 삽질 끝에 윈도우 클라이언트, 안드로이드 클라이언트에서 접속 성공해서 구축기를 적어본다.

  일단 나의 서버/클라이언트 환경은 이렇다.

 

서버 환경

운영체제 : 오라클 클라우드 Ubuntu 20.04

방화벽 : 오라클 클라우드 방화벽 사용

           ufw 사용하지 않음

           iptables 사용

strongSwan 버전 : 5.8.2

 

클라이언트 환경

윈도우10 20H2

안드로이드 스마트폰

 

1. strongSwan 설치

$ sudo apt install strongswan strongswan-pki



2. 인증서 생성하여 ipsec 디렉토리에 복사

  아래 명령어를 이용해 VPN 접속시 필요한 CA 인증서를 만든다. [인증서_이름]에는 인증서 이름 아무거나, [도메인_또는_IP주소]에는 자신이 구축할 VPN 서버의 도메인주소나 공인IP주소를 입력한다.

 

$ mkdir -p ~/pki/{cacerts,certs,private}
$ chmod 700 ~/pki
$ ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
$ ipsec pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem --type rsa --dn "CN=[인증서_이름]" --outform pem > ~/pki/cacerts/ca-cert.pem
$ ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
$ ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa | ipsec pki --issue --lifetime 1825 --cacert ~/pki/cacerts/ca-cert.pem --cakey ~/pki/private/ca-key.pem --dn "CN=[도메인_또는_IP주소]" --san "[도메인_또는_IP주소]" --flag serverAuth --flag ikeIntermediate --outform pem > ~/pki/certs/server-cert.pem
$ sudo cp -r ~/pki/* /etc/ipsec.d/


3. IPSec 설정

  아래 명령으로 현재의 ipsec.conf 파일을 백업하고 ipsec.conf 파일을 수정한다.

 

$ sudo mv /etc/ipsec.conf{,.original}
$ sudo vi /etc/ipsec.conf

 

    아래 내용을 붙여넣고, leftid 부분을 @vpn.myvpn.com 또는 @ 없이 163.126.63.1와 같이 VPN 서버 주소를 입력한다. 

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=[@도메인_또는_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

 

4. 계정 설정

  ipsec.secrets 파일에 서버키를 명시해주고, VPN 접속 시 사용할 ID, 패스워드를 적어준다.

  아래 빨간 부분에 ID와 패스워드를 설정해주면 된다.

 

 

$ sudo vi /etc/ipsec.secrets

 

: RSA "server-key.pem"
myvpnid : EAP "password"

 

5. strongSwan 재시작

 

$ sudo ipsec rereadsecrets
$ sudo ipsec reload
$ sudo ipsec restart

 

6. 오라클 클라우드 방화벽 허용

  오라클 클라우드 Security List의 Ingress Rule에 아래 2개 포트를 허용해준다.

  500/UDP, 4500/UDP

 

 

7. VPN에서 외부 통신을 위한 NAT 규칙 설정

  위의 설정까지 완료하면 VPN으로 접속은 되지만, 10.10.10.0/24 대역을 할당받은 VPN에서 인터넷을 하려면 실제 IP주소 매핑이 필요하다.

  나는 서버에서 ufw를 비활성화해놓고 있어서 iptables를 이용해 설정을 했다. 아래 명령을 실행해 결과에 나오는 인터페이스명을 iptables 명령을 실행할 때 -o 옵션 뒤에 적어준다.

 

 

$ ip route | grep default

 

  *결과 예 : default via 192.168.0.1 dev ens3 proto

 

$ sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o ens3 -m policy --dir out --pol ipsec -j ACCEPT 
$ sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o ens3 -j MASQUERADE
$ sudo service iptables restart

 

8. 클라이언트에 등록할 CA 인증서 복사

  아래 명령어를 이용하여 현재 경로에 CA 인증서를 복사한다.

 

 

$ cat /etc/ipsec.d/cacerts/ca-cert.pem >> ca-cert.cer

 

  SFTP 등을 이용하여 생성한 ca-cert.cer 파일을 다운받은 후 VPN에 접속할 윈도우, 안드로이드 스마트폰에 옮겨놓는다.

 

9. 윈도우에서 CA 인증서 등록

  7에서 다운로드한 ca-cert.cer 파일을 더블클릭하여 인증서 설치를 선택한다.

  인증서 가져오기 마법사 창에서 저장소 위치를 '로컬 컴퓨터'를 선택 후 다음을 클릭한다.

 

  모든 인증서를 다음 저장소에 저장을 선택하고 찾아보기를 클릭한다.

 

 

  인증서 저장소 선택창에서 신뢰할 수 있는 루트 인증 기관을 선택 후 확인을 클릭 후 창이 닫히면 다음을 누른다.

 

 

  인증서 가져오기 마법사 완료 화면에서 마침을 클릭한다.

 

 

10. 윈도우10에서 VPN 접속

  윈도우키 > 'vpn' 입력 > vpn 설정을 선택하고, 설정 창이 뜨면 VPN 연결 추가 선택한다.

 

 

 

  원하는 VPN 이름, 서버주소, VPN종류, 사용자 이름 및 암호, 4번 과정에서 생성한 ID/패스워드를 설정하고 저장을 누른다.

 

 

  윈도우10에서는 기본적으로 취약한 IPsec 매개변수를 사용하여 IKEv2 VPN 연결을 시도한다. 따라서 기본 설정으로 접속 시도 시 strongSwan 서버에서 해당 연결을 거부한다. 따라서 IPsec 설정을 변경해주기 위해 Powershell을 관리자 권한으로 실행하여 아래 명령을 실행한다. ConnectionName은 위에서 설정한 연결이름을 적으면 된다. 

 

Set-VpnConnectionIPsecConfiguration -ConnectionName "VPN" -AuthenticationTransformConstants SHA256128 -CipherTransformConstants AES128 -DHGroup Group14 -EncryptionMethod AES128 -IntegrityCheckMethod SHA256 -PFSgroup PFS2048 -Force

 

  위 명령어를 실행하고 VPN 연결 버튼을 누르면 VPN에 성공적으로 연결된다.

  (윈도우10 버전에 따라 다른 것 같은데, ID/패스워드를 제대로 입력했음에도 패스워드가 틀렸다고 재확인 창이 뜰 때도 있다. 이 경우 패스워드를 다시 입력해주면 정상적으로 연결이 된다.)

 

 

 

11. 안드로이드 클라이언트에서 CA 인증서 등록

  안드로이드는 Play 스토어에 strongSwan 클라이언트가 있다. 이 앱을 설치한다.

 

 

  앱을 실행해서 오른쪽 상단에 점 세개를 누르고 CA certificates 메뉴를 누른다.

 

 

  그럼 아래처럼 핸드폰 내에 있는 인증서 목록들이 나열된다. 오른쪽 상단에 점 세개를 누르고 Import certificate 메뉴를 선택해 핸드폰으로 옮겨놓은 VPN용 CA 인증서를 선택해서 등록한다. 정상적으로 등록되면 IMPORTED 탭에서 확인 가능하다.

 

 

12. 안드로이드에서 VPN 접속

  인증서 등록이 완료되면 첫화면에서 ADD VPN PROFILE 메뉴를 선택한다.

 

  아래와 같이 서버 주소, VPN 타입, ID/패스워드, 프로파일명을 입력하고 저장한다.

 

  새로 생성된 프로파일을 누르면 자동으로 연결 시도를 하고 문제가 없다면 아래와 같이 연결이 성공한다.

 

참고자료

우분투 18.04 VPN 서버 구축 (IKEv2)

How to Set Up an IKEv2 VPN Server with StrongSwan on Ubuntu 18.04
Introduction to strongSwan: Forwarding and Split-Tunneling

Always On VPN IKEv2 Policy Mismatch Error
Always On VPN IKEv2 Security Configuration