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로 바뀐 것을 확인할 수 있습니다.