일상의 정리

Orange pi를 이용한 IKEv2 VPN Server 설치

리눅스/설치

VPN 서비스는 외국에서 한국의 서비스를 이용하거나, mVOIP 사용량 제한을 우회하기 위해 많이 사용됩니다.
이번에 
중국에 지인이 있어서 중국의 만리 방화벽을 뚫을 수 있는 VPN 서비스를 찾다 보니 일반 공유기가 지원하는 L2TP 또는 PPTP등의 VPN 서비스는 만리 방화벽에 막혀서 안된다고 합니다. 그래서 가능한 방법을 찾아보니 IKEv2 VPN은 가능하다고 하는데 놀고 있는 Orange Pi 에 올려서 서비스를 해 보고자 방법을 찾아 공유를 합니다. 
Orange Pi 여서 Armbian 기준이며, id/password 방식을 사용하려면 mschapv2 플러그인이 필요한데 armbian 기본 패키지에서는 제공이 안되서 소스 컴파일 하여 설치를 하였습니다. 
Raspbian 에서도 잘 될 것으로 보이며, Raspbian 에서는 apt 설치 패키지에 mschapv2 플러그인이 있다면 설치 패키지를 사용하는 편이 시간이 절약될 것으로 보입니다.

 

1. Letsencrypt 인증서 발급

Ikev2 서버를 사용자 id/password 를 이용하여 접속하기 위해서는 인증서가 필요합니다.
무료인증서인 Let's Encrypt 인증서를 발급 받습니다.

# apt install certbot
# certbot certonly --rsa-key-size 4096 --standalone --agree-tos --no-eff-email --email your@email.com -d your_domain_name

 

2. 인증서 확인

인증서 발급이 성공하면 아래와 같이 인증서 파일이 있는 지 확인하고
인증서의 유효기간을 확인해 봅니다.

# ls -l /etc/letsencrypt/live/your_domain_name
lrwxrwxrwx 1 root root  42 Jul 29 22:36 cert.pem -> ../../archive/your.domain.name/cert1.pem
lrwxrwxrwx 1 root root  43 Jul 29 22:36 chain.pem -> ../../archive/your.domain.name/chain1.pem
lrwxrwxrwx 1 root root  47 Jul 29 22:36 fullchain.pem -> ../../archive/your.domain.name/fullchain1.pem
lrwxrwxrwx 1 root root  45 Jul 29 22:36 privkey.pem -> ../../archive/your.domain.name/privkey1.pem
-rw-r--r-- 1 root root 543 Mar  5 22:24 README
# certbot certificates
-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: your.domain.name
    Domains: your.domain.name
    Expiry Date: 2019-10-27 12:36:13+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/your.domain.name/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/your.domain.name/privkey.pem
-------------------------------------------------------------------------------

 

3. Strongswan Server download

아래 명령으로 Strongswan 최신버전을 다운로드합니다.
apt-get 으로 설치할 수 있는 Armbian 패키지는 mschapv2를 지원하지 않으므로 직접 소스에서 설치를 합니다.

# wget https://download.strongswan.org/strongswan-5.8.0.tar.gz

 

4. Strongswan Server Install

아래 명령으로 Strongswan Server를 소스에서 컴파일 하여 설치합니다..
설치되는 위치는 /usr/local/strongswan 입니다.

# tar xvzf ../down/strongswan-5.8.0.tar.gz
# cd strongswan-5.8.0
# ./configure --prefix=/usr/local/strongswan --sysconfdir=/etc --enable-openssl --enable-eap-mschapv2 --enable-md4 
# make 
# make install

 

5. 인증서 파일 링크

아래의 명령과 같이 1에서 발급 받은 인증서를 해당위치로 링크해 줍니다.
3군데 위치로 심볼릭 링크(또는 복사)해 주어야 하며, 아래에서 your.domain.name 부분을 자신의 도메인으로 수정해야 합니다.

# cd /etc/ipsec.d/certs
# ln -s /etc/letsencrypt/live/your.domain.name/chain.pem .
# ln -s /etc/letsencrypt/live/your.domain.name/fullchain.pem .

# cd /etc/ipsec.d/cacerts
# ln -s /etc/letsencrypt/live/your.domain.name/chain.pem .
# ln -s /etc/letsencrypt/live/your.domain.name/fullchain.pem .

# cd /etc/ipsec.d/private
# ln -s /etc/letsencrypt/live/your.domain.name/privkey.pem .

 

6. Strongswan Config

6.1 /etc/ipsec.conf 파일 수정

아래의 leftid 부분을 자신의 도메인으로 수정합니다.

# ipsec configuration <<
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

#define new ipsec connection
conn mytunnel-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
    esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@your.domain.name  <<-- 자신의 도메인으로 설정
    leftcert=fullchain.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.1.0/24
    rightdns=1.1.1.1,8.8.8.8
    rightsendcert=never
    eap_identity=%identity

 

6.2 /etc/ipsec.secrets 파일 수정

파일을 아래와 같이 수정합니다.
2번째 줄 부터 id/pass 설정이며, 콜론(:) 좌측이 id, 콜론 우측의 "" 부분이 패스워드입니다.

: RSA "privkey.pem"
alice : EAP "myPassword"
tom : EAP "tomPassword"

 

6.3 /etc/iptables.sav 파일 수정 (iptables 포워딩 설정)

포트 포워딩을 위해 iptables 저장 파일을 수정해 줍니다. 

# Generated by iptables-save v1.6.1 on Mon Mar  4 21:22:51 2019
*nat
:PREROUTING ACCEPT [10:797]
:INPUT ACCEPT [1:104]
:OUTPUT ACCEPT [2:304]
:POSTROUTING ACCEPT [2:304]
-A POSTROUTING -s 10.10.1.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [116:14048]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
# for strongswan
-A INPUT -i eth0 -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -i eth0 -j DROP
COMMIT
*mangle
:PREROUTING ACCEPT [207:17257]
:INPUT ACCEPT [207:17257]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [116:14048]
:POSTROUTING ACCEPT [116:14048]
#-A PREROUTING -m conntrack --ctstate INVALID -j DROP
COMMIT

위에서 -A POSTROUTING -s 10.10.1.0/24 -o eth0 -j MASQUERADE 부분의 10.10.1.0/24 를 /etc/ipsec.conf 에서 설정한 주소와 동일하게 맞춰 줘야 합니다.
중간 부분의 # for strongswan 부분이 strongswan 에서 사용하는 포트입니다. 
공유기를 사용할 경우 500번과 4500번 포트를 별도로 포트포워딩해 주어야 합니다.

파일 저장이 끝나면 아래 명령으로 iptables 에 변경 내용을 적용합니다.

iptables-restore < /etc/iptables.sav

 

6.4 ip 포워딩 기능을 활성화 해 줍니다.

/etc/sysctl.conf 파일에 net.ipv4.ip_forward=1 을 추가해 줍니다.
저장 후 아래의 명령어를 입력해서 적용합니다.
# sysctl -p

 

7. Strongswan Server 시작/중지/상태확인

# cd /usr/local/strongswan
# sbin/ipsec start
Starting strongSwan 5.8.0 IPsec [starter]...
# sbin/ipsec status
Security Associations (0 up, 0 connecting):
  none
# sbin/ipsec stop
Stopping strongSwan IPsec...

 

8. Strongswan Server 스크립트파일 생성

vi /lib/systemd/system/strongswan.service 로 스크립트 파일 생성 후 아래 내용으로 저장한다.

[Unit]
Description=strongSwan IPsec daemon using ipsec.conf
After=network-online.target

[Service]
ExecStart=/usr/local/strongswan/sbin/ipsec start --nofork
ExecReload=/usr/local/strongswan/sbin/ipsec reload
StandardOutput=syslog
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

다음 명령으로 systemd 스크립트 적용

# systemctl daemon-reload
# systemctl enable strongswan

 

9. Strongswan Server 기동 및 상태확인

아래 명령으로 서버를 기동 후 상태를 확인합니다.

# systemctl start strongswan
# systemctl status strongswan

상태 확인 시 아래와 같이 Active: active 라고 표시 되어야 합니다.

# systemctl status strongswan
 strongswan.service - strongSwan IPsec daemon using ipsec.conf
   Loaded: loaded (/lib/systemd/system/strongswan.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-08-01 16:26:33 KST; 6min ago

 

10. 재부팅

서버를 재부팅 한 후 systemctl status strongswan 명령으로 상태를 확인해서 정상적으로 실행되면 완료입니다.

 

11. 안드로이드 클라이언트 설정

이제 서버측 설정은 완료되었으므로 안드로이드 기기의 구글 플레이에서 Strongswan 을 검색해서 설치해 줍니다.

설치 후 최초 실행화면입니다.

최초 실행화면

위 화면에서 우측 상단의 [ADD VPN PROFILE] 을 터치합니다.
그럼 아래와 같이 Profile 편집 화면이 나타납니다.

프로파일 편집 화면

아래 화면 처럼 각각의 항목을 넣어줍니다.

항목에 입력

Server: your.domain.name
VPN Type: IKEv2 EAP (Username/Password)
Username: alice
Password: 서버설정시 패스워드
CA certificate: Select automatically 체크함
Profile name: MyVPN(임의로 입력)

우측 상단의 SAVE를 터치해서 저장을 하면 아래 처럼 입력한 Profile 이 생성됩니다.

생성된 프로파일

위 화면에서 생성된 프로파일을 터치하면 서버에 접속을 시도하고 성공하면 아래와 같이 Connected 라고 표시됩니다.

상단알림바를 보시면 VPN 이라는 알림이 생깁니다. 이 상태에서 구글에서 My IP로 검색해서 내 IP를 확인해 보면 IP가 VPN IP로 바뀐 것을 확인할 수 있습니다.

접속된 화면