Bộ định tuyến biên luồng – Cung cấp quyền truy cập Internet qua NAT64

1. Giới thiệu

7299534792dd9439.png.

Chuỗi là gì?

Thread là giao thức nối 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à thiết bị với đám mây. Mạng luồng có thể thích ứng với sự thay đổi của 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à 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 phương thức 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 các máy chủ trong mạng chỉ IPv6 truy cập 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, 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 giao tiếp giữa các thiết bị Thread và máy chủ IPv4 trên Internet thông qua OpenThread Border Router.

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

  • Cách xây dựng Bộ định tuyến đường viền OpenThread với các tính năng NAT64.
  • Cách giao tiếp với máy chủ IPv4 từ thiết bị đầu cuối của luồng.

Bạn cần có

  • Một máy trạm Linux, để xây dựng và cài đặt ROM NCP, Thread OpenLI, và kiểm tra kết nối IPv4.
  • Raspberry Pi 4 với RAM 4GB cho bộ định tuyến biên Thread. Máy trạm Linux phải 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 khám phá dịch vụ dựa trên DNS và định hướng IPv6 để tạo bộ định tuyến biên OpenThread, với thay đổi sau:

Trong Tạo và cài đặt OTBR, bạn cần phải cho 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 trước bước:

$ export NAT64=1 NAT64_SERVICE=openthread

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

Trước tiên, hãy đảm bảo bộ định tuyến biên đã được thiết lập và đang chạy, đồng thời, bạn đã 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 hoạt động như một biến dẫn đầu của Luồng và có tiền tố NAT64 (trong trường hợp này là fd4c:9574:3720:2:0:0::/96) trong Dữ liệu mạng luồng:

$ 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ị luồng sử dụng khi giao tiếp với một máy chủ IPv4.

3. Thiết lập thiết bị kết thúc chuỗi

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

Trong Bản dựng và 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 với Tạo mạng lưới luồng bằng bảng nRF52840 và lớp học lập trình OpenThread như đã viết. Sau khi thiết bị cuối nhấp nháy hình ảnh CLI, hãy làm theo Thread Border Router – Khả năng kết nối IPv6 hai chiều và dịch vụ khám phá dựa trên DNS để thiết lập thiết bị cuối trong Thread.

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

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ị cuối mà chúng ta vừa thiết lập.

Gửi yêu cầu lặp lại ICMP tới máy chủ IPv4

Từ CLI của thiết bị kết thúc Thread của chúng ta:

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

Hãy chạy lệnh này trên bộ định tuyến biên bất cứ lúc nào để xem cách nó 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

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ủ IPv4 Linux là 192.168.0.2.

Trên máy chủ IPv4 Linux, hãy 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ị kết thúc Thread của bạn, thiết lập kết nối TCP và gửi thông báo đến máy chủ Linux IPv4 của bạn:

> 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

Máy chủ Linux IPv4 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 tới thiết bị kết thúc Thread. Nhập "thế giới" rồi nhấn Enter trên máy chủ IPv4 Linux đang chạy nc và thiết bị đầu cuối có chuỗi đầu ra của bạn:

TCP: Received 6 bytes: world

Giao tiếp qua UDP

Có thể giao tiếp bằng UDP giữa các thiết bị luồng và máy chủ trong mạng IPv4.

Giả sử địa chỉ IP của máy chủ IPv4 Linux là 192.168.0.2.

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

$ nc -u -l 0.0.0.0 12345

Từ thiết bị kết thúc Thread, 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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> udp send hello
Done

Máy chủ Linux IPv4 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 tới thiết bị kết thúc Thread. Nhập "thế giới" rồi nhấn Enter trên máy chủ IPv4 Linux đang chạy nc và thiết bị đầu cuối có chuỗi đầu ra của bạn:

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 biên

Bạn có thể bật hoặc tắt NAT64 bất kỳ 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.

$ 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 phát hành 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 máy chủ IPv4 qua bộ định tuyến biên này.

Từ CLI của thiết bị kết thúc Thread của chúng ta:

> 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ẽ xóa 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 ngược

Khi bạn bật NAT64 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 trên Internet đến các máy chủ DNS ngược tuyến.

Chức năng này được máy chủ DNS-SD nội bộ hỗ trợ, vì vậy, bạn cần đảm bảo máy chủ DNS-SD được bật.

$ sudo ot-ctl srp server state
running
Done

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

$ sudo ot-ctl srp server enable
Done

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

$ sudo ot-ctl dns server upstream
Enabled
Done

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

$ sudo ot-ctl dns server upstream enable
Done

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

> srp client state
Enabled
Done

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

> srp client autostart enable
Done

Trên thiết bị cuối, hãy đảm bảo rằng 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 OpenThread Border Router.

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. - 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 với tính năng hỗ trợ NAT64 và sử dụng bộ định tuyến đó để cấp quyền truy cập Internet cho các thiết bị kết thúc Thread!

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

Tài liệu tham khảo