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

이 Codelab 정보
schedule23분
subject최종 업데이트: 2025년 5월 5일
account_circle작성자: Song Guo, Jonathan Hui

1. 소개

7299534792dd9439.png

스레드란 무엇인가요?

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

OpenThread란 무엇인가요?

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

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

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

NAT64

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

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

빌드할 항목

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

학습할 내용

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

필요한 항목

  • Thread 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으로 Thread 네트워크 빌드의 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로 Thread 네트워크 빌드 Codelab을 계속 진행합니다. 최종 기기에 CLI 이미지가 플래시된 후 두 번째 노드를 Thread 네트워크에 연결에 따라 Thread 기기를 Thread 네트워크에 추가합니다.

스레드 최종 기기를 설정한 후 몇 초 정도 기다렸다가 스레드 네트워크에 성공적으로 가입했는지 확인합니다. 위와 같이 Thread 네트워크 데이터에서 게시된 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. Thread 최종 기기에서 IPv4 호스트와 통신

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

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

Thread 종단 기기의 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는 Thread 기기의 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 호스트에서 Thread 최종 기기로 메시지를 보낼 수도 있습니다. nc를 실행하는 Linux IPv4 호스트에서 'world'를 입력하고 Enter 키를 누르면 Thread 최종 기기에서 다음을 출력합니다.

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 호스트에서 Thread 최종 기기로 메시지를 보낼 수도 있습니다. nc를 실행하는 Linux IPv4 호스트에서 'world'를 입력하고 Enter 키를 누르면 Thread 최종 기기에서 다음을 출력합니다.

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

또한 Thread 네트워크의 기기는 더 이상 이 경계 라우터를 통해 IPv4 호스트에 액세스할 수 없습니다.

Thread 종단 기기의 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를 지원하는 보더 라우터를 설정하고 이를 사용하여 스레드 최종 기기에 인터넷 액세스 권한을 제공했습니다.

추가 자료

참조 문서