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

1. 소개

7299534792dd9439.png

대화목록이란 무엇인가요?

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

OpenThread란 무엇인가요?

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

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

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

NAT64

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

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

빌드할 항목

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

학습할 내용

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

필요한 항목

  • 스레드 NCP, OpenThread CLI를 빌드하고 플래시하며 IPv4 연결을 테스트하기 위한 Linux 워크스테이션
  • 스레드 보더 라우터용 4GB RAM이 장착된 Raspberry Pi 4 이 기기에서 IPv4를 통해 Linux 워크스테이션에 연결할 수 있습니다.
  • Nordic Semiconductor nRF52840 DK 보드 2개

이 Codelab의 네트워크 토폴로지:

C3cd2e081bc052fd.png

2. OpenThread 보더 라우터 설정

스레드 보더 라우터 - 양방향 IPv6 연결 및 DNS 기반 서비스 검색 Codelab의 OTBR 설정 단계에 따라 다음 변경사항과 함께 OpenThread 보더 라우터를 빌드합니다.

OTBR 빌드 및 설치에서 NAT64 환경 변수를 1로, NAT64_SERVICEopenthread로 설정하여 OpenThread에서 NAT64 변환기를 사용 설정하도록 스크립트에 지시해야 합니다. 단계 전에 다음 명령어를 실행합니다.

$ export NAT64=1 NAT64_SERVICE=openthread

Thread Border Router - 양방향 IPv6 연결 및 DNS 기반 서비스 검색 Codelab을 계속 진행합니다. 스레드 네트워크를 형성한 후에는 OpenThread CLI 명령어로 경계 라우터가 NAT64 접두사를 게시하는지 확인할 수 있습니다.

먼저 보더 라우터가 실행 중인지, 경계 라우터에서 NAT64가 사용 설정되어 있는지 확인합니다.

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done

OTBR이 스레드 리더 역할을 하며 스레드 네트워크 데이터에 NAT64 접두어 (여기서는 fd4c:9574:3720:2:0:0::/96)가 있는 것을 확인할 수 있습니다.

$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

NAT64 프리픽스는 IPv4 호스트와 통신할 때 스레드 기기에서 사용됩니다.

3. 스레드 최종 기기 설정

nRF52840 보드 및 OpenThread로 스레드 네트워크 빌드의 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

nRF52840 보드 및 OpenThread Codelab을 사용하여 스레드 네트워크 빌드를 계속 작성합니다. CLI로 최종 기기가 플래시되면 스레드 보더 라우터 - 양방향 IPv6 연결 및 DNS 기반 서비스 검색에 따라 스레드 최종 기기를 설정합니다.

스레드 최종 기기를 설정한 후 몇 초 정도 기다린 후 스레드 네트워크 연결이 성공했는지 확인합니다. 네트워크 데이터 (이 경우 fd4c:9574:3720:2:0:0::/96)에서 NAT64 프리픽스를 찾을 수 있습니다.

> netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

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

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

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

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

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

> ping 8.8.8.8
Pinging synthesized IPv6 address: fd4c:9574:3720:2:0:0:808:808
16 bytes from fd4c:9574:3720:2:0:0:808:808: icmp_seq=15 hlim=119 time=48ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 48/48.0/48 ms.
Done

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

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
| 377ee63dd3127f1a |     fd4c:9574:3720:1:1d61:b4c1:494f:f975 |  192.168.255.254 |  7190s |        1 |           16 |        1 |           16 |
|                  |                                                                  TCP |        0 |            0 |        0 |            0 |
|                  |                                                                  UDP |        0 |            0 |        0 |            0 |
|                  |                                                                 ICMP |        1 |           16 |        1 |           16 |
Done

fd4c:9574:3720:1:1d61:b4c1:494f:f975는 스레드 기기의 IPv6 주소여야 합니다.

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

IPv4 DNS 서버로 DNS 쿼리 전송

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

> dns resolve4 example.com 8.8.8.8
Synthesized IPv6 DNS server address: fd4c:9574:3720:2:0:0:808:808
DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 
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: fd4c:9574:3720: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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> udp send hello
Done

Linux IPv4 호스트 출력:

hello

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

6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world

5. 경계 라우터에서 NAT64 전환

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

$ sudo ot-ctl nat64 disable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

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

$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

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

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

> ping 8.8.8.8
Error 13: InvalidState

nat64 enable를 사용하여 NAT64를 사용 설정합니다. 프리픽스 관리자가 NAT64 프리픽스를 공지하는 데 시간이 걸릴 수 있습니다.

$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

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

$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done
$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

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

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
Done

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

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

이 기능은 내부 DNS-SD 서버에서 지원되므로 DNS-SD 서버가 사용 설정되어 있는지 확인해야 합니다.

$ sudo ot-ctl srp server state
running
Done

running이 아닌 경우 사용 설정합니다.

$ sudo ot-ctl srp server enable
Done

업스트림 DNS 프록시가 사용 설정되어 있는지 확인합니다.

$ sudo ot-ctl dns server upstream
Enabled
Done

Enabled이 아닌 경우 사용 설정합니다.

$ sudo ot-ctl dns server upstream enable
Done

최종 기기에서 SRP 클라이언트가 테두리 라우터로 DNS 쿼리를 전송하도록 사용 설정되어 있는지 확인합니다.

> srp client state
Enabled
Done

Enabled이 아닌 경우 사용 설정합니다.

> srp client autostart enable
Done

최종 기기에서 기본 DNS 서버가 보더 라우터인지 확인합니다.

> dns config
Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
Done

서버 IPv6 주소 (위 예시에서는 fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf)가 OpenThread Border Router의 주소 중 하나여야 합니다.

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

> dns resolve example.com
DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 
Done
> dns resolve4 example.com
DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 
Done

7. 축하합니다

수고하셨습니다. NAT64 지원으로 보더 라우터를 성공적으로 설정하고 스레드 최종 기기에 인터넷 액세스를 제공하는 데 사용했습니다.

추가 자료

참조 문서