2020년 5월 1일 금요일

Gl.iNet MV1000에 SoftEther VPN 올리기

이번 posting에서는 Gl.iNet MV1000(BRUME, ARM64) 모델에 SoftEther VPN을 올리는 과정을 소개하고자 한다.
(역시 오래 전에 Google Docs로 작성했던 내용을 blog로 올린 것인데,  문서 형식이 달라서 그런지 문서가 약간 일그러지는 문제가 있다 :( )


목차
1. Gl-iNet MV1000 BRUME 소개
2. Ubuntu 18.04 설치하기
3. SoftEther VPN Porting 하기
4. SoftEther VPN 상세 Setup Guide



1. Gl-iNet MV1000 BRUME 소개

Gl-iNet MV1000은 Marvell Armada 88F3720 (Dual-Core ARM Cortex-A53 @1.0GHz)를 CPU(정확히는 SoC)로 하고, 3개의 Gigabit 유선 포트(LAN 2, WAN 1)를 지원하는 작지만 속도가 빠른 네트워크 장비이다. 우리가 익히 알고 있는 ESPRESSObin 보드와 흡사 그 구성이 비슷하다고 볼 수 있다. :)

[그림 1.1] Marvell ARMADA 88F720 Processor

기억을 되살리기 위해 ESPRESSObin 보드와 관련한 몇가지 그림을 아래에 첨부하였다.
[그림 1.2] ESPRESSObin 보드 site

[그림 1.3]  ESPRESSObin 보드 외관


[그림 1.4] Topaz Switch

참고 1: Gl-iNet home page에는 어디에도 위의 Topaz Switch 같은 것을 사용했다는 내용은 없다. 하지만,  lan0, lan1이 bridge로 동작하는 것으로 보아서는 유사한 switch가 내장되어 있는 것이 틀림 없다.
참고 2: 위 그림에서는 WAN port를 SoC에서 바로 뽑고 있는데, ESPRESSObin도 그렇고, GL-MV1000도 그렇고, WAN port를 88E6141 port 중에서 하나를 선택해서 사용하고 있는 듯 보인다. 그렇게 판단하는 이유는 ifconfig 시 eth0 MAC 주소와 lan0, lan1, wan의 MAC 주소가 동일하며, ip link show 시에도 lan0@eth0, lan1@eth0, wan@eth0 형태로 표현되기 때문이다. 이는 아래 Block도를 보아도 그 사실을 명확히 알 수 있다. 3 port(lan0, lan1, wan) 모두 Topaz switch로 부터 나오고 있다.



[그림 1.5] ESPRESSObin V7 Block 도

GL-MV1000(별칭: BRUME)의 주요 특징을 정리해 보면 다음과 같다. 그림을 보면 알 수 있는 내용이기에 자세한 설명은 생략하기로 한다^^.

[그림 1.6] GL_MV1000 장비 외관

[그림 1.7] Gl-iNet Home Page - BRUME 소개(1)

[그림 1.8] Gl-iNet Home Page - BRUME 소개(2)

[그림 1.9] Gl-iNet Home Page - BRUME 소개(3) - 스펙

주의: GL-MV1000은 불행히도 Wi-Fi를 지원하지 않는다. 대안으로 wi-fi USB dongle을 사용할 수 있을 것이다.

[그림 1.10] Gl-iNet Home Page - BRUME 소개(4)

GL-MV1000은 다른 model과 마찬가지로 NOR flash memory에  OpenWrt(19.07)가 기본으로 탑재되어 있다. 하지만,  Onboard되어 있는 eMMC(8GB)를 통해 다른 OS(정확히는 Linux)로의 switching이 가능하다(요즘은 대체로 이렇게 들 보드를 구성한다). 따라서, 우리는 앞으로 이곳에 Ubuntu를 설치하고, 다시 그 위에 SoftEther VPN을 설치해 보도록 할 것이다.

[그림 1.11] GL-MV1000 OpenWrt - WebUI

[그림 1.12] GL-MV1000 OpenWrt - ssh login


2. Ubuntu 18.04 설치하기

자, 이제 부터는 GL-MV1000에 Ubuntu를 설치해 보도록 하자. GL-MV1000에는 기본적으로 OpenWrt가 설치(16MB NOR flash)되어 있다. 만일 Ubuntu로 부팅하고자 한다면 8GB eMMC 위에 Ubuntu image를 설치하고, bootloader(u-boot)의 configuration을 조정하여 eMMC로 부터 부팅하도록 해 주어야 한다.

<GL-MV1000 부팅 순서>
  • U-boot(부트로더) ⇒ NOR Flash: OpenWrt Linux kernel ⇒ rootfs init …
  • U-boot(부트로더) ⇒ eMMC Flash: Ubuntu Linux kernel ⇒ rootfs init …


[그림 2.1] 일반적인 Linux kernel 부팅 flow

GL-MV1000에 Ubuntu를 설치하는 것과 관련해서는 아래 site의 내용을 기초로 하였으니, 한번 훑어 보기 바란다.


<Desktop PC>
$ scp ./ubuntu_1804_gl_mv1000.tgz root@172.30.1.12:~/workspace
  • Ubuntu image를 target board(MV1000)로 복사하자.
  • workspace folder는 사전에 만들어 둔 것임.

$ ssh root@172.30.1.12
  • Target board에 접속
  • id/pass: root/root1234  (이 값은 OpenWRT WebUI에서 설정한 내용임)


<Target Board>
$ mv workspace/ubuntu_1804_gl_mv1000.tgz  /tmp
  • Ubuntu image를 /tmp 디렉토리로 이동시키자.

$ ubuntu_upgrade -n /tmp/workspace/ubuntu_1804_gl_mv1000.tgz
  • ubuntu_upgrade 명령을 이용해  Ubuntu image를 설치하도록 한다.
  • ubuntu_upgrade 명령은 Gl-iNet에서 제공한 것임.

$ switch_system  ubuntu
  • eMMC로 부팅하도록 하기 위해 위의 명령을 수행한다.
  • 자동으로 시스템이 재부팅을 하게 된다.


[그림 2.2] OpenWrt ⇒ Ubuntu 전환 과정


참고: 만일 Ubuntu 상태에서 OpenWrt로 상태 전환하고 싶다면 switch_system openwrt” 명령을 실행해 주면 된다(자동으로 재부팅 될 것임).

[그림 2.3] Ubuntu ⇒ OpenWrt 전환 과정

<여기서 잠깐 !>
한번 설치한 Ubuntu를 다시 설치하고자 한다면 ...
<OpenWrt 상태>
root@GL-MV1000:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                10240     10240         0 100% /rom
tmpfs                   511460       316    511144   0% /tmp
/dev/loop0              512448     16048    396048   4% /overlay
overlayfs:/overlay      512448     16048    396048   4% /
tmpfs                      512         0       512   0% /dev
/dev/mmcblk0p3         6914272   1202036   5341292  18% /data    ⇐ 이 영역이 eMMC에 해당함.

[1] /data folder 아래의 내용이 ubuntu rootfs에 해당함.
[2] 따라서, OpenWrt 상태에서 /data folder로 이동 후, 그 아래 파일을 전체 삭제(rm -rf ./*) 후, 다시 Ubuntu를 설치해 주면 된다.


3. SoftEther VPN Porting 하기

지금부터는 SoftEther VPN을 MV1000 장비에 올려 보도록 하겠다.


아무리 찾아 봐도 SoftEther를 ARM64(aarch64)용으로 cross-compile하는 방법은 찾기가 어렵다. 따라서 아래 내용은 GL-MV1000에 SoftEther VPN을 올리기 위한 과정을 정리한 것으로, 어디에도(?) 없는 내용이다^^.

<softether vpn cross-compile을 위해 필요한 library>
=========================================
gcc software
binutils software
tar, gzip or other software for extracting package files
chkconfig system utility
cat, cp or other basic file operation utility
EUC-JP, UTF-8 or other code page table for use in a Japanese language environment
libc (glibc) library

zlib library
openssl library
readline library
ncurses library

pthread library

<openssl cross-compile>

$ export CROSS_COMPILE=aarch64-linux-gnu-
$ export ARCH=arm64
$ mkdir openssl
$ cd openssl/
$ git clone https://github.com/openssl/openssl.git .
$ git checkout OpenSSL_1_0_2-stable
$ mkdir output

$ ./Configure linux-aarch64 --cross-compile-prefix=${CROSS_COMPILE} --prefix=/home/chyi/workspace/downloads/SoftEther_ARM64/openssl/output shared
  → output directory path는 적당히 지정해 주기 바람.
$ make depend
$ make -j5
$ make install


chyi@mars:~/workspace/downloads/SoftEther_ARM64/openssl/output$ ls -la
합계 24
drwxr-xr-x  6 chyi chyi 4096  5월 22 13:38 .
drwxr-xr-x 22 chyi chyi 4096  5월 22 13:38 ..
drwxr-xr-x  2 chyi chyi 4096  5월 22 13:38 bin
drwxr-xr-x  3 chyi chyi 4096  5월 22 13:38 include
drwxr-xr-x  4 chyi chyi 4096  5월 22 13:38 lib
drwxr-xr-x  6 chyi chyi 4096  5월 22 13:38 ssl

<ncurses cross-compile>

https://ftp.gnu.org/pub/gnu/ncurses/
⇒ ncurses-6.1.tar.gz
⇒ 반드시 이 버젼이어야 하는 것은 아님.

$ cd ~/workspace/downloads/ncurses-6.1
$ ./configure --host=aarch64-linux-gnu --with-shared
$ make

chyi@mars:~/workspace/downloads/ncurses-6.1/lib$ ls -la
합계 11984
drwxr-xr-x  2 chyi chyi    4096  5월 22 13:09 .
drwxr-xr-x 19 chyi chyi    4096  5월 22 13:08 ..
-rw-r--r--  1 chyi chyi  121580  5월 22 13:09 libform.a
lrwxrwxrwx  1 chyi chyi      12  5월 22 13:09 libform.so -> libform.so.6
lrwxrwxrwx  1 chyi chyi      14  5월 22 13:09 libform.so.6 -> libform.so.6.1
-rwxr-xr-x  1 chyi chyi   72872  5월 22 13:09 libform.so.6.1
-rw-r--r--  1 chyi chyi 1773386  5월 22 13:09 libform_g.a
-rw-r--r--  1 chyi chyi   61302  5월 22 13:09 libmenu.a
lrwxrwxrwx  1 chyi chyi      12  5월 22 13:09 libmenu.so -> libmenu.so.6
lrwxrwxrwx  1 chyi chyi      14  5월 22 13:09 libmenu.so.6 -> libmenu.so.6.1
-rwxr-xr-x  1 chyi chyi   35224  5월 22 13:09 libmenu.so.6.1
-rw-r--r--  1 chyi chyi  991524  5월 22 13:09 libmenu_g.a
-rw-r--r--  1 chyi chyi  128040  5월 22 13:09 libncurses++.a
-rw-r--r--  1 chyi chyi  858952  5월 22 13:09 libncurses++_g.a
-rw-r--r--  1 chyi chyi  649524  5월 22 13:09 libncurses.a
lrwxrwxrwx  1 chyi chyi      15  5월 22 13:09 libncurses.so -> libncurses.so.6
lrwxrwxrwx  1 chyi chyi      17  5월 22 13:09 libncurses.so.6 -> libncurses.so.6.1
-rwxr-xr-x  1 chyi chyi  380624  5월 22 13:09 libncurses.so.6.1
-rw-r--r--  1 chyi chyi 6638678  5월 22 13:09 libncurses_g.a
-rw-r--r--  1 chyi chyi   25154  5월 22 13:09 libpanel.a
lrwxrwxrwx  1 chyi chyi      13  5월 22 13:09 libpanel.so -> libpanel.so.6
lrwxrwxrwx  1 chyi chyi      15  5월 22 13:09 libpanel.so.6 -> libpanel.so.6.1
-rwxr-xr-x  1 chyi chyi   18232  5월 22 13:09 libpanel.so.6.1
-rw-r--r--  1 chyi chyi  485056  5월 22 13:09 libpanel_g.a

<zlib cross-compile>

⇒  https://zlib.net/
$ cd ~/workspace/downloads/SoftEther_ARM64/zlib-1.2.11
$ ./configure
$ vi Makefile
⇒ 아래 내용 수정 
----------------------------------------------------------
#CC=gcc
CC=aarch64-linux-gnu-gcc
----------------------------------------------------------

<libreadline cross-compile>

⇒ 일단 8.0 버젼으로 받아서 테스트해 보자.

$ ~/workspace/downloads/SoftEther_ARM64/readline-8.0
$ ./configure --host=aarch64-linux-gnu --prefix=/home/chyi/workspace/downloads/SoftEther_ARM64/readline-8.0/output
$ make
$ make install

chyi@mars:~/workspace/downloads/SoftEther_ARM64/readline-8.0/output$ ls -la
합계 24
drwxr-xr-x 6 chyi chyi 4096  5월 22 17:17 .
drwxr-xr-x 7 chyi chyi 4096  5월 22 13:59 ..
drwxr-xr-x 2 chyi chyi 4096  5월 22 13:59 bin
drwxr-xr-x 3 chyi chyi 4096  5월 22 13:59 include
drwxr-xr-x 3 chyi chyi 4096  5월 22 13:59 lib
drwxr-xr-x 6 chyi chyi 4096  5월 22 13:59 share

<SoftEther VPN Cross-Compile>

  • Latest version 보다는 Stable version으로 build해 보자.

$ git clone https://github.com/SoftEtherVPN/SoftEtherVPN_Stable.git
$ cd SoftEtherVPN_Stable
$ ./configure
$ vi Makefile
⇒ 직접 수정하자.

#chunghan.yi@2019.05.22 --
#CC=gcc
CC=aarch64-linux-gnu-gcc

#chunghan.yi@2019.05.22 --
#OPTIONS_COMPILE_DEBUG=-D_DEBUG -DDEBUG -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -g -fsigned-char -m64
OPTIONS_COMPILE_DEBUG=-D_DEBUG -DDEBUG -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -g -fsigned-char -I/home/chyi/workspace/downloads/SoftEther_ARM64/openssl/output/include -I/home/chyi/workspace/downloads/ncurses-6.1/include -I/home/chyi/workspace/downloads/SoftEther_ARM64/zlib-1.2.11

#chunghan.yi@2019.05.22 --
#OPTIONS_LINK_DEBUG=-g -fsigned-char -m64 -lm -ldl -lrt -lpthread -lssl -lcrypto -lreadline -lncurses -lz
OPTIONS_LINK_DEBUG=-g -fsigned-char -lm -ldl -lrt -lpthread -L/home/chyi/workspace/downloads/SoftEther_ARM64/openssl/output/lib -lssl -lcrypto -L/home/chyi/workspace/downloads/SoftEther_ARM64/readline-8.0/output/lib -lreadline -L/home/chyi/workspace/downloads/ncurses-6.1/lib/ -lncurses -L/home/chyi/workspace/downloads/SoftEther_ARM64/zlib-1.2.11 -lz

#chunghan.yi@2019.05.22 --
#OPTIONS_COMPILE_RELEASE=-DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char -m64
OPTIONS_COMPILE_RELEASE=-DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char -I/home/chyi/workspace/downloads/SoftEther_ARM64/openssl/output/include -I/home/chyi/workspace/downloads/ncurses-6.1/include -I/home/chyi/workspace/downloads/SoftEther_ARM64/zlib-1.2.11

#chunghan.yi@2019.05.22 --
#OPTIONS_LINK_RELEASE=-O2 -fsigned-char -m64 -lm -ldl -lrt -lpthread -lssl -lcrypto -lreadline -lncurses -lz
OPTIONS_LINK_RELEASE=-O2 -fsigned-char -lm -ldl -lrt -lpthread -L/home/chyi/workspace/downloads/SoftEther_ARM64/openssl/output/lib -lssl -lcrypto -L/home/chyi/workspace/downloads/SoftEther_ARM64/readline-8.0/output/lib -lreadline -L/home/chyi/workspace/downloads/ncurses-6.1/lib/ -lncurses -L/home/chyi/workspace/downloads/SoftEther_ARM64/zlib-1.2.11 -lz
#chunghan.yi@2019.05.22 --
#   ar r tmp/as/vpnserver.a $(OBJECTS_MAYAQUA) $(OBJECTS_CEDAR) tmp/objs/vpnserver.o
#   ranlib tmp/as/vpnserver.a
    aarch64-linux-gnu-ar r tmp/as/vpnserver.a $(OBJECTS_MAYAQUA) $(OBJECTS_CEDAR) tmp/objs/vpnserver.o
    aarch64-linux-gnu-ranlib tmp/as/vpnserver.a
이하 생략(위와 동일한 부분 모두 수정)

$ make

...

bjs/Cedar/Hub.o tmp/objs/Cedar/Interop_OpenVPN.o tmp/objs/Cedar/Interop_SSTP.o tmp/objs/Cedar/IPsec.o tmp/objs/Cedar/IPsec_EtherIP.o tmp/objs/Cedar/IPsec_IKE.o tmp/objs/Cedar/IPsec_IkePacket.o tmp/objs/Cedar/IPsec_IPC.o tmp/objs/Cedar/IPsec_L2TP.o tmp/objs/Cedar/IPsec_PPP.o tmp/objs/Cedar/IPsec_Win7.o tmp/objs/Cedar/Layer3.o tmp/objs/Cedar/Link.o tmp/objs/Cedar/Listener.o tmp/objs/Cedar/Logging.o tmp/objs/Cedar/Nat.o tmp/objs/Cedar/NativeStack.o tmp/objs/Cedar/NM.o tmp/objs/Cedar/NullLan.o tmp/objs/Cedar/Protocol.o tmp/objs/Cedar/Radius.o tmp/objs/Cedar/Remote.o tmp/objs/Cedar/Sam.o tmp/objs/Cedar/SecureInfo.o tmp/objs/Cedar/SecureNAT.o tmp/objs/Cedar/SeLowUser.o tmp/objs/Cedar/Server.o tmp/objs/Cedar/Session.o tmp/objs/Cedar/SM.o tmp/objs/Cedar/SW.o tmp/objs/Cedar/UdpAccel.o tmp/objs/Cedar/UT.o tmp/objs/Cedar/VG.o tmp/objs/Cedar/Virtual.o tmp/objs/Cedar/VLan.o tmp/objs/Cedar/VLanUnix.o tmp/objs/Cedar/VLanWin32.o tmp/objs/Cedar/WaterMark.o tmp/objs/Cedar/WebUI.o tmp/objs/Cedar/WinUi.o tmp/objs/Cedar/Wpc.o src/hamcorebuilder/hamcorebuilder.c -O2 -fsigned-char -lm -ldl -lrt -lpthread -L/home/chyi/workspace/downloads/SoftEther_ARM64/openssl/output/lib -lssl -lcrypto -L/home/chyi/workspace/downloads/SoftEther_ARM64/readline-8.0/output/lib -lreadline -L/home/chyi/workspace/downloads/ncurses-6.1/lib/ -lncurses -L/home/chyi/workspace/downloads/SoftEther_ARM64/zlib-1.2.11 -lz -o tmp/hamcorebuilder
tmp/hamcorebuilder src/bin/hamcore/ src/bin/BuiltHamcoreFiles/unix/hamcore.se2
tmp/hamcorebuilder: 9: tmp/hamcorebuilder: Syntax error: Unterminated quoted string
Makefile:360: recipe for target 'src/bin/BuiltHamcoreFiles/unix/hamcore.se2' failed
<============ 도저히 원인 파악이 안됨.
make: *** [src/bin/BuiltHamcoreFiles/unix/hamcore.se2] Error 2


위의 원인 분석이 안되어,  x86 build 시 생성해 둔, hamcore.se2 파일을 복사함.
  • ~/workspace/SoftEtherVPN/build/hamcore.se2 ⇒ SoftEtherVPN_Stable/src/bin/BuiltHamcoreFiles/unix

$ make
⇒ OK, 겨우 넘어갔다 :)

chyi@mars:~/workspace/downloads/test/SoftEtherVPN_Stable/bin$ ls -lR
.:
합계 16
drwxr-xr-x 2 chyi chyi 4096  5월 22 17:06 vpnbridge
drwxr-xr-x 2 chyi chyi 4096  5월 22 17:06 vpnclient
drwxr-xr-x 2 chyi chyi 4096  5월 22 17:06 vpncmd
drwxr-xr-x 2 chyi chyi 4096  5월 22 17:06 vpnserver

./vpnbridge:
합계 3564
-rw------- 1 chyi chyi 1781253  5월 22 17:06 hamcore.se2
-rwxr-xr-x 1 chyi chyi 1864600  5월 22 17:06 vpnbridge

./vpnclient:
합계 3564
-rw------- 1 chyi chyi 1781253  5월 22 17:06 hamcore.se2
-rwxr-xr-x 1 chyi chyi 1864448  5월 22 17:06 vpnclient

./vpncmd:
합계 3560
-rw------- 1 chyi chyi 1781253  5월 22 17:06 hamcore.se2
-rwxr-xr-x 1 chyi chyi 1860232  5월 22 17:06 vpncmd

./vpnserver:
합계 3564
-rw------- 1 chyi chyi 1781253  5월 22 17:06 hamcore.se2
-rwxr-xr-x 1 chyi chyi 1864600  5월 22 17:06 vpnserver

<MV1000 board에서 VPN Server 설정하기>

1) 앞서 build한 4개의 library(openssl, ncurses, readline, zlib)를 하나의 디렉토리로 모은 후, target board로 복사하자(scp 사용).
chyi@mars:~/workspace/downloads/SoftEther_ARM64/softether_lib/lib$ ls -la
합계 4180
drwxr-xr-x 2 chyi chyi    4096  5월 22 17:22 .
drwxr-xr-x 7 chyi chyi    4096  5월 22 20:09 ..
lrwxrwxrwx 1 chyi chyi      18  5월 22 13:38 libcrypto.so -> libcrypto.so.1.0.0
-r-xr-xr-x 1 chyi chyi 2191808  5월 22 13:38 libcrypto.so.1.0.0
lrwxrwxrwx 1 chyi chyi      15  5월 22 13:09 libncurses.so -> libncurses.so.6
lrwxrwxrwx 1 chyi chyi      17  5월 22 13:09 libncurses.so.6 -> libncurses.so.6.1
-rwxr-xr-x 1 chyi chyi  380624  5월 22 13:09 libncurses.so.6.1
lrwxrwxrwx 1 chyi chyi      16  5월 22 13:59 libreadline.so -> libreadline.so.8
lrwxrwxrwx 1 chyi chyi      18  5월 22 13:59 libreadline.so.8 -> libreadline.so.8.0
-rwxr-xr-x 1 chyi chyi 1092160  5월 22 13:59 libreadline.so.8.0
lrwxrwxrwx 1 chyi chyi      15  5월 22 13:38 libssl.so -> libssl.so.1.0.0
-r-xr-xr-x 1 chyi chyi  467256  5월 22 13:38 libssl.so.1.0.0
lrwxrwxrwx 1 chyi chyi      14  5월 22 13:50 libz.so -> libz.so.1.2.11
lrwxrwxrwx 1 chyi chyi      14  5월 22 13:50 libz.so.1 -> libz.so.1.2.11
-rwxr-xr-x 1 chyi chyi  127224  5월 22 13:50 libz.so.1.2.11

2) softether binary(vpnserver/bridge/client, hamcore.se2 파일) 역시 target board로 복사한다.

3) vpnserver 실행하기 
# LD_LIBRARY_PATH=/root/workspace/softether/lib
# export LD_LIBRARY_PATH
# ./ vpnserver start

# ps -ef|grep vpnserver
root      3987     1  0 08:24 ?        00:00:00 /root/workspace/softether/bin/vpnserver/vpnserver exe
root      3988  3987  0 08:24 ?        00:00:13 /root/workspace/softether/bin/vpnserver/vpnserver exe
root      4095  3934  0 08:48 pts/0    00:00:00 grep vpnserver

4) vpncmd 실행하기
<Testbed>
  <vpnclient>                                                                    <vpnserver>
[Windows PC]   ⇒   AP A  ⇒     [Internet]    ⇐   AP B  ⇐   [MV1000]  ⇐  Linux PC(desktop)
                                                                port forwarding
                                                     X.X.X.X:5443 -> 172.30.1.253(443)
(*) admin pass:admin1234
(*) vpnclient user: test1/test1234
(*) VirtualHub: HUB1
(*) ip: 172.30.1.253:443

위의 Testbed에 맞는 vpnserver 설정을 해 보도록 하겠다.
참고로 아래 vpncmd 실행 내용은 VPN Server Manager tool(Windows or MacOS용 GUI program)을 사용하면 보다 쉽게 설정할 수 있다.

# ./vpncmd
vpncmd 명령 - SoftEther VPN 명령 줄 관리 유틸리티
SoftEther VPN 명령 줄 관리 유틸리티 (vpncmd 명령)
Developer Edition
Version 4.29 Build 9680   (Korean)
Compiled 2019/02/28 18:39:47 by yagi at pc33
Copyright (c) all contributors on SoftEther VPN project in GitHub.
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
All rights reserved.

vpncmd 프로그램을 사용하여 다음을 수행 할 수 있습니다. 

1. VPN Server 또는 VPN Bridge 관리 
2. VPN Client 관리 
3. VPN Tools 명령의 사용 (인증서 작성 및 통신 속도 측정) 

1 - 3을 선택:1

연결된 VPN Server 또는 VPN Bridge가 실행중인 컴퓨터의 IP 주소 또는 호스트 이름을 지정하십시오. 
 '호스트 이름:포트 번호'형식으로 지정하면 포트 번호도 지정할 수 있습니다. 
 (포트 번호를 지정하지 않으면 443이 사용됩니다.) 
 아무것도 입력하지 않고 Enter를 누르면 localhost (이 컴퓨터)의 포트 443에 연결합니다.
연결된 호스트 이름 또는 IP 주소: <Enter>

서버에 가상 HUB 관리 모드로 접속하는 경우에는 가상 HUB 이름을 입력하십시오. 
 서버 관리 모드로 접속하는 경우는 아무것도 입력하지 않고 Enter를 누르십시오.
연결된 가상 HUB 이름을 입력: <Enter>
VPN Server "localhost"(포트 443)에 연결했습니다.

VPN Server 전체 관리 권한이 있습니다.

VPN Server>ServerPasswordSet
ServerPasswordSet 명령 - VPN Server 관리자 암호 설정
암호를 입력하십시오. 취소하려면 Ctrl + D 키를 누르십시오.

비밀번호:**********
확인:**********

명령이 성공적으로 완료되었습니다.

VPN Server>exit

# ./vpncmd
vpncmd 명령 - SoftEther VPN 명령 줄 관리 유틸리티
SoftEther VPN 명령 줄 관리 유틸리티 (vpncmd 명령)
Developer Edition
Version 4.29 Build 9680   (Korean)
Compiled 2019/02/28 18:39:47 by yagi at pc33
Copyright (c) all contributors on SoftEther VPN project in GitHub.
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
All rights reserved.

vpncmd 프로그램을 사용하여 다음을 수행 할 수 있습니다. 

1. VPN Server 또는 VPN Bridge 관리 
2. VPN Client 관리 
3. VPN Tools 명령의 사용 (인증서 작성 및 통신 속도 측정) 

1 - 3을 선택:  1

연결된 VPN Server 또는 VPN Bridge가 실행중인 컴퓨터의 IP 주소 또는 호스트 이름을 지정하십시오. 
 '호스트 이름:포트 번호'형식으로 지정하면 포트 번호도 지정할 수 있습니다. 
 (포트 번호를 지정하지 않으면 443이 사용됩니다.) 
 아무것도 입력하지 않고 Enter를 누르면 localhost (이 컴퓨터)의 포트 443에 연결합니다.
연결된 호스트 이름 또는 IP 주소: <Enter>

서버에 가상 HUB 관리 모드로 접속하는 경우에는 가상 HUB 이름을 입력하십시오. 
 서버 관리 모드로 접속하는 경우는 아무것도 입력하지 않고 Enter를 누르십시오.
연결된 가상 HUB 이름을 입력: <Enter>
비밀번호:**********

VPN Server "localhost"(포트 443)에 연결했습니다.

VPN Server 전체 관리 권한이 있습니다.

VPN Server>HubCreate HUB1
HubCreate 명령 - 새로운 가상 HUB 만들기
암호를 입력하십시오. 취소하려면 Ctrl + D 키를 누르십시오.

비밀번호:**********
확인:**********

명령이 성공적으로 완료되었습니다.

VPN Server>Hub HUB1
Hub 명령 - 관리하는 가상 HUB의 선택
가상 HUB "HUB1"를 선택했습니다.
명령이 성공적으로 완료되었습니다.

VPN Server/HUB1>UserCreate test1
UserCreate 명령 - 사용자 작성
참여하는 그룹 이름: <Enter>

사용자의 본명:Test

사용자 설명:Test

명령이 성공적으로 완료되었습니다.

VPN Server/HUB1>UserPasswordSet test1
UserPasswordSet 명령 - 사용자 인증 방법을 암호 인증 설정 암호를 설정
암호를 입력하십시오. 취소하려면 Ctrl + D 키를 누르십시오.

비밀번호:********
확인:********

명령이 성공적으로 완료되었습니다.

VPN Server/HUB1>exit

# ./vpncmd
vpncmd 명령 - SoftEther VPN 명령 줄 관리 유틸리티
SoftEther VPN 명령 줄 관리 유틸리티 (vpncmd 명령)
Developer Edition
Version 4.29 Build 9680   (Korean)
Compiled 2019/02/28 18:39:47 by yagi at pc33
Copyright (c) all contributors on SoftEther VPN project in GitHub.
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
All rights reserved.

vpncmd 프로그램을 사용하여 다음을 수행 할 수 있습니다. 

1. VPN Server 또는 VPN Bridge 관리 
2. VPN Client 관리 
3. VPN Tools 명령의 사용 (인증서 작성 및 통신 속도 측정) 

1 - 3을 선택:1

연결된 VPN Server 또는 VPN Bridge가 실행중인 컴퓨터의 IP 주소 또는 호스트 이름을 지정하십시오. 
 '호스트 이름:포트 번호'형식으로 지정하면 포트 번호도 지정할 수 있습니다. 
 (포트 번호를 지정하지 않으면 443이 사용됩니다.) 
 아무것도 입력하지 않고 Enter를 누르면 localhost (이 컴퓨터)의 포트 443에 연결합니다.
연결된 호스트 이름 또는 IP 주소:172.30.1.253:443

서버에 가상 HUB 관리 모드로 접속하는 경우에는 가상 HUB 이름을 입력하십시오. 
 서버 관리 모드로 접속하는 경우는 아무것도 입력하지 않고 Enter를 누르십시오.
연결된 가상 HUB 이름을 입력:HUB1
비밀번호:**********

VPN Server "172.30.1.253"(포트 443)에 연결했습니다.

VPN Server의 가상 HUB 'HUB1'에 대한 관리 권한이 있습니다.

VPN Server/HUB1>exit

# ./vpncmd
vpncmd 명령 - SoftEther VPN 명령 줄 관리 유틸리티
SoftEther VPN 명령 줄 관리 유틸리티 (vpncmd 명령)
Developer Edition
Version 4.29 Build 9680   (Korean)
Compiled 2019/02/28 18:39:47 by yagi at pc33
Copyright (c) all contributors on SoftEther VPN project in GitHub.
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
All rights reserved.

vpncmd 프로그램을 사용하여 다음을 수행 할 수 있습니다. 

1. VPN Server 또는 VPN Bridge 관리 
2. VPN Client 관리 
3. VPN Tools 명령의 사용 (인증서 작성 및 통신 속도 측정) 

1 - 3을 선택:1

연결된 VPN Server 또는 VPN Bridge가 실행중인 컴퓨터의 IP 주소 또는 호스트 이름을 지정하십시오. 
 '호스트 이름:포트 번호'형식으로 지정하면 포트 번호도 지정할 수 있습니다. 
 (포트 번호를 지정하지 않으면 443이 사용됩니다.) 
 아무것도 입력하지 않고 Enter를 누르면 localhost (이 컴퓨터)의 포트 443에 연결합니다.
연결된 호스트 이름 또는 IP 주소: <Enter>

서버에 가상 HUB 관리 모드로 접속하는 경우에는 가상 HUB 이름을 입력하십시오. 
 서버 관리 모드로 접속하는 경우는 아무것도 입력하지 않고 Enter를 누르십시오.
연결된 가상 HUB 이름을 입력:
비밀번호:**********

VPN Server "localhost"(포트 443)에 연결했습니다.

VPN Server 전체 관리 권한이 있습니다.

VPN Server>Hub HUB1
Hub 명령 - 관리하는 가상 HUB의 선택
가상 HUB "HUB1"를 선택했습니다.
명령이 성공적으로 완료되었습니다.

VPN Server/HUB1>BridgeCreate HUB1 /DEVICE:vpn /TAP:yes
BridgeCreate 명령 - 로컬 브리지 연결 만들기
물리적 LAN 카드에 브릿지를 할 경우 새로운 브리지를 만든 직후의 상태에서는 일부 LAN 카드는 가상 네트워크에있는 컴퓨터에서 브리지에 사용하는 LAN 카드 자신에 대한 TCP/IP 통신이 제대로되지 않은 경우가 있습니다. 
 (특히 Intel이나 Broadcom 제 LAN 카드 등으로이 현상이 발생할 수 있습니다.) 


 그 경우는 일단 VPN Server/Bridge가 작동 있는 컴퓨터를 다시 시작하십시오. 컴퓨터를 다시 시작한 후 제대로 통신 할 수 있습니다. 


 또한 대부분의 무선 LAN 어댑터는 무차별 모드에서 패킷의 송수신을 지원하지 않는 경우가 종종 있기 때문에 로컬 브리지에 사용할 수없는 경우가 있습니다. 이러한 경우에는 무선 LAN 어댑터가 아닌 일반 LAN 카드의 사용을 고려하십시오.

VM 내에서 로컬 브리지를 사용하는 경우의주의 사항
VPN Server가 VMware와 Hyper-V 등의 VM (가상 머신) 내에서 작동하고있을 가능성이 감지되었습니다. 다음의주의 사항을 잘 읽어 보시기 바랍니다. VM을 사용하지 않는 경우이 메시지를 무시하십시오.
VM은 기본적으로 LAN 카드의 '무차별 모드'(MAC 주소 스푸핑)에서의 통신이 금지되는 경우가 있습니다. 

VM에서 동작하는 VPN Server의 가상 HUB와 호스트 컴퓨터에 장착되어있는 물리적 인 LAN 카드 사이에서 로컬 브릿지를 할 경우 무차별 모드 (MAC 주소 스푸핑) 금지 되어 정상적으로 통신 할 수 없습니다. 이런 경우 VM 설정 도구를 사용하여 무차별 모드 (MAC 주소 스푸핑)를 사용하십시오. 

 자세한 내용은 VM 설명서를 참조하십시오. 다른 관리자에 의해 관리되는 공유 VM의 경우 관리자에게 무차별 모드 (MAC 주소 스푸핑)을 허용하도록 요청하십시오.

명령이 성공적으로 완료되었습니다.

VPN Server/HUB1>exit

이후 아래 명령을 수행해 주도록 하자. 왜 ? BridgeCreate HUB1 /DEVICE:vpn /TAP:yes 를 수행(LocalBridge 생성 명령임)하게 되면, 아래와 같이 tap_vpn 가상 interface가 생성되게 되는데, 이를 kernel bridge(br0 interface)에 연결해 주어야만 정상적으로 연결이 이루어지게 된다. 이를 대신하는 기능으로 SecureNAT가 있는데, 너무 느리므로 사용하지 말기 바란다.

# ifconfig tap_vpn
tap_vpn   Link encap:Ethernet  HWaddr 5e:bb:b9:81:2a:4c  
          inet6 addr: fe80::5cbb:b9ff:fe81:2a4c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:860 (860.0 B)  TX bytes:2718 (2.7 KB)

# ifconfig br0
br0       Link encap:Ethernet  HWaddr 5e:bb:b9:81:2a:4c  
          inet addr:192.168.5.1  Bcast:192.168.5.255  Mask:255.255.255.0
          inet6 addr: fe80::f2ad:4eff:fe03:8605/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:499306 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1796550 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:58190731 (58.1 MB)  TX bytes:2556964183 (2.5 GB)

# brctl addif br0 tap_vpn
⇒ tap_vpn 가상 interface를 br0 interface에 attach 시킨다.

<VPNClient 실행>

WIndows PC에서 vpnclient를 실행하여 vpnserver(MV1000)과 정상적으로 연결되는지를 확인해 보자.
1) SoftEther VPN home page에서 VPN Client Manager(for Windows) 버젼을 내려 받아 설치한다.
2) Windows PC를 AP A에 연결한다.
3) VPN Client Manager를 실행한 후, 아래와 같이 VPN 설정을 한다.

<VPN 설정을 위해 기억하고 있어야 할 내용>
  1. VPN Server의 admin password
  2. VPN Server에서 추가한 Virtual Hub 사용을 위한 계정 정보
  3. Firewall or AP 안쪽에 VPN Server가 있을 경우, port forwarding 설정 및 이와 관련된 정보(external IP, port)
  4. VPN Server의 external ip


[그림 3.1] Windows Client Manager - VPN  설정

4) VPN server와의 연결을 시도한다.
[그림 3.2] Windows Client Manager - VPN  연결 전 상태


[그림 3.3] Windows Client Manager - VPN  연결 후 상태

5) Windows PC의 ip를 확인해 본 후, vpnserver 내부망(예: 192.168.5.50)으로 ping을 시도해 본다.
[그림 3.4] DOS 창 - IP 설정 상태 확인

ping 192.168.5.50
⇒ 정상

6) 마지막으로 인터넷 접속을 시도해 본다.
⇒ 정상 

자 이제 SoftEther VPN의 세계로 들어갈 준비가 되었는가 ?


4. SoftEther VPN 상세 Setup Guide
이번 장에서는 SoftEther VPN의 다양한 기능(SoftEther VPN 아주 훌륭한 녀석이다^^)을 소개하고자 한다. (분량이 너무 많은 관계로) 편의상 이번 장의 내용은 아래 pdf 문서로 설명을 대신하고자 한다.

4.1 VPN Server <=> VPN Bridge 구성 방법
4.2 VPN Server <=> VPN Client 구성 방법
4.3 VPN Server <=> Smart Phone 구성 방법(OpenVPN, L2TP/IPsec)
4.4 VPN Server Cluster 구성 방법



Slowboot


댓글 없음:

댓글 쓰기