1. Giới thiệu
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:
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 1
và NAT64_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
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_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
- 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 ngược dòng
- Tóm tắt nền tảng OpenThread cho DNS