Thread Border Router – Cung cấp truy cập Internet qua NAT64

1. Giới thiệu

7299534792dd9439.png

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:

c3cd2e081bc052fd.png

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-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

Tài liệu tham khảo