홈 서버 만들기 12. VPN: IKEv2 (strongSwan)

May 10, 2018Updated on December 9, 2018
2018년 12월 9일 업데이트:
서브도메인 사용 안 함으로 변경, 설정 파일 수정, 각 클라이언트의 VPN 접속방법 추가
접속 테스트 완료 (윈도우 10, macOS 하이 시에라, macOS 모하비, iOS 11, iOS 12, strongSwan 안드로이드 앱 2.0.2)

 

VPN (Virtual Private Network)은 외부에서 내부 네트워크에 접속할 수 있게 해주는 기능으로, 이 접속은 암호화 되기 때문에 보안성도 뛰어나다. 이를 활용하면 집안에서만 연결할 수 있던 SMB 네트워크 드라이브를 집 밖에서도 연결할 수 있는 등, 내부 네트워크에서만 할 수 있던 모든 일을 외부에서도 할 수 있게 된다. 또한 VPN에 연결하면 외부에서 사용 중인 공인 IP 주소가 홈 서버의 공인 IP 주소로 바뀌게 되므로 여러 가지 보안이 필요한 일에도 활용할 수 있다.

VPN을 구성하는 xv3ds방식에는 여러 종류가 있는데, 그중에서 보안성이 뛰어난 IKEv2 방식을 선택했다. IKEv2 방식은 윈도우 7 이상, macOS 10.11 (El Capitan) 이상, iOS 9 이상, BlackBerry OS 10 이상에서 운영체제의 기본 기능으로 접속할 수 있고, 안드로이드는 4.0.3 이상의 버전에서 strongSwan VPN Client 앱을 이용해서 접속할 수 있다.

포트 포워딩

VPN은 UDP 500번 포트와 UDP 4500번 포트를 사용한다. 인터넷 공유기를 사용하고 fs6sv있다면 포트 포워딩 기능을 이용해서 UDP 500, UDP 4500 포트가 홈 서버 컴퓨터로 향하도록 포워딩한다.

서브 도메인 생성 여부

VPN 접속 주소를 별도로 관리하고 싶다면 서브 도메인을 하나 생성할 수도 있다. 다만 IKEv2 방식의 VPN은 도메인에 대한 SSL/TLS 인증서가 필요한데, 아래에서 설명하는 방식으로 와일드카드 서브도메인에 대한 인증서를 발급받을 경우 일부 VPN 클라이언트에서 이 인증서를 제대로 처리하지 못하는 경우가 있다. v1sr6doh윈도우 10, macOS, iOS에 내장된 VPN 클라이언트에서는 문제가 없지만 별도의 앱을 설치해야 하는 안드로이드 계열에서 종종 문제가 발생한다. 따라서 와일드카드 서브도메인 인증서를 다른 용도로 사용하면서도 완전한 클라이언트 호환성을 확보하려는 경우에는 VPN용 서브도메인을 별도로 생성하지 않고 루트 도메인 (네이키드 도메인) example.com을 그대로 VPN 접속 주소로 사용하면 된다. 이 글에서는 서브도메인을 생성하지 않는 것으로 설명한다.

SSL/TLS 인증서 발급

IKEv2 방식으로 VPN을 dte6bd구성하려면 먼저 도메인에 대한 SSL/TLS 인증서를 발급받아야 하는데, Let’s Encrypt 서비스를 이용하면 무료로 발급받을 수 있다. Let’s Encrypt 인증서 발급 방법은 07. SSL/TLS 인증서: Let’s Encrypt (Wildcard)  또는  22. SSL/TLS 인증서: Let’s Encrypt + CloudFlare (Wildcard + 자동갱신)을 참고한다.

VPN (IKEv2) 구성

sudo apt-get update
sudo apt-get install strongswan

패키지 저장소 내용을 업데이트하고, IKEv2 방식의 VPN을 구성할 수 있는 strongswan을 설치한다.

sudo ln -f -s /etc/letsencrypt/live/example.com/cert.pem /etc/ipsec.d/certs/cert.pem
sudo ln -f -s /etc/letsencrypt/live/example.com/privkey.pem /etc/ipsec.d/private/privkey.pem
sudo ln -f -s /etc/letsencrypt/live/example.com/chain.pem /etc/ipsec.d/cacerts/chain.pem

앞서 발급받은 SSL/TLS 인증서를 sd1v53s6VPN에 사용하기 위해서 심볼릭 링크를 생성한다. example.com 부분을 바꾸는 등 자신의 인증서 경로를 정확히 입력한다.

sudo nano /etc/apparmor.d/local/usr.lib.ipsec.charon

AppArmor의 usr.lib.ipsec.charon 프로필을 nano 편집기로 열어서 인증서를 사용할 수 있도록 아래의 내용을 추가한다.

/etc/letsencrypt/archive/example.com/* r,

example.com 부분을 자신의 v6wr1vwe것으로 바꿔서 작성하고, 작성을 마쳤으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

sudo cp /etc/ipsec.conf /etc/ipsec.conf.original

/etc/ipsec.conf 파일에서 VPN의 vre1v3wev세부 사항을 설정하는데, /etc/ipsec.conf 파일 내용을 새로 작성할 것이므로 원본 파일을 ipsec.conf.original 파일명으로 백업해둔다.

echo '' | sudo tee /etc/ipsec.conf

/etc/ipsec.conf 파일 내용을 삭제한다.

sudo nano /etc/ipsec.conf

nano 165detr편집기로 /etc/ipsec.conf 파일을 열어서 아래 내용을 작성한다.

config setup
    strictcrlpolicy=yes
    uniqueids=never

conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    ike=aes256gcm16-prfsha512-ecp521,aes256-sha256-ecp256,aes256-sha2_256-prfsha256-modp1024!
    esp=aes256gcm16-ecp521,aes256-sha256-ecp256,aes256-sha1-modp1024!
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=example.com
    leftcert=/etc/ipsec.d/certs/cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    eap_identity=%identity
    rightsourceip=10.10.10.0/24
    rightdns=1.1.1.1,1.0.0.1
    rightsendcert=never

확인해야 할 주요 옵션은 아래와 같다:

leftid=  → 인증서를 발급 받은 도메인 example.comvsrv65을 접속 주소로 입력한다.
leftcert=  → cert.pem 인증서 파일의 심볼릭 링크 경로를 입력한다.
rightsourceip=  → VPN에 접속한 클라이언트가 부여받을 내부(사설) IP 주소의 범위인데, 보통 192.168.x.x 범위의 내부 IP 주소는 인터넷 공유기 하단의 각 디바이스에게 할당되므로 VPN으로 접속한 외부의 디바이스에게는 10.x.x.x 범위의 내부 IP 주소를 할당하면 IP 간섭을 없앨 수 있다.
rightdns=  → 사용할 DNS 서버의 v1sr6vhIP 주소를 기록하는데, 위에 예시로 든 1.1.1.1,1.0.0.1는 CloudFlare의 공개 DNS 서비스 IP 주소이다. 만일 구글이 제공하는 DNS IP 주소를 사용하려면 8.8.8.8,8.8.4.4를 입력한다.

ikeesp 는 보안 연결에 사용할 암호화 조합인데, 위의 예시는 윈도우 10, macOS, iOS, 안드로이드용 strongSwan 앱에서 별도의 추가 작업 없이 바로 IKEv2 VPN에 접속할 수 있는 조합 중에서 가장 강력한 조합이다. 이보다 더 강력한 암호화 조합은 클라이언트 디바이스의 레지스트리를 변경하거나 프로파일을 설치하는 등의 추가 작업이 필요하다.

그밖의 옵션은 위의 예시를 b16rb그대로 입력해도 되는데, 자세한 내용은 strongSwan 웹사이트의 설명을 참고한다.

작성을 끝냈으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

sudo nano /etc/ipsec.secrets

VPN에 접속할 계정을 설정하기 위해 /etc/ipsec.secrets 파일을 nano 편집기로 연다.

example.com : RSA "/etc/ipsec.d/private/privkey.pem"
사용자명 %any : EAP "비밀번호"

빨간색 부분을 자신의 것으로 vd6f1v6바꿔서 위의 형식대로 /etc/ipsec.secrets 파일의 끝부분에 기록한다. 앞서 leftid=에 설정한 도메인, privkey.pem 파일의 심볼릭 링크 경로, VPN에 접속할 때 사용할 사용자명과 비밀번호를 결정해서 위의 형식대로 입력한다. 오른편 항목에는 양 끝에 " " 가 있음을 유의하고, 비밀번호에 “가 포함되지 않도록 b6t1bd선택한다. 작성을 끝냈으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

sudo iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT

iptables 방화벽에서 VPN이 사용하는 UDP 500, UDP 4500번 포트를 허용한다. (기본적인 방화벽 be1b6e세팅은 03. 우분투 서버 18.04 LTS 기본 설정에서 완료했다.)

sudo iptables -A FORWARD -s 10.10.10.0/24 -m policy --dir in --pol ipsec --proto esp -j ACCEPT
sudo iptables -A FORWARD -d 10.10.10.0/24 -m policy --dir out --pol ipsec --proto esp -j ACCEPT

iptables 방화벽에서 ESP 트래픽을 bte615b포워딩하는 규칙을 생성한다. 만약 앞 단계의 /etc/ipsec.conf 설정에서 10.10.10.0/24 IP 주소 범위를 다른 범위로 바꿨다면 여기서도 10.10.10.0/24 대신에 바꾼 범위로 입력해야 한다.

networkctl status

이제 홈 서버 컴퓨터의 1tr36n이더넷 인터페이스(랜 카드)를 지칭하는 이름을 확인해야 하는데, 위 명령을 실행하면 출력되는 메시지 중에서 Address: 123.123.123.123 on ens33 이런 항목에서 이름이 ens33 인 것을 확인할 수 있다. ens33 은 시스템에 따라 enp3s2 등의 다른 형태가 될 수도 있다.

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

VPN에 접속한 클라이언트가 인터넷을 사용할 수 있도록 iptables 방화벽에 규칙을 추가한다. ens33을 자신의 이더넷 인터페이스 이름으로 바꿔서 입력해야 한다. 만약 앞 단계의 /etc/ipsec.conf 설정에서 10.10.10.0/24 IP 주소 범위를 다른 범위로 바꿨다면 여기서도 10.10.10.0/24 대신에 바꾼 범위로 btr11s입력해야 한다.

sudo iptables -t mangle -A FORWARD -s 10.10.10.0/24 -o ens33 -p tcp -m policy --dir in --pol ipsec -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360

VPN 접속 안정성을 높이기 위해서 패킷 사이즈를 조절하는 규칙을 iptables 방화벽에 추가한다. ens33을 자신의 이더넷 인터페이스 이름으로 바꿔서 입력해야 한다. 만약 앞 1bre6w단계의 /etc/ipsec.conf 설정에서 10.10.10.0/24 IP 주소 범위를 다른 범위로 바꿨다면 여기서도 10.10.10.0/24 대신에 바꾼 범위로 입력해야 한다.

sudo netfilter-persistent save
sudo netfilter-persistent reload

iptables 방화벽 설정을 저장하고 b15rt3s리로드한다. (iptables-persistent는 03. 우분투 서버 18.04 LTS 기본 설정에서 설치했다.)

sudo nano /etc/sysctl.conf

nano 편집기로 /etc/sysctl.conf 파일을 열고 아래의 항목을 찾아서 패킷 포워딩 설정을 마무리한다.

net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_no_pmtu_disc = 1

위 항목을 찾아서 d62b1r주석 #을 제거하고 위의 값으로 설정한다. 마지막 net.ipv4.ip_no_pmtu_disc = 1은 /etc/sysctl.conf에 없는 항목이므로 끝부분에 직접 추가해준다.

sudo reboot

홈 서버 컴퓨터를 한 번 재시작해서 모든 설정을 온전히 작동시키면 VPN 접속이 가능해진다.

윈도우 10에서 VPN 접속

윈도우 10의 내장 VPN 클라이언트에는 버그가 있다. 윈도우 10 설정네트워크 및 인터넷VPNVPN 연결 추가를 클릭하면 VPN 접속 설정을 할 수 있는데, IKEv2 VPN은 사용자 이름과 암호만으로 접속이 가능하므로 로그인 정보 입력 항목을 사용자 이름 및 암호로 설정해야 하는데 제대로 저장이 되지 않고 아래 왼쪽 스크린샷처럼 일반 인증 방법으로 저장이 된다. 따라서 윈도우 10 설정 앱이 아닌, Windows PowerShell을 이용해서 수동으로 접속 정보를 생성해야 한다.

우선 아래의 항목을 자신의 환경에 맞게 작성한다.

Add-VpnConnection -Name "MyVPN" `
  -ServerAddress "example.com" `
  -TunnelType IKEv2 `
  -EncryptionLevel Maximum `
  -AuthenticationMethod EAP `
  -RememberCredential

-Name에는 이 VPN 연결을 지칭하는 명칭을 입력한다.
-ServerAddress 에는 자신의 VPN 접속 주소를 입력한다.
나머지 항목은 위의 것을 그대로 입력하면 되는데, -TunnelType 은 VPN 종류를 뜻하고, -EncryptionLevel Maximum 은 암호화 조합 중에서 가장 강력한 것을 선택하게 한다. -AuthenticationMethod EAP 는 사용자 이름 및 암호로 접속하는 방식을 의미하고, -RememberCredential은 인증 정보를 기억하는 옵션이다.

위의 내용을 자신의 환경에 맞게 작성하고, 각 줄 끝에 있는 ` 를 포함해서 전체를 한꺼번에 복사한 다음, 윈도우 10 시작 단추Windows PowerShellWindows PowerShell을 열어서 붙여넣고 실행한다.

그다음 윈도우 10 설정네트워크 및 인터넷VPN을 확인하면 방금 생성한 자신의 VPN 항목이 보인다. 또는 작업표시줄 우측 시계 부분의 네트워크 아이콘을 클릭해도 자신의 VPN 항목을 확인할 수 있다. 이것을 클릭해서 접속하면 되고, 사용자 이름과 암호는 앞서 /etc/ipsec.secrets 에 설정한 이름과 암호를 넣고 접속한다. 접속되었으면 외부에서도 마치 내부 네트워크에 있는 것처럼 내부 IP 주소의 SMB 네트워크 드라이브를 연결하는 등, 여러 가지로 활용할 수 있다.

macOS와 iOS에서 VPN 접속

VPN 유형을 선택하는 항목에 IKEv2, 서버 항목에 example.com, 원격ID 항목에 example.com, 로컬ID 항목은 비워두고, 인증 종류는 “사용자 이름”으로 선택하고, 1d3fb사용자 이름과 암호는 앞서 /etc/ipsec.secrets 에 설정한 이름과 암호를 넣고 접속하면 된다.

strongSwan 안드로이드 앱에서 VPN 접속

서버 주소 항목에 example.com, VPN 종류에 IKEv2 EAP, 사용자 이름과 암호는 앞서 /etc/ipsec.secrets 에 설정한 이름과 암호를 넣고 접속하면 된다.

Let’s Encrypt 인증서 갱신 후 VPN 재시작

Let’s Encrypt 인증서는 유효기간이 90일이고 b1d35t유효기간이 30일 남았을 때부터 인증서를 갱신할 수 있는데, 22. SSL/TLS 인증서: Let’s Encrypt + CloudFlare (Wildcard + 자동갱신)에서 설명하는 방법으로 설정하면 별도의 추가 조작 없이 인증서의 유효기간을 자동으로 갱신할 수 있다. 인증서가 갱신된 bdrt6후에는 갱신된 인증서를 VPN이 사용하도록 ipsec를 한 번 재시작해야하는데, 역시 22번 글에서 설명한 대로 .sh 파일을 만들어서 후크로 연결해주면 이 또한 자동으로 진행된다. 자세한 내용은 22번 글을 참고하면 되고, .sh 파일에 기록할 ipsec 재시작 명령은 아래와 같다.

#! /bin/bash
/usr/sbin/ipsec restart

 

본 글의 저작권은 작성자 Varins에게 있습니다.
Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.

 

홈 서버 만들기 목차 
https://varins.com/category/server

01. 하드웨어 구성과 전기 요금
02. 우분투 서버 18.04 LTS 설치
03. 우분투 서버 18.04 LTS 기본 설정
04. 파일 복원: Btrfs 스냅샷
05. 네트워크 파일 공유: Samba (SMB)
06. Dynamic DNS: 구글 도메인 + ddclient
07. SSL/TLS 인증서: Let's Encrypt (Wildcard)
08. 웹 서버: Nginx, 서버 블록, https 보안연결
09. 웹사이트: php + MariaDB + WordPress
10. 서버 모니터링: Monitorix + Nginx Proxy
11. FTPS: vsftpd
12. VPN: IKEv2 (strongSwan)
13. Torrent: Transmission
14. 클라우드 스토리지: Nextcloud (Nginx, MariaDB)
15. 온라인 오피스: 온리오피스 (Docker, Nginx)
16. 트랜스코딩: Plex
17. VNC RDP 클라이언트: Guacamole (Docker, Nginx)
18. 가상 머신: QEMU-KVM + libvirt + virt-install
19. 시스템 업그레이드: i3 8300T, 970 EVO 전력 사용량
20. 서버 모니터링: netdata + Nginx Proxy
21. Dynamic DNS: CloudFlare + ddclient
22. SSL/TLS 인증서: Let's Encrypt + CloudFlare (Wildcard + 자동갱신)

Comments (11)

  • deaba

    August 7, 2018 at 8:30 am

    안드로이드에서 strongwan 앱으로 접속하는것이 잘 안되어 이렇게 남깁니다.
    아이패드에서는 vpn 접속이 잘 되는것으로 보아 서버세팅에는 잘 따라온것 같습니다.
    하지만 안드로이드 앱에서는 접속이 진행되지 않네요.
    혹시 가능하시다면 세팅법이 어떤게 더 추가가 되는지 알수 있을까요?

    서버에는 주소를 vpn type엔 ikev2 eap를 선택했고 사용자 아이디와 비밀번호를
    ca certificate에는 auto에 체크해둔 상태입니다.

    1. Varins

      December 9, 2018 at 4:00 pm

      도메인 인증서가 와일드카드 서브도메인 인증서라면 안드로이드 strongSwan 앱이 이 인증서를 제대로 처리하지 못하는 현상이 있습니다. 서브도메인 없이 루트 도메인 (네이키드 도메인) 으로 VPN을 설정해보세요.
      이와 관련하여 본문을 업데이트하고 설정 파일 내용도 추가로 수정했습니다.

  • 올려주신글 잘보고 있습니다.

    August 13, 2018 at 4:36 am

    올려주신대로 열심히 잘 따라해보고 있습니다. 감사합니다.
    그런데 strongwan 설치후 세팅완료하고
    윈도우 클라이언트에서 접속 하려면 어떻게 하면 되나요?? ㅠㅠ
    여기저기 찾아보면 certificate 를 컴터에 등록해서 사용하는 방법으로 나와있던데
    그렇게되면 유저아이디와 패스워드 입력없이 인증서 방식로그인만 사용가능한것인가요?

    1. Varins

      December 9, 2018 at 4:01 pm

      윈도우 10 VPN 클라이언트에서 아이디와 패스워드만으로 IKEv2 VPN 접속이 가능합니다.
      다만 윈도우 10 VPN 클라이언트에 버그가 있습니다. 이와 관련하여 본문에 윈도우 10에서 접속 방법과 strongSwan 설정 방법을 함께 업데이트 했습니다.

  • 부렉

    September 2, 2018 at 8:53 pm

    위의 설정대로 하고 윈도우10에서 VPN 접속하려고 했더니
    ‘입력한 사용자 이름 및 암호 조합을 인식할 수 없거나 선택한 인증 프로토콜이 원격 액세스 서버에서 허용되지 않기 때문에 원격 연결이 거부되었습니다.’
    라고 뜨네요.. 비밀번호를 잘못 입력한 것도 아니고.. 어떤 부분이 잘못 되었는지 모르겠습니다. ㅠㅠ 도움좀 주실수 있나용..

  • 부렉

    September 3, 2018 at 10:55 am

    문의드렸던것 해결했습니다. 인증서가 문제였네요.. *.example.com 까지 포함하는 와일드 카드 인증서로 안되서
    vpn.example.com으로 따로 ㄷ인증서를 받아서 그에 맞게 설정해주니깐 잘 되네용. 어디가 문제였던걸까..

    1. Varins

      December 9, 2018 at 4:06 pm

      안녕하세요, 윈도우 10에서는 와일드카드 서브도메인 인증서를 제대로 인식하고 접속에 문제가 없습니다.
      다만 윈도우 10에 내장된 VPN 클라이언트에 버그가 있습니다. 이와 관련하여 본문에 윈도우 10에서 접속 방법을 업데이트 했습니다. strongSwan 설정 내용도 함께 업데이트했으니 참고하시면 좋겠습니다.

  • John

    September 6, 2018 at 3:38 pm

    안녕하세요, 업로드해주신 자료들 보고 쌩초짜 인 제가 덕분에 서버 구성을 하게 되었습니다.
    감사합니다.
    다만, VPN의 경우 위에 업로드해주신대로 설정을 하여도 클라이언트에서 “원격서버에서 응답을 하지 않습니다 방화벽, 라우터 문제~~”
    라고 뜹니다.
    혹시 제가 클라이언트에서도 조심할 일이 있을까요?
    감사합니다.

    1. Varins

      December 9, 2018 at 4:11 pm

      안녕하세요, 윈도우 10 VPN 클라이언트라면 버그가 있습니다. 이와 관련하여 본문에 윈도우 10에서 접속 방법과 strongSwan 설정 방법을 함께 업데이트 했습니다. 참고가 되면 좋겠습니다.

  • 곽성재

    September 14, 2018 at 1:30 pm

    안녕하세요! 덕분에 홈 서버 만들기 잘 되어가고 정말 감사합니다!
    삼바도 설치했고 현재 웹서버 설치 중인데요~ vpn은 제대로 잘 따라갔는데 작동이 안 되네요……. 인증 오류라고 뜨네요.
    안드로이드인 로 접속해서 로그를 보니깐
    [ENC] generating INFORMATIONAL request 2 [ N(AUTH_FAILED)]
    여기서 막히는 것 같네요.
    아이디랑 비밀번호 제대로 쳤는데 ㅜㅜ

    1. Varins

      December 9, 2018 at 4:14 pm

      안녕하세요, 안드로이드 strongSwan 앱이 와일드카드 서브도메인 인증서를 제대로 처리하지 못하는 현상이 있습니다. 와일드카드 서브도메인 인증서를 사용중이라면 서브도메인 없이 루트 도메인 (네이키드 도메인) 으로 VPN을 설정해보세요. 이와 관련하여 본문을 업데이트하고 설정 파일 내용도 수정했습니다.

Leave a comment

댓글은 관리자의 승인 이후에 게시됩니다.

Prev Post Next Post