1. Giới thiệu
Luồng là gì?
Thread là một giao thức mạng lưới không dây công suất thấp dựa trên IP, cho phép giao tiếp an toàn giữa thiết bị với thiết bị và thiết bị với đám mây. Mạng luồng có thể thích ứng với các thay đổi về cấu trúc liên kết để tránh lỗi điểm đơn.
OpenThread là gì?
OpenThread do Google phát hành là một phương thức triển khai Thread® nguồn mở.
Bộ định tuyến biên OpenThread là gì?
OpenThread Border Router (OTBR) do Google phát hành là một cách triển khai nguồn mở của Thread Border Router.
NAT64
NAT64 là một cơ chế cho phép máy chủ trong mạng chỉ IPv6 truy cập vào tài nguyên trong mạng IPv4. Cổng NAT64 là trình dịch giữa các giao thức IPv4 và giao thức IPv6.
Trình dịch NAT64, 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 Bộ định tuyến biên OpenThread (OTBR) và một thiết bị Thread, sau đó bật và xác minh hoạt động giao tiếp giữa các thiết bị Thread và máy chủ 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 máy chủ IPv4 từ các thiết bị đầu cuối của luồng.
Bạn cần có
- Một máy trạm Linux để tạo và cài đặt ROM Thread RCP, OpenThread CLI và kiểm thử khả năng kết nối IPv4.
- Raspberry Pi cho bộ định tuyến biên Thread. Bạn có thể truy cập vào máy trạm Linux qua IPv4 từ thiết bị này.
- 2 thiết bị USB nRF52840 của Nordic Semiconductor (một cho RCP và một cho thiết bị đầu cuối Thread).
Cấu trúc 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 việc 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 Thread phát hành 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ục nhập tuyến có cờ n
. Trong ví dụ trên, fd16:a3d:e170:2:0:0::/96
là tiền tố NAT64.
Tiền tố NAT64 sẽ được các thiết bị Thread sử dụng khi giao tiếp với máy chủ IPv4.
3. Thiết lập thiết bị đầu cuối Thread
Làm theo bước Thiết lập FTD của phần Xây dựng mạng Thread bằng bảng nRF52840 và lớp học lập trình OpenThread để tạo và cài đặt ROM cho thiết bị đầu cuối CLI nRF52840, với thay đổi đối với bước sau:
Trong phần Build and flash (Tạo và cài đặt ROM), 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 phần Tạo mạng Thread bằng các bảng nRF52840 và lớp học lập trình OpenThread như đã viết. Sau khi thiết bị cuối được cài đặt ROM bằng 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ị đầu cuối Thread và xác minh xem việc tham gia 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 của 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 rằng dữ liệu mạng khớp với dữ liệu từ OTBR.
4. Giao tiếp với máy chủ IPv4 từ thiết bị đầu cuối của luồng
Giờ đây, bạn có thể giao tiếp với máy chủ trên mạng IPv4 từ thiết bị cuối mà chúng ta vừa thiết lập.
Gửi yêu cầu phản hồi ICMP đến máy chủ IPv4
Từ CLI của thiết bị đầu cuối của luồng:
> 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 ánh xạ 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.
Bạn có thể 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 tính 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 kết nối TCP giữa thiết bị cuối 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
.
Trên máy chủ Linux IPv4, hãy sử dụng nc
để nghe các kết nối TCP:
$ nc -l 0.0.0.0 12345
Từ thiết bị đầu cuối của luồng, hãy thiết lập kết nối TCP và gửi thông báo đến máy chủ IPv4 Linux:
> 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
Máy chủ lưu trữ IPv4 Linux của bạn sẽ xuất ra:
hello
Bạn cũng có thể gửi thông báo từ máy chủ Linux IPv4 đến thiết bị đầu cuối của luồng. Nhập "world" rồi nhấn Enter trên máy chủ IPv4 Linux đang chạy nc
và thiết bị đầu cuối của luồng 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
để nghe các kết nối UDP:
$ nc -u -l 0.0.0.0 12345
Từ thiết bị đầu cuối của luồng, hãy thiết lập 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
Máy chủ lưu trữ IPv4 Linux của bạn sẽ xuất ra:
hello
Bạn cũng có thể gửi thông báo từ máy chủ Linux IPv4 đến thiết bị đầu cuối của luồng. Nhập "world" rồi nhấn Enter trên máy chủ IPv4 Linux đang chạy nc
và thiết bị đầu cuối của luồng 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 bạn muốn. Sử dụng nat64 disable
để tắt NAT64. Và sử 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 tắt, thiết bị sẽ không còn phát hành tiền tố 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
Ngoài ra, các thiết bị trong mạng Thread không thể truy cập vào máy chủ IPv4 thông qua bộ định tuyến biên này nữa.
Từ CLI của thiết bị đầu cuối của luồng:
> ping 8.8.8.8 Error 13: InvalidState
Sử dụng nat64 enable
để bật NAT64. Có thể mất một khoảng 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ẽ khởi động và chạy:
> 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 ánh xạ:
> 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 truy vấn DNS đến máy chủ DNS cấp trê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ị 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 truy vấn DNS cho các miền Internet từ thiết bị 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 đó để cung cấp quyền truy cập Internet cho các thiết bị đầu cuối 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 API OpenThread cho NAT64
- Tài liệu tham khảo API OpenThread cho DNS thượng nguồn
- Tính năng trừu tượng hoá nền tảng OpenThread cho DNS