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

1. Giới thiệu

7299534792dd9439.pngS

Thread (Luồng) là gì?

Thread là một giao thức mạng lưới không dây 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 các thiết bị và giữa các thiết bị. 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 lỗi một điểm.

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 đường viền OpenThread là gì?

Trình định tuyến đường viền OpenThread (OTBR) do Google phát hành là một bản triển khai nguồn mở của Bộ định tuyến đường viền luồng.

NAT64

NAT64 là một cơ chế cho phép máy chủ trong mạng chỉ IPv6 truy cập tài nguyên trong mạng IPv4. Cổng NAT64 là một bộ chuyển đổi giữa giao thức IPv4 và giao thức IPv6.

Bộ dịch NAT64, là một phần của OpenThread Border Router, 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 đường viền OpenThread và thiết bị Thread, sau đó bật và xác minh hoạt động giao tiếp giữa thiết bị Thread và máy chủ IPv4 trên Internet thông qua Bộ định tuyến đường viền OpenThread.

Kiến thức bạn sẽ học được

  • Cách xây dựng Bộ định tuyến đường biên OpenThread bằng các tính năng NAT64.
  • Cách giao tiếp với máy chủ IPv4 từ thiết bị cuối Thread.

Bạn cần có

  • Một máy trạm Linux, để xây dựng và cài đặt ROM Thread NCP, OpenThread CLI và kiểm tra kết nối IPv4.
  • Raspberry Pi 4 có RAM 4GB cho bộ định tuyến biên Thread. Máy trạm Linux của bạn có thể truy cập được qua IPv4 từ thiết bị này.
  • 2 Bảng bán dẫn Bắc Âu nRF52840 DK.

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 đường viền OpenThread

Làm theo bước Thiết lập OTBR của Bộ định tuyến đường viền luồng – Lớp học lập trình về kết nối IPv6 hai chiều và khám phá dịch vụ dựa trên DNS để tạo bộ định tuyến biên OpenThread, với thay đổi sau:

Trong phần Build and settings OTBR (Tạo và cài đặt OTBR), bạn cần yêu cầu tập lệnh bật trình dịch NAT64 trong OpenThread bằng cách đặt biến môi trường NAT64 thành 1NAT64_SERVICE thành openthread. Chạy lệnh sau đây trước bước thực hiện:

$ export NAT64=1 NAT64_SERVICE=openthread

Tiếp tục với lớp học lập trình Bộ định tuyến đường viền luồng – Kết nối IPv6 hai chiều và Khám phá dịch vụ dựa trên DNS như đã viết. Sau khi Tạo mạng Thread, bạn có thể xác minh rằng bộ định tuyến biên giới đang xuất bản tiền tố NAT64 bằng các lệnh OpenThread CLI.

Trước tiên, hãy đảm bảo bạn đã thiết lập và chạy bộ định tuyến biên, đồng thời bật NAT64 trên bộ định tuyến biên:

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done

Chúng ta có thể thấy rằng OTBR đang đóng vai trò là trưởng nhóm Thread và có tiền tố NAT64 (trong trường hợp của chúng ta là fd4c:9574:3720:2:0:0::/96) trong Dữ liệu mạng Thread:

$ 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

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ị cuối Thread

Làm theo bước Thiết lập FTD của lớp học lập trình Xây dựng mạng Thread bằng các bảng nRF52840 và OpenThread để tạo và cài đặt ROM thiết bị cuối nRF52840 CLI, thay đổi như bước sau:

Trong Build and flash, 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Tiếp tục nội dung Xây dựng 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 hình ảnh CLI, hãy làm theo hướng dẫn Bộ định tuyến đường viền luồng – Kết nối IPv6 hai chiều và Khám phá dịch vụ dựa trên DNS để thiết lập thiết bị đầu cuối Thread.

Hãy đợi vài giây sau khi thiết lập thiết bị cuối Thread và kiểm tra xem việc tham gia mạng Thread này có thành công hay không. Bạn sẽ có thể tìm thấy tiền tố NAT64 từ dữ liệu mạng (trong trường hợp của chúng ta là 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

Đả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ị cuối Thread

Bây giờ, bạn có thể giao tiếp với các 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 lặp lại ICMP đến máy chủ IPv4

Tại CLI của thiết bị đầu cuối Thread:

> 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

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:

$ 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 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 lệnh 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: fd4c:9574:3720:2:0:0:808:808
DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 
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à các 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ủ IPv4 Linux, sử dụng nc để theo dõi các kết nối TCP:

$ nc -l 0.0.0.0 12345

Từ thiết bị cuối Thread của bạn, hãy thiết lập 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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> tcp send hello

Đầu ra của máy chủ Linux IPv4:

hello

Bạn cũng có thể gửi tin nhắn từ máy chủ IPv4 Linux đến thiết bị cuối Thread. Nhập "thế giới" và nhấn Enter trên máy chủ Linux IPv4 đang chạy nc và kết quả xuất ra của thiết bị cuối Thread:

TCP: Received 6 bytes: world

Giao tiếp qua UDP

Bạn có thể giao tiếp bằng UDP giữa thiết bị Thread 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.

Sử dụng nc để theo dõi kết nối UDP:

$ nc -u -l 0.0.0.0 12345

Trên thiết bị cuối Thread, hãy thiết lập kết nối UDP và gửi thông báo đến máy chủ lưu trữ 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

Đầu ra của máy chủ Linux IPv4:

hello

Bạn cũng có thể gửi tin nhắn từ máy chủ IPv4 Linux đến thiết bị cuối Thread. Nhập "thế giới" và nhấn Enter trên máy chủ Linux IPv4 đang chạy nc và kết quả xuất ra của thiết bị cuối Thread:

6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world

5. Bật/tắt NAT64 trên Bộ định tuyến đường viền

Bạn có thể bật hoặc tắt NAT64 bất cứ lúc nào bạn muốn. Dùng nat64 disable để tắt NAT64. Và sử dụng nat64 state để kiểm tra trạng thái của NAT64.

$ sudo ot-ctl nat64 disable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

Sau khi tắt, thiết bị không còn xuất bản tiền tố NAT64 nữa:

$ 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

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 qua bộ định tuyến biên này nữa.

Tại CLI của thiết bị đầu 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 chú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:

$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

Sau vài giây, các thành phần NAT64 sẽ được thiết lập và chạy:

$ 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

Lưu ý rằng việc tắt NAT64 sẽ xoá bảng liên kết:

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | 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 của miền Internet đến các máy chủ DNS ngược dòng.

Máy chủ DNS-SD nội bộ hỗ trợ hàm này nên bạn cần đảm bảo đã bật máy chủ DNS-SD.

$ sudo ot-ctl srp server state
running
Done

Nếu mã này không phải là running, hãy bật chế độ này:

$ sudo ot-ctl srp server enable
Done

Đảm bảo bạn đã bật proxy DNS ngược dòng:

$ sudo ot-ctl dns server upstream
Enabled
Done

Nếu mã này không phải là Enabled, hãy bật chế độ này:

$ sudo ot-ctl dns server upstream enable
Done

Trên thiết bị cuối, hãy đảm bảo ứng dụng SRP đã được bật để ứng dụng này sẽ gửi các truy vấn DNS đến bộ định tuyến biên:

> srp client state
Enabled
Done

Nếu mã này không phải là Enabled, hãy bật chế độ này:

> srp client autostart enable
Done

Trên thiết bị cuối của bạn, hãy đảm bảo máy chủ DNS mặc định là bộ định tuyến biên:

> dns config
Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
Done

Địa chỉ IPv6 của máy chủ (fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf trong ví dụ trên), phải là một trong các địa chỉ của Bộ định tuyến đường viền OpenThread.

Giờ đây, bạn có thể gửi các 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. - 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. Xin chúc mừng

Xin chúc mừng, bạn đã thiết lập thành công 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ị đầu cuối Thread!

Tài liệu đọc thêm

Tài liệu tham khảo