2020년 9월 25일 금요일

ESPRESSObin Ultra 보드와 MACCHIATObin 보드의 Switch & Ethernet Device Driver 분석(3)

이번 시간(세번째 시간)에는 지난 시간에 이어, MACCHIATObin 보드 상에서 n2n  - Layer 2 peer to peer VPN을 구동시키는 방법을 소개해 보고자 한다.

          n2n 
  


목차
1. Docker 환경 설정
2. ESPRESSObin Ultra 보드 소개
3. ESPRESSObin Ultra 보드의 Switching Device Driver 분석
4. MACCHIATObin 보드 소개
5. MACCHIATObin 보드의 Ethernet Device Driver 분석
6. 응용편1: MACCHIATObin 보드를 SoftEther VPN Gateway로 만들기
7. 응용편2: MACCHIATObin 보드를 P2P VPN Gateway로 만들기
8. References



7. 응용편2: MACCHIATObin 보드를 P2P VPN Gateway로 만들기
이번 장에서는 Layer 2 Peer to Peer VPN project 중 하나인 n2n을 MACCHIATObin 보드에서 동작시키는 과정을 소개해 보고자 한다.

7.1) n2n project 소개
ntop project 중의 하나인 n2n은 아래와 같은 특징을 갖는 P2P VPN이다.


a) NAT 장비 안쪽에 있는 두 peer(host or user)가 NAT 장비에 영향을 받지 않고 서로 완벽하게 통신하도록 만들어 준다. 즉, NAT 장비에서 port forwarding or DMZ 설정을 전혀 해 줄 필요가 없다. 
   => 또한 port forwarding/DMZ 등으로도 연결 안되는 문제까지 해결해 준다.

[그림 7.1] NAT and home [출처: 참고 문헌 12]

📌 NAT가 사용되는 환경은 가정에 설치된 공유기, 회사에 설치된 Firewall, LTE망과 Internet을 연결해 주는 CGN(Carrier Grade NAT, Firewall), Smart Phone USB Tethering 등 다양하다.
📌 IPv4 환경이 IPv6로 모두 전환되기 전까지는 NAT가 어쩔 수 없이 존재한다. 따라서 n2n과 같은 solution이 필요할 수밖에 없다.

b) edge(peer에 설치)와 supernode(public ip를 갖는 중앙의 서버)라는 2개의 daemon으로 구성되어 있다.
  => edge가 설치되면, 이를 사용하는 application의 코드를 전혀 수정할 필요가 없다. 즉, application transparency를 보장한다.
  => MQTT, HTTP 등의 IoT protocol을 사용하는 application에 대해 코드 수정 없이 사용이 가능하다.

[그림 7.2] n2n의 구조2(edge와 supernode로 구성) [출처: 참고 문헌 11]

c) Full cone NAT에 대해서는 hole punching도 지원하며, symmetric NAT가 있는 경우(hole punching이 불가한 경우)에는 supernode를 통한 relay가 지원된다.
   => Smart Phone <=> Smart Phone 간의 1:1 direct 통신도 가능하다.

[그림 7.3] n2n의 구조1(edge와 supernode로 구성) [출처: 참고 문헌 11]

📌 NAT hole punching & relay 기법과 관련해서는 아래 site를 참조하기 바란다.

d) 하나의 peer는 복수개의 다른 peer와 각각 서로 다른 vpn tunnel을 통해 통신할 수 있다.
   => community 명을 통해 각각의 tunnel을  구분해 줄 수 있다.

[그림 7.4] n2n의 그룹간 통신

📌 supernode는 edge에 할당된 network name(=community name), mac 주소(사설 주소), public NATed ip:port, private unNATed ip:port를 유지/관리한다.

e) 두 peer는 암호화된 tunnel을 통해 ethernet frame을 통째로 암호화한 후 전달할 수 있다.
   => ethernet frame을 전달할 수 있으므로, multicast, broadcast packet도 전달 가능하다.
   => 이는 broadcast packet을 사용하는 dhcp와 multicast DNS 등이 가능하다는 얘기가 된다.
   => 단, multicast의 경우는 -E option을 주어야 수신이 가능하다(default: drop).

f) 두 peer는 tunnel을 만들기 위해 tap(linux 기준) device를 이용하며, tap 기반 network interface에는 사설 ip 주소를 할당해 준다.

[그림 7.5] n2n의 구조3 - tap device를 통한 ethernet frame 전달 [출처: 참고 문헌 11]


[그림 7.6] OpenVPN의 동작 방식 - n2n도 동일한 방식으로 동작함.

📌 위의 그림에서 tun0를 tap0로, OpenVPN을 edge로 변경한 것이 n2n이라고 보면 된다. 물론, 중앙에 별도의 supernode가 있어야 하지만 ...

g) 암호화 알고리즘으로는 twofish, aes, chacha20, speck 등을 지원한다(단, 최신 버젼 2.9 기준임)
  => 이 부분은 key 교환 방식과 더불어 최근에 한창 개발 중에 있다.
  => IKE 등을 지원하려는 것 같은데, 아직까지는 key 교환 관련하여 기능이 신통치 못한 것 같다.


h) 속도 문제를 해결하기 위해 다음의 두가지 압축 알고리즘도 제공한다(2.9 version 기준).
  => lzo1x, zstd 지원 

i) Windows, macOS, Android 버젼을 지원한다.
  => 단, Windows, Android는 (상용 버젼 수준으로 만들려면) 약간의 개조가 필요하다.

j) 설정이 아주 간단하고, 사용하기 매우 쉽다.

k) 단점: tun/tap device를 사용하여 tunnel/암호화(그림 7.5-7.6)를 하다보니, 느릴 수 밖에 없다(OpenVPN이 느린 이유와 동일함). 더더군다나 중앙에 supernode를 통해 relay를 해야 하는 경우에는 더 느려질 수 밖에 없다.
   => 그럼에도 불구하고, 사용할만한  가치가 있어 보인다.
   => (좀 느리지만) NAT 장비에 영향을 받지 않고 game을 하고자 할 경우 적합.
   => 역시 NAT 장비의 설정 변경 없이 client -> server(예: ssh, ftp ..) 연결에 적합.
   => 24시간 운용 서비스 보다는 특정 시점에 연결하여 사용하는 경우에 적합할 듯 보임.

📌 아래 내용은 scp를 이용하여 1Gbit/s 환경에서 n2n의 속도를 측정한 결과이다.

<n2n performance - scp를 이용하여 테스트> [출처: 참고 문헌 12]

n2n 관련 보다 자세한 사항은 아래 n2n 공식 home page의 내용을 참고하기 바란다.

📌 참고로 n2n은 Hamachi와 유사하게 동작하는 program이다.


7.2) ARM64용으로 n2n build하기
그럼, 지금부터는 arm64 환경에서 동작 가능하도록 n2n를 cross-compile해 보도록 하겠다. 6장과 동일하게 docker(ubuntu 16.04) 환경에서 build를 진행해 보기로 하자.

<Docker ubuntu 16.04>
root@23dc5a9270fd:/# su - chyi
$ export PATH=/home/chyi/workspace/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/bin:$PATH
  => arm64용 toolchain path를 지정한다.
$ export CROSS=aarch64-linux-gnu-

$ cd ~/workspace/vpn/n2n-2.8
  => 미리 download 받아 둔, n2n-2.8 directory로 이동하자.
  => 이 글을 쓰는 현재 n2n-2.8이 stable version이다.

$ ./autogen.sh
  => autoreconf가 없다는 에러가 발생한다면 아래 package를 설치해 주자.
apt-get install autoconf

$ ./configure --build x86_64-pc-linux-gnu --host aarch64-linux-gnu
$ make clean
$ CC="$CROSS"gcc AR="$CROSS"ar RANLIB="$CROSS"ranlib make

chyi@23dc5a9270fd:~/workspace/vpn/n2n-2.8$ file edge
  => 정상적으로 cross-compile이 되었다면 아래 처럼 출력될 것이다.
edge: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=ca3f341915a34f6fdd980a5020a44bfd66371898, not stripped

chyi@23dc5a9270fd:~/workspace/vpn/n2n-2.8$ file supernode
supernode: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=22157b0e54fa825d255f963cd23356f58f5d0e6e, not stripped

chyi@23dc5a9270fd:~/workspace/vpn/n2n-2.8$ ls -l

[그림 7.7] n2n source code 및 build 결과

간단하게 build에 성공하였으니, target board로 올려 동작 테스트를 해 보기로 하자.

7.3) n2n 동작 시험 1
이 절에서 시험할 네트워크 환경은 다음과 같다.

<Testbed 1>
Linux PC A(192.168.1.49/24, n2n edge1: 10.1.2.1) => LTE Router => Internet 
Linux PC B(192.168.2.100/24) => MACCIATObin(192.168.2.1/24, n2n edge2:10.1.2.2) => Repeater => AP => Internet

외부에 서버를 운영할 환경이 안되므로, supernode는 ntop에서 운영하는 supernode.ntop.org를 활용하기로 한다. 만일 이를 직접 운영하고자 한다면 아래와 같이 간단하게 실행해주면 된다.

<Public ip를 가진 서버>
$ sudo ./supdernode -l <port>

📌 AWS EC2 1년 무료 버젼을 사용하면 간단한 서버를 운영할 수 있긴하다.

supernode가 준비되었으니, edge binary를 target board로 복사한 후, 아래 명령을 실행해 주도록 하자.

<Target board: edge2>
root@localhost:/home/chyi/workspace# ./edge -c mynetwork -k mysecretpass -a 10.1.2.2 -r -l supernode.ntop.org:7777 -A2 -z1 -f
  => -c : community 명을 mynetwork으로 지정하였다.
  => -k : shared 암호키를 mysecretpass로 지정하였다.
  => vpn ip를 10.1.2.2로 지정하였다.
  => -r : n2n virtual lan을 통한 ip forwarding을 enable 시켜준다.
  => -l : supernode ip:port를 ntop에서 운영하는 supernode.ntop.org:7777를 입력하였다.
  => -A2: twofish 암호 알고리즘으로 설정한다.
  => -z1: lzo1x 압축 알고리즘을 사용하도록 설정한다.
  => -f: foreground로 동작하도록 한다.
  => -d option을 생략한 관계로 edge0라는 tap interface가 자동으로 생성된다.

[그림 7.8] MACCHIATObin에서 edge(edge2)를 실행한 모습

📌 참고로 암호 알고리즘을 위한 option은 다음과 같다.
 -A2: Twofish(CTS mode), -A3: AES(CBC mode), -A4: ChaCha20(CTR mode), -A5: SPECK(CTR mode)

root@localhost:/home/chyi/workspace# sysctl -w net.ipv4.ip_forward=1
  => ip forwarding을 1로 설정한다.

root@localhost:~# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
  => MACCHIATObin 내부의 PC가 internet에 접속할 수 있도록 masquerading 설정을 해 준다.

📌 edge -h 명령을 실행하면 사용 가능한 자세한 option을 확인할 수 있다.

[그림 7.9] edge에서 사용 가능한 option 확인


<Linux  PC A: edge1>
./edge -c mynetwork -k mysecretpass -a 10.1.2.1  -l supernode.ntop.org:7777 -A2 -z1 -f
  => -c : community 명을 mynetwork으로 지정하였다.
  => -k : shared 암호키를 mysecretpass로 지정하였다.
  => vpn ip를 10.1.2.1로 지정하였다.
  => -l : supernode ip:port를 ntop에서 운영하는 supernode.ntop.org:7777를 입력하였다.
  => -A2: twofish 암호 알고리즘으로 설정한다.
  => -z1: lzo1x 압축 알고리즘을 사용하도록 설정한다.
  => -f: foreground로 동작하도록 한다.
  => -d option을 생략한 관계로 edge0라는 tap interface가 자동으로 생성된다.

📌 Linux PC A는 gateway가 아니므로 -r option을 사용할 필요가 없다.

[그림 7.10] Linux PC edge(edge1)를 실행한 모습

$ sudo ip route add 192.168.2.0/24 via 10.1.2.2
  => Linux PC A(edge1)에서 MACCHITObin 내부의 Linux PC B로 routing이 가능하도록 하기 위해 위의 rule을 추가해 준다.
📌 192.168.2.0/24 네트워크로 가기 위해서는 10.1.2.2(반대편 tunnel ip)로 보내야 한다는 뜻임.
_______________________________

n2n의 모든 설정이 끝났으니, VPN이 정상적으로 동작하는지를 ping을 통해 확인해 보도록 하자.

<Linux PC A>
chyi@earth:~$ ping 10.1.2.2
 => Linux PC A에서 edge2 vpn ip로 ping
64 bytes from 10.1.2.1: icmp_seq=869 ttl=63 time=1126 ms
64 bytes from 10.1.2.1: icmp_seq=870 ttl=63 time=129 ms
64 bytes from 10.1.2.1: icmp_seq=871 ttl=63 time=234 ms

chyi@earth:~$ ping 192.168.2.100
  => Linux PC A 에서 Linux PC B로 ping
64 bytes from 10.1.2.1: icmp_seq=863 ttl=63 time=261 ms
64 bytes from 10.1.2.1: icmp_seq=864 ttl=63 time=459 ms
64 bytes from 10.1.2.1: icmp_seq=865 ttl=63 time=452 ms

<Linux PC B>
chyi@mars:~$ ping 10.1.2.1
  => Linux PC B 에서 edge1 vpn ip로 ping
PING 10.1.2.1 (10.1.2.1) 56(84) bytes of data.
64 bytes from 10.1.2.1: icmp_seq=1 ttl=63 time=680 ms
64 bytes from 10.1.2.1: icmp_seq=2 ttl=63 time=709 ms
64 bytes from 10.1.2.1: icmp_seq=3 ttl=63 time=950 ms

<MACCHIATObin target board>
root@localhost:~# ping 10.1.2.1
  => target board에서 edge1 vpn ip로 ping
PING 10.1.2.1 (10.1.2.1) 56(84) bytes of data.
64 bytes from 10.1.2.1: icmp_seq=1 ttl=64 time=691 ms
64 bytes from 10.1.2.1: icmp_seq=2 ttl=64 time=43.8 ms
64 bytes from 10.1.2.1: icmp_seq=3 ttl=64 time=362 ms

OK, 모두 정상 동작한다. 😃

<여기서 잠깐 !>
  => n2n과 openssl version에 관하여 ...
n2n은 AES, ChaCha20 등의 암호 알고리즘을 위해 openssl 1.1을 사용한다. 근데, Ubuntu 16.04에는 1.0.2 version이 latest version으로 설치되어 있다. 따라서 openssl 1.1.0 버젼으로 upgrade해 주어야 한다.

<Docker Ubuntu 16.04>
chyi@23dc5a9270fd:~$ openssl version
OpenSSL 1.0.2g  1 Mar 2016

root@657d7cc2d58e:/home/chyi/workspace/download# wget https://www.openssl.org/source/openssl-1.1.1b.tar.gz
root@657d7cc2d58e:/home/chyi/workspace/download# tar xvzf ./openssl-1.1.1b.tar.gz; cd openssl-1.1.1b

root@657d7cc2d58e:/home/chyi/workspace/download/openssl-1.1.1b# ./config
root@657d7cc2d58e:/home/chyi/workspace/download/openssl-1.1.1b# make
root@657d7cc2d58e:/home/chyi/workspace/download/openssl-1.1.1b# make install

root@657d7cc2d58e:/home/chyi/workspace/download/openssl-1.1.1b# export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
root@localhost:/home/chyi/workspace# openssl version
OpenSSL 1.1.1b  26 Feb 2019

이 상태에서 n2n을 다시 build해 주면 된다.
____________________________________

7.4) n2n 동작 시험 2
이번에는 OpenWrt를 기반으로 하는 Gl.iNet MT300N-V2(이하 MangoBox로 칭하겠음)도 시험 네트워크에 포함시켜 보도록 하겠다.

<Testbed2: a <=> b간의 vpn>
a) Linux PC A(192.168.8.156/24) => MangoBox(n2n edge1: 10.1.2.1)  => LTE Router => Internet 
b) Linux PC B(192.168.2.100/24) => MACCIATObin(n2n edge2: 10.1.2.2) => Repeater => AP => Internet

10.1.2.1 <==> 10.1.2.2
192.168.8.156(Linux PC A) <==> 192.168.2.100(Linux PC B)

[그림 7.11] Gl.iNet MT300N-V2(MangoBox)

그럼, 지금부터는 아래 site의 내용을 참조하여 MangoBox의 개발 환경(openwrt)을 준비해 보도록 하겠다.


<Docker ubuntu 18.04>
  => 앞서와 마찬가지로 Docker 상에 설치된 ubuntu 18.04 위에 openwrt를 설치하도록 하자.
# apt-get update
# apt-get install build-essential subversion libncurses5-dev zlib1g-dev gawk gcc-multilib flex git-core gettext libssl-dev
# apt-get install unzip time
  => openwrt를 위해 필요한 package를 설치해 준다.

chyi@62ca0b4ddbc2:~/gl.inet$ git clone https://github.com/gl-inet/openwrt.git openwrt
chyi@62ca0b4ddbc2:~/gl.inet$ cd openwrt/
chyi@62ca0b4ddbc2:~/gl.inet$ ./scripts/feeds update -a
chyi@62ca0b4ddbc2:~/gl.inet$ ./scripts/feeds install -a

chyi@62ca0b4ddbc2:~/gl.inet$ make menuconfig
  => target board에 맞게 설정 변경을 해준다.

[그림 7.12] MangoBox를 위해 target board 설정 변경

chyi@62ca0b4ddbc2:~/gl.inet/openwrt$ make V=s -j5

OpenWrt가 build되었으니, 이제는 n2n을 build할 차례이다. 먼저 아래 site를 참조하여 openwrt에 설치할 n2n package 파일을 준비한다.


📌 위의 site 내용이 예전 n2n version을 기준으로 한 것이라, 몇가지 문제가 있다. 따라서 아래와 같이 Makefile을 적절히 수정해 주도록 하자.

[그림 7.13] n2n package를 위한 Makefile - 수정 버젼

수정된 n2n package file을 아래와 같이 package/network/services/n2n 디렉토리에 복사한다.

chyi@535261426f3a:~/gl.inet/openwrt/package/network/services/n2n$ ls -la
total 56
drwxrwxr-x 1 chyi chyi  4096 Sep 24 07:52 .
drwxrwxr-x 1 chyi chyi  4096 Sep 23 12:28 ..
-rw-rw-r-- 1 chyi chyi 32472 Sep 24 02:46 LICENSE
-rw-rw-r-- 1 chyi chyi  1995 Sep 24 07:49 Makefile
drwxrwxr-x 2 chyi chyi  4096 Sep 23 12:24 files

chyi@535261426f3a:~/gl.inet/openwrt$ make menuconfig
  => 이후 menuconfig 하여, n2n를 선택해 준다.

[그림 7.14] n2n-edge, supernode 선택 화면

chyi@535261426f3a:~/gl.inet/openwrt$ make package/network/services/n2n/configure
  => n2n 최신 버젼에서는 autogen.sh 후 configure를 해 주어야 한다.
chyi@535261426f3a:~/gl.inet/openwrt$ make package/network/services/n2n/compile -j1 V=s
  => build를 진행한다.

성공적으로 build가 진행되었으니, edge, supernode binary 및 ipk  파일이 어디에 생성되었는지 찾아보도록 하자.

chyi@535261426f3a:~/gl.inet/openwrt$ find . -name "edge" -print
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/.pkgdir/n2n-edge/usr/sbin/edge
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/edge
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/ipkg-mipsel_24kc/n2n-edge/usr/sbin/edge
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/packages/openwrt/etc/init.d/edge
./staging_dir/target-mipsel_24kc_musl/root-ramips/usr/sbin/edge

chyi@535261426f3a:~/gl.inet/openwrt$ find . -name "supernode" -print
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/.pkgdir/n2n-supernode/usr/sbin/supernode
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/supernode
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/ipkg-mipsel_24kc/n2n-supernode/usr/sbin/supernode
./build_dir/target-mipsel_24kc_musl/n2n-/n2n-2.8/packages/openwrt/etc/init.d/supernode
./staging_dir/target-mipsel_24kc_musl/root-ramips/usr/sbin/supernode

chyi@535261426f3a:~/gl.inet/openwrt$ find . -name "n2n*ipk" -print
./bin/packages/mipsel_24kc/base/n2n-edge_2.8-1_mipsel_24kc.ipk
./bin/packages/mipsel_24kc/base/n2n-supernode_2.8-1_mipsel_24kc.ipk

다음으로 할 일은 앞서 생성한 두개의 ipk 파일을 target board에 설치하는 것이다.

<MangoBox>
root@mango:~# opkg update
root@mango:~# opkg install /tmp/n2n-edge_2.8-1_misel_24kc.ipk
root@mango:~# opkg install /tmp/n2n-supernode_2.8-1_misel_24kc.ipk

📌 설치 후, edge를 실행하면 openssl 관련하여 error가 발생할 수 있다. 이는 openssl version이 불일치해서 생기는 문제로 openssl version을 맞추는 작업을 해주어야 한다.

edge가 정상 동작하는 것을 확인한 후에는, 아래와 같이 uci 명령을 사용하여 추가 firewall 설정을 해 주어야 한다. 즉, n2n을 위한 zone을 하나 만들고, n2n <=> lan, n2n <=> wan 간에 packet forwarding이 되도록 하는 firewall rule을 추가해 주어야 한다.

[그림 7.15] uci 명령을 사용하여 firewall 규칙 설정 변경하기

📌 위의 과정을 생략하면 firewall에 의해 막혀 n2n(edge)이 제대로 동작하지 못하게 되므로 반드시 설정해 주도록  한다.

자, 그럼 모든 준비가 끝났으니, 본격적으로 edge 명령 설정 단계로 들어가 보자.

<MangoBox>
root@mango:~/workspace#  ./edge -c mynetwork -k mysecretpass -a 10.1.2.1  -r -l supernode.ntop.org:7777 -A2 -z1 -f -n 192.168.2.0/24:10.1.2.2

[그림 7.16] MangoBox에서 edge를 실행한 모습

📌 위의 -n option이 의미하는 것은 192.168.2.0/24 network으로 패킷을 내보내기 위해서는 10.1.2.2 gateway로 전달해야 한다는 뜻이다. 위 명령을 실행하고 나면 아래와 같은 routing table 항목(4번째 line)이 자동으로 생성되게 된다.

[그림 7.17] MangoBox의 routing table(4번째 line 주목)

다음으로 MACCHIATObin에서도 edge 설정을 해 주도록 하자.

<MACCHIATObin board>
root@localhost:/home/chyi/workspace# ./edge -c mynetwork -k mysecretpass -a 10.1.2.2 -r -l supernode.ntop.org:7777 -A2 -z1 -f -n 192.168.8.0/24:10.1.2.1

모든 설정이 끝났으니 이 상태에서 Linux PC B(MACCHIATObin 내부망 PC)로 부터 Linux PC A(MangoBox 내부망 PC)로 ping을 시도해 보자. 

192.168.2.100(Linux PC B) => 192.168.8.156(Linux PC A)

[그림 7.18] 192.168.2.100(Linux PC B) => 192.168.8.156(Linux PC A) ping 모습

이번에는 반대 방향으로도 해 보자.

192.168.8.156(Linux PC A) => 192.168.2.100(Linux PC B)

[그림 7.19] 192.168.8.156(Linux PC A) => 192.168.2.100(Linux PC B) ping 모습

OK, 둘다 모두 정상이다. 😏
_______________________

이상으로 ntop n2n을 가지고 MACCHIATObin board & MangoBox를 P2P VPN Gateway로 만드는 과정을 간략히 살펴 보았다.
아직 안전한 암호 key 교환 방법(예: IKE, ECDH) 등 넘어야 할 산이 좀 남아 있긴 하지만, p2p VPN 영역에서 n2n이 나름의 역할을 할 것으로 기대하며, 이번 글을 마치고자 한다. 🎈


8. References
[2] ESPRESSObin ULTRA- Quick Start Guide -Rev 03
[3] Ethernet switch support in the Linux kernel, Alexandre Belloni, Bootlin
[4] From the Ethernet MAC to the link partner, Maxime Chevallier, Antoine Ténart, Bootlin
[6] marvell-link-street-88E6341-product-brief.pdf
[7] http://wiki.macchiatobin.net/tiki-index.php?page=BSP+HowTo
[8] https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04
[9] http://pyrasis.com/Docker/Docker-HOWTO#ps
[10] https://www.stereolabs.com/docs/docker/building-arm-container-on-x86/
[11] N2N: A Layer Two Peer-to-Peer VPN, Luca Deri and Richard Andrews
[12] Creating Network Overlays with IoT Devices using N2N, Emanuele Faranda


SlowBoot

댓글 2개: