1. 소개
스레드란 무엇인가요?
스레드는 기기 간 및 기기 간 안전한 통신을 가능하게 하는 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의 네트워크 토폴로지는 다음과 같습니다.
2. OpenThread 보더 라우터 설정
스레드 보더 라우터 - 양방향 IPv6 연결 및 DNS 기반 서비스 검색 Codelab의 OTBR 설정 단계를 따라 다음과 같은 변경사항을 적용하여 OpenThread 보더 라우터를 빌드하세요.
OTBR 빌드 및 설치에서는 환경 변수 NAT64
를 1
로, NAT64_SERVICE
를 openthread
로 설정하여 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 지원으로 보더 라우터를 설정하고 이를 사용하여 스레드 최종 기기에 인터넷 액세스를 제공했습니다.
추가 자료
- OpenThread 가이드
- OpenThread CLI 참조
- NAT64용 OpenThread API 참조
- 업스트림 DNS용 OpenThread API 참조
- DNS를 위한 OpenThread 플랫폼 추상화