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

1. 소개

7299534792dd9439.png

스레드란 무엇인가요?

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

OpenThread란 무엇인가요?

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

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

Google에서 출시한 OTBR (OpenThread Border Router)은 스레드 보더 라우터를 오픈소스로 구현한 결과물입니다.

NAT64

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

NAT64 트랜스레이터는 OpenThread 보더 라우터의 일부로, 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 빌드 및 설치에서는 환경 변수 NAT641로, NAT64_SERVICEopenthread로 설정하여 OpenThread에서 NAT64 변환기를 사용 설정하도록 스크립트에 지시해야 합니다. 단계 전에 다음 명령어를 실행합니다.

$ export NAT64=1 NAT64_SERVICE=openthread

작성된 대로 스레드 보더 라우터 - 양방향 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를 사용해 스레드 네트워크 빌드 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

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

스레드 종료 기기를 설정한 후 몇 초 동안 기다렸다가 스레드 네트워크에 연결되었는지 확인합니다. 네트워크 데이터에서 NAT64 접두사를 찾을 수 있어야 합니다 (여기서는 fd4c:9574:3720:2:0:0::/96).

> 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 호스트에서 스레드 종료 기기로 메시지를 보낼 수도 있습니다. 'world'를 입력합니다. nc를 실행하는 Linux IPv4 호스트에서 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 호스트에서 스레드 종료 기기로 메시지를 보낼 수도 있습니다. 'world'를 입력합니다. nc를 실행하는 Linux IPv4 호스트에서 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 보더 라우터의 주소 중 하나여야 합니다.

이제 최종 기기에서 인터넷 도메인에 대한 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 지원으로 보더 라우터를 설정하고 이를 사용하여 스레드 최종 기기에 인터넷 액세스를 제공했습니다.

추가 자료

참조 문서