1. Giới thiệu

Thread là gì?
Thread là một giao thức mạng lưới dạng mắt lưới không dây có công suất thấp dựa trên IP, cho phép giao tiếp an toàn giữa các thiết bị và giữa thiết bị với đám mây. Mạng Thread có thể thích ứng với các thay đổi về cấu trúc liên kết để tránh các lỗi tại một điểm duy nhất.
OpenThread là gì?
OpenThread do Google phát hành là một cách triển khai nguồn mở của Thread®.
Bộ định tuyến biên OpenThread là gì?
Bộ định tuyến biên OpenThread (OTBR) do Google phát hành là một cách triển khai nguồn mở của Bộ định tuyến biên Thread.
NAT64
NAT64 là một cơ chế cho phép các máy chủ trong mạng chỉ dành cho IPv6 truy cập vào tài nguyên trong mạng IPv4. Cổng NAT64 là một trình dịch giữa giao thức IPv4 và giao thức IPv6.
Trình dịch NAT64, trong vai trò là một phần của Bộ định tuyến biên OpenThread, hỗ trợ dịch các giao thức TCP, UDP và ICMP (ICMPv6).
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ thiết lập một Bộ định tuyến biên OpenThread (OTBR) và một thiết bị Thread, sau đó bật và xác minh giao tiếp giữa các thiết bị Thread và máy chủ lưu trữ IPv4 trên Internet thông qua Bộ định tuyến biên OpenThread.
Kiến thức bạn sẽ học được
- Cách tạo Bộ định tuyến biên OpenThread có các tính năng NAT64.
- Cách giao tiếp với các máy chủ IPv4 từ các thiết bị cuối Thread.
Bạn cần có
- Một máy trạm Linux để tạo và flash RCP Thread, OpenThread CLI và kiểm thử khả năng kết nối IPv4.
- Một Raspberry Pi cho bộ định tuyến biên sử dụng giao thức Thread. Thiết bị này phải có thể truy cập vào máy trạm Linux của bạn qua IPv4.
- 2 USB Dongle Nordic Semiconductor nRF52840 (một cho RCP và một cho thiết bị cuối Thread).
Cấu trúc liên kết mạng cho lớp học lập trình này:

2. Thiết lập Bộ định tuyến biên OpenThread
Cách nhanh nhất để thiết lập OTBR là làm theo Hướng dẫn thiết lập OTBR.
Sau khi hoàn tất quá trình thiết lập OTBR, hãy sử dụng ot-ctl để xác thực rằng dịch vụ NAT64 đã được bật trên bộ định tuyến biên:
> nat64 state PrefixManager: Active Translator: Active Done
Bộ định tuyến biên sử dụng giao thức Thread sẽ xuất bản tiền tố NAT64 trong Dữ liệu mạng Thread:
> 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
Tiền tố NAT64 xuất hiện dưới dạng một mục nhập tuyến đường có cờ n. Trong ví dụ trên, fd16:a3d:e170:2:0:0::/96 là tiền tố NAT64.
Các thiết bị Thread sẽ dùng tiền tố NAT64 khi giao tiếp với một máy chủ IPv4.
3. Thiết lập thiết bị cuối Thread
Làm theo Bước thiết lập FTD trong lớp học lập trình Tạo mạng Thread bằng các bảng nRF52840 và OpenThread để tạo và flash một thiết bị cuối CLI nRF52840, với một thay đổi ở bước sau:
Trong Build and flash (Tạo và nạp), bạn phải thêm -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON và -DOT_ECDSA=ON vào dòng lệnh khi gọi script/build:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Tiếp tục với khoá học lập trình Xây dựng mạng Thread bằng các bảng nRF52840 và OpenThread như đã viết. Sau khi thiết bị đầu cuối được nạp hình ảnh CLI, hãy làm theo hướng dẫn Tham gia nút thứ hai vào mạng Thread để thêm thiết bị Thread vào mạng Thread.
Đợi vài giây sau khi thiết lập thiết bị cuối Thread và xác minh xem việc kết nối với mạng Thread có thành công hay không. Như trên, bạn có thể xem tiền tố NAT64 đã xuất bản trong Dữ liệu mạng luồng.
> 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
Đảm bảo dữ liệu mạng khớp với dữ liệu từ OTBR.
4. Kết nối với các máy chủ IPv4 từ thiết bị cuối Thread
Giờ đây, bạn có thể giao tiếp với các máy chủ trên mạng IPv4 từ thiết bị đầu cuối mà bạn vừa thiết lập.
Gửi yêu cầu ICMP echo đến máy chủ IPv4
Từ CLI của thiết bị cuối Thread:
> 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
Bộ định tuyến biên tạo một mục liên kết NAT64 cho thiết bị này bằng lệnh nat64 mappings:
> 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 phải là địa chỉ IPv6 của thiết bị Thread.
Chạy lệnh này trên bộ định tuyến biên bất cứ lúc nào để xem cách bộ định tuyến này đếm lưu lượng truy cập.
Gửi truy vấn DNS đến máy chủ DNS IPv4
Sử dụng dns resolve4 để phân giải tên máy chủ trên mạng IPv4. Địa chỉ máy chủ DNS cũng có thể là địa chỉ 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
Giao tiếp qua TCP
Bạn có thể thiết lập các kết nối TCP giữa thiết bị đầu cuối và máy chủ lưu trữ trong mạng IPv4.
Giả sử địa chỉ IP của máy chủ Linux IPv4 là 192.168.0.2.
Trên máy chủ IPv4 Linux, hãy dùng nc để nghe các kết nối TCP:
$ nc -l 0.0.0.0 12345
Từ thiết bị cuối Thread, hãy thiết lập một kết nối TCP và gửi thông báo đến máy chủ 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
Đầu ra của máy chủ IPv4 Linux:
hello
Bạn cũng có thể gửi thông báo từ máy chủ IPv4 Linux đến thiết bị cuối Thread. Nhập "world" rồi nhấn Enter trên máy chủ IPv4 Linux đang chạy nc, thiết bị cuối Thread sẽ xuất ra:
TCP: Received 6 bytes: world
Giao tiếp qua UDP
Bạn có thể giao tiếp bằng UDP giữa các thiết bị Thread và máy chủ trong mạng IPv4.
Giả sử địa chỉ IP của máy chủ Linux IPv4 là 192.168.0.2.
Sử dụng nc để theo dõi các kết nối UDP:
$ nc -u -l 0.0.0.0 12345
Từ thiết bị cuối Thread, hãy thiết lập một kết nối UDP và gửi thông báo đến máy chủ 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
Đầu ra của máy chủ IPv4 Linux:
hello
Bạn cũng có thể gửi thông báo từ máy chủ IPv4 Linux đến thiết bị cuối Thread. Nhập "world" rồi nhấn Enter trên máy chủ IPv4 Linux đang chạy nc, thiết bị cuối Thread sẽ xuất ra:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. Bật/tắt NAT64 trên Bộ định tuyến biên
Bạn có thể bật hoặc tắt NAT64 bất cứ lúc nào. Sử dụng nat64 disable để tắt NAT64. Và dùng nat64 state để kiểm tra trạng thái của NAT64.
> nat64 disable Done > nat64 state PrefixManager: Disabled Translator: Disabled Done
Sau khi bạn tắt, thiết bị sẽ không còn xuất bản tiền tố NAT64 nữa:
> 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
Ngoài ra, các thiết bị trong mạng Thread không còn truy cập được vào máy chủ IPv4 thông qua bộ định tuyến biên này.
Từ CLI của thiết bị cuối Thread:
> ping 8.8.8.8 Error 13: InvalidState
Sử dụng nat64 enable để bật NAT64. Có thể mất một thời gian trước khi trình quản lý tiền tố bắt đầu quảng cáo tiền tố NAT64:
> nat64 enable Done > nat64 state PrefixManager: Idle Translator: NotWorking Done
Sau vài giây, các thành phần NAT64 sẽ hoạt động:
> 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
Xin lưu ý rằng việc tắt NAT64 sẽ xoá bảng liên kết:
> 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. Chuyển tiếp các truy vấn DNS đến máy chủ DNS ở thượng nguồn
Khi NAT64 được bật trên bộ định tuyến biên, OpenThread sẽ cố gắng chuyển tiếp các truy vấn DNS cho các miền Internet đến các máy chủ DNS ở thượng nguồn.
Trên thiết bị đầu cuối, hãy đảm bảo máy chủ DNS mặc định là bộ định tuyến biên:
> 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
Địa chỉ IPv6 của máy chủ (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d trong ví dụ trên) phải là một trong các địa chỉ của Bộ định tuyến biên OpenThread.
Giờ đây, bạn có thể gửi các truy vấn DNS cho các miền trên Internet từ thiết bị đầu cuối:
> 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. Xin chúc mừng
Xin chúc mừng! Bạn đã thiết lập thành công một bộ định tuyến biên có hỗ trợ NAT64 và sử dụng bộ định tuyến này để cung cấp quyền truy cập Internet cho các thiết bị cuối sử dụng giao thức Thread!
Tài liệu đọc thêm
- Hướng dẫn về OpenThread
- Tài liệu tham khảo về OpenThread CLI
- Tài liệu tham khảo OpenThread API cho NAT64
- Tài liệu tham khảo OpenThread API cho DNS nguồn trên
- Trừu tượng hoá nền tảng OpenThread cho DNS