스레드 보더 라우터 - NAT64를 통해 인터넷 액세스 제공

1. 소개

7299534792dd9439.png

스레드란 무엇인가요?

스레드는 기기 간 및 기기-클라우드 간 보안 통신을 지원하는 IP 기반 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 네트워크는 토폴로지 변경에 적응하여 단일 장애점을 방지할 수 있습니다.

OpenThread란 무엇인가요?

Google에서 출시한 OpenThread는 Thread®의 오픈소스 구현입니다.

OpenThread 보더 라우터란 무엇인가요?

Google에서 출시한 OpenThread Border Router (OTBR)는 스레드 보더 라우터의 오픈소스 구현입니다.

NAT64

NAT64는 IPv6 전용 네트워크의 호스트가 IPv4 네트워크의 리소스에 액세스할 수 있도록 지원하는 메커니즘입니다. NAT64 게이트웨이는 IPv4 프로토콜과 IPv6 프로토콜 간의 변환기입니다.

NAT64 변환기는 OpenThread Border Router의 일부로 TCP, UDP, ICMP (ICMPv6) 프로토콜의 변환을 지원합니다.

빌드할 항목

이 Codelab에서는 OpenThread 보더 라우터 (OTBR)와 스레드 기기를 설정한 다음 OpenThread 보더 라우터를 통해 스레드 기기와 인터넷의 IPv4 호스트 간 통신을 사용 설정하고 확인합니다.

학습할 내용

  • NAT64 기능으로 OpenThread 보더 라우터를 빌드하는 방법
  • 스레드 엔드 기기에서 IPv4 호스트와 통신하는 방법

필요한 항목

  • 스레드 RCP와 OpenThread CLI를 빌드하고 플래시하며 IPv4 연결을 테스트하는 데 사용되는 Linux 워크스테이션
  • 스레드 보더 라우터용 Raspberry Pi 이 기기에서 IPv4를 통해 Linux 워크스테이션에 연결할 수 있어야 합니다.
  • Nordic Semiconductor nRF52840 USB 동글 2개 (RCP용 1개, 스레드 최종 기기용 1개)

이 Codelab의 네트워크 토폴로지는 다음과 같습니다.

c3cd2e081bc052fd.png

2. OpenThread 보더 라우터 설정

OTBR을 설정하는 가장 빠른 방법은 OTBR 설정 가이드를 따르는 것입니다.

OTBR 설정이 완료되면 ot-ctl를 사용하여 NAT64 서비스가 보더 라우터에서 사용 설정되었는지 확인합니다.

> nat64 state
PrefixManager: Active
Translator: Active
Done

스레드 보더 라우터는 스레드 네트워크 데이터에 NAT64 접두사를 게시합니다.

> netdata show
Prefixes:
fd16:a3d:e170:1::/64 paros low f800
Routes:
::/0 s med f800
fd16:a3d:e170:2:0:0::/96 sn low f800
Services:
44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0
Contexts:
fd16:a3d:e170:1::/64 1 sc
Commissioning:
60365 - - -
Done

NAT64 접두사가 n 플래그가 있는 경로 항목으로 표시됩니다. 위 예시에서 fd16:a3d:e170:2:0:0::/96은 NAT64 접두사입니다.

NAT64 접두사는 스레드 기기가 IPv4 호스트와 통신할 때 사용됩니다.

3. 스레드 최종 기기 설정

nRF52840 보드 및 OpenThread Codelab으로 스레드 네트워크 빌드의 FTD 설정 단계에 따라 nRF52840 CLI 엔드 기기를 빌드하고 플래시합니다. 다음 단계는 변경합니다.

빌드 및 플래시에서 script/build를 호출할 때 명령줄에 -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON, -DOT_ECDSA=ON를 추가해야 합니다.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

nRF52840 보드 및 OpenThread Codelab으로 스레드 네트워크 빌드를 작성된 대로 계속 진행합니다. CLI 이미지로 엔드 기기를 플래시한 후 스레드 네트워크에 두 번째 노드 가입에 따라 스레드 기기를 스레드 네트워크에 추가합니다.

스레드 최종 기기를 설정한 후 몇 초 정도 기다린 다음 스레드 네트워크에 가입이 성공했는지 확인합니다. 위와 같이 게시된 NAT64 접두사를 스레드 네트워크 데이터에서 확인할 수 있습니다.

> netdata show
Prefixes:
fd16:a3d:e170:1::/64 paros low f800
Routes:
::/0 s med f800
fd16:a3d:e170:2:0:0::/96 sn low f800
Services:
44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0
Contexts:
fd16:a3d:e170:1::/64 1 sc
Commissioning:
60365 - - -
Done

네트워크 데이터가 OTBR의 데이터와 일치하는지 확인합니다.

4. 스레드 엔드 기기에서 IPv4 호스트와 통신

이제 방금 설정한 최종 기기에서 IPv4 네트워크의 호스트와 통신할 수 있습니다.

IPv4 호스트에 ICMP 에코 요청 전송

스레드 최종 기기의 CLI에서 다음을 실행합니다.

> ping 8.8.8.8
Pinging synthesized IPv6 address: fd16:a3d:e170:2:0:0:808:808
16 bytes from fd16:a3d:e170:2:0:0:808:808: icmp_seq=1 hlim=109 time=28ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 28/28.0/28 ms.
Done

보더 라우터는 nat64 mappings 명령어를 사용하여 이 기기의 NAT64 매핑 항목을 만듭니다.

> nat64 mappings
|                  | Address                                                     | Ports or ICMP Ids |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | v6      | v4      | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+
| 90b156e3cf609a23 |      fd16:a3d:e170:1:492d:bcdb:9f72:6297 |  192.168.255.254 |   N/A   |   N/A   |  7162s |        1 |           16 |        1 |           16 |
|                  |                                                                                      TCP |        0 |            0 |        0 |            0 |
|                  |                                                                                      UDP |        0 |            0 |        0 |            0 |
|                  |                                                                                     ICMP |        1 |           16 |        1 |           16 |
Done

fd16:a3d:e170:1:492d:bcdb:9f72:6297은 스레드 기기의 IPv6 주소여야 합니다.

언제든지 경계 라우터에서 이 명령어를 실행하여 트래픽을 집계하는 방법을 확인할 수 있습니다.

IPv4 DNS 서버에 DNS 쿼리 전송

dns resolve4을 사용하여 IPv4 네트워크에서 호스트 이름을 확인합니다. DNS 서버 주소는 IPv4 주소일 수도 있습니다.

> dns resolve4 example.com 8.8.8.8
Synthesized IPv6 DNS server address: fd16:a3d:e170:2:0:0:808:808
DNS response for example.com. - fd16:a3d:e170:2:0:0:17c0:e454 TTL:295 fd16:a3d:e170:2:0:0:17d7:88 TTL:295 fd16:a3d:e170:2:0:0:17d7:8a TTL:295 fd16:a3d:e170:2:0:0:6007:80af TTL:295 fd16:a3d:e170:2:0:0:6007:80c6 TTL:295 fd16:a3d:e170:2:0:0:17c0:e450 TTL:295 
Done

TCP를 통해 통신

엔드 기기와 IPv4 네트워크의 호스트 간에 TCP 연결을 설정할 수 있습니다.

Linux IPv4 호스트의 IP 주소가 192.168.0.2라고 가정합니다.

Linux IPv4 호스트에서 nc를 사용하여 TCP 연결을 수신합니다.

$ nc -l 0.0.0.0 12345

스레드 엔드 기기에서 TCP 연결을 설정하고 Linux IPv4 호스트에 메시지를 전송합니다.

> tcp init
Done
> tcp connect 192.168.0.2 12345
Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2
Done
> tcp send hello

Linux IPv4 호스트는 다음을 출력합니다.

hello

Linux IPv4 호스트에서 스레드 엔드 기기로 메시지를 보낼 수도 있습니다. nc를 실행하는 Linux IPv4 호스트에 'world'를 입력하고 Enter 키를 누르면 스레드 엔드 기기에서 다음이 출력됩니다.

TCP: Received 6 bytes: world

UDP를 통해 통신

IPv4 네트워크의 스레드 기기와 호스트 간에 UDP를 사용하여 통신할 수 있습니다.

Linux IPv4 호스트의 IP 주소가 192.168.0.2라고 가정합니다.

nc를 사용하여 UDP 연결을 수신합니다.

$ nc -u -l 0.0.0.0 12345

스레드 엔드 기기에서 UDP 연결을 설정하고 Linux IPv4 호스트에 메시지를 전송합니다.

> udp open
Done
> udp connect 192.168.0.2 12345
Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2
Done
> udp send hello
Done

Linux IPv4 호스트는 다음을 출력합니다.

hello

Linux IPv4 호스트에서 스레드 엔드 기기로 메시지를 보낼 수도 있습니다. nc를 실행하는 Linux IPv4 호스트에 'world'를 입력하고 Enter 키를 누르면 스레드 엔드 기기에서 다음이 출력됩니다.

6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world

5. 보더 라우터에서 NAT64 전환

언제든지 NAT64를 사용 설정하거나 사용 중지할 수 있습니다. nat64 disable를 사용하여 NAT64를 사용 중지합니다. nat64 state를 사용하여 NAT64 상태를 확인합니다.

> nat64 disable
Done
> nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

사용 중지한 후에는 기기에서 더 이상 NAT64 접두사를 게시하지 않습니다.

> netdata show
Prefixes:
fd16:a3d:e170:1::/64 paros low f800
Routes:
::/0 s med f800
Services:
44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0
Contexts:
fd16:a3d:e170:1::/64 1 sc
Commissioning:
60365 - - -
Done

또한 스레드 네트워크의 기기가 이 보더 라우터를 통해 더 이상 IPv4 호스트에 액세스할 수 없습니다.

스레드 최종 기기의 CLI에서 다음을 실행합니다.

> ping 8.8.8.8
Error 13: InvalidState

nat64 enable를 사용하여 NAT64를 사용 설정합니다. 접두사 관리자가 NAT64 접두사를 광고하기까지 시간이 걸릴 수 있습니다.

> nat64 enable
Done
> nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

몇 초 후 NAT64 구성요소가 실행됩니다.

> nat64 state
PrefixManager: Active
Translator: Active
Done
> netdata show
Prefixes:
fd16:a3d:e170:1::/64 paros low f800
Routes:
::/0 s med f800
fd16:a3d:e170:2:0:0::/96 sn low f800
Services:
44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0
Contexts:
fd16:a3d:e170:1::/64 1 sc
Commissioning:
60365 - - -
Done

NAT64를 사용 중지하면 매핑 테이블이 삭제됩니다.

> nat64 mappings
|                  | Address                                                     | Ports or ICMP Ids |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | v6      | v4      | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+
Done

6. 업스트림 DNS 서버로 DNS 쿼리 전달

NAT64가 테두리 라우터에서 사용 설정되면 OpenThread는 인터넷 도메인의 DNS 쿼리를 업스트림 DNS 서버로 전달하려고 시도합니다.

엔드 기기에서 기본 DNS 서버가 테두리 라우터인지 확인합니다.

> dns config
Server: [fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
ServiceMode: srv_txt_opt
Nat64Mode: allow
Done

서버 IPv6 주소 (위 예의 fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d)는 OpenThread Border Router의 주소 중 하나여야 합니다.

이제 최종 기기에서 인터넷 도메인에 대한 DNS 쿼리를 보낼 수 있습니다.

> dns resolve example.com
DNS response for example.com. - 2600:1406:3a00:21:0:0:173e:2e65 TTL:161 2600:1406:3a00:21:0:0:173e:2e66 TTL:161 2600:1406:bc00:53:0:0:b81e:94c8 TTL:161 2600:1406:bc00:53:0:0:b81e:94ce TTL:161 2600:1408:ec00:36:0:0:1736:7f24 TTL:161 2600:1408:ec00:36:0:0:1736:7f31 TTL:161 
Done
> dns resolve4 example.com
DNS response for example.com. - fd16:a3d:e170:2:0:0:6007:80af TTL:300 fd16:a3d:e170:2:0:0:6007:80c6 TTL:300 fd16:a3d:e170:2:0:0:17c0:e450 TTL:300 fd16:a3d:e170:2:0:0:17c0:e454 TTL:300 fd16:a3d:e170:2:0:0:17d7:88 TTL:300 fd16:a3d:e170:2:0:0:17d7:8a TTL:300 
Done

7. 축하합니다

축하합니다. NAT64 지원으로 보더 라우터를 설정하고 이를 사용하여 스레드 엔드 기기에 인터넷 액세스를 제공했습니다.

추가 자료

참조 문서