Thread Border Router - ให้การเข้าถึงอินเทอร์เน็ตผ่าน NAT64

เกี่ยวกับ Codelab นี้
schedule23 นาที
subjectอัปเดตล่าสุดเมื่อ 5 พฤษภาคม 2568
account_circleเขียนโดย Song Guo, Jonathan Hui

1. บทนำ

7299534792dd9439.png

Thread คืออะไร

Thread เป็นโปรโตคอลเครือข่ายที่ทำงานร่วมกันแบบไร้สายและใช้พลังงานต่ำซึ่งอิงตาม IP ที่ช่วยให้การติดต่อระหว่างอุปกรณ์กับอุปกรณ์และอุปกรณ์กับระบบคลาวด์เป็นไปอย่างปลอดภัย เครือข่ายเทรดสามารถปรับตัวตามการเปลี่ยนแปลงของโทโปโลยีเพื่อหลีกเลี่ยงจุดที่เกิดความล้มเหลว

OpenThread คืออะไร

OpenThread ที่ Google เปิดตัวเป็นการใช้งาน Thread® แบบโอเพนซอร์ส

Border Router ของ OpenThread คืออะไร

OpenThread Border Router (OTBR) ที่ Google เปิดตัวเป็นการใช้งาน Border Router แบบเทรดที่เป็นโอเพนซอร์ส

NAT64

NAT64 เป็นกลไกที่ช่วยให้โฮสต์ในเครือข่าย IPv6 เท่านั้นเข้าถึงทรัพยากรในเครือข่าย IPv4 ได้ เกตเวย์ NAT64 เป็นตัวแปลระหว่างโปรโตคอล IPv4 กับโปรโตคอล IPv6

ตัวแปล NAT64 ซึ่งเป็นส่วนหนึ่งของ Border Router ของ OpenThread รองรับการแปลโปรโตคอล TCP, UDP และ ICMP (ICMPv6)

สิ่งที่คุณจะสร้าง

ในโค้ดแล็บนี้ คุณจะต้องตั้งค่า OpenThread Border Router (OTBR) และอุปกรณ์เทรด จากนั้นเปิดใช้และยืนยันการสื่อสารระหว่างอุปกรณ์เทรดกับโฮสต์ IPv4 บนอินเทอร์เน็ตผ่าน OpenThread Border Router

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้าง OpenThread Border Router ที่มีฟีเจอร์ NAT64
  • วิธีสื่อสารกับโฮสต์ IPv4 จากอุปกรณ์ปลายทางเทรด

สิ่งที่คุณต้องมี

  • เวิร์กสเตชัน Linux สำหรับการสร้างและแฟลช Thread RCP, OpenThread CLI และการทดสอบการเชื่อมต่อ IPv4
  • Raspberry Pi สำหรับ Border Router แบบเทรด เวิร์กสเตชัน Linux ควรเข้าถึงได้ผ่าน IPv4 จากอุปกรณ์นี้
  • ดองเกิล USB nRF52840 ของ Nordic Semiconductor 2 ตัว (1 ตัวสำหรับ RCP และ 1 ตัวสำหรับอุปกรณ์ปลายทางแบบเทรด)

โทโพโลยีเครือข่ายสําหรับ Codelab นี้

c3cd2e081bc052fd.png

2. ตั้งค่า Border Router ที่ใช้ OpenThread

วิธีที่เร็วที่สุดในการตั้งค่า OTBR คือทำตามคู่มือการตั้งค่า OTBR

หลังจากตั้งค่า OTBR เสร็จแล้ว ให้ใช้ ot-ctl เพื่อตรวจสอบว่าเปิดใช้บริการ NAT64 ใน Border Router แล้ว

> nat64 state
PrefixManager: Active
Translator: Active
Done

Border Router แบบเทรดจะเผยแพร่คำนำหน้า NAT64 ในข้อมูลเครือข่ายเทรด ดังนี้

> 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

โดยระบบจะแสดงคำนำหน้า NAT64 เป็นรายการเส้นทางที่มี Flag n ในตัวอย่างข้างต้น fd16:a3d:e170:2:0:0::/96 คือคำนำหน้า NAT64

อุปกรณ์เทรดจะใช้คำนำหน้า NAT64 เมื่อสื่อสารกับโฮสต์ IPv4

3. ตั้งค่าอุปกรณ์ปลายทางเทรด

ทำตามขั้นตอนการสร้าง FTD ของการสร้างเครือข่ายเทรดด้วยบอร์ด nRF52840 และ OpenThread Codelab เพื่อสร้างและแฟลชอุปกรณ์ปลายทาง CLI ของ nRF52840 โดยทำการเปลี่ยนแปลงขั้นตอนต่อไปนี้

ในสร้างและแฟลช คุณต้องเพิ่ม -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON และ -DOT_ECDSA=ON ต่อท้ายบรรทัดคำสั่งเมื่อเรียกใช้ 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

ดำเนินการต่อด้วยสร้างเครือข่ายเทรดด้วยบอร์ด nRF52840 และ OpenThread Codelab ตามที่เขียนไว้ หลังจากแฟลชอุปกรณ์ปลายทางด้วยอิมเมจ CLI แล้ว ให้ทำตามหัวข้อเข้าร่วมโหนดที่ 2 กับเครือข่ายเทรดเพื่อเพิ่มอุปกรณ์เทรดลงในเครือข่ายเทรด

รอ 2-3 วินาทีหลังจากตั้งค่าอุปกรณ์ปลายทางเทรด และตรวจสอบว่าการเข้าร่วมเครือข่ายเทรดสำเร็จหรือไม่ ดังที่กล่าวไว้ข้างต้น คุณสามารถดูคำนำหน้า NAT64 ที่เผยแพร่ในข้อมูลเครือข่ายเทรด

> 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

ตรวจสอบว่าข้อมูลเครือข่ายตรงกับข้อมูลจาก OTBR

4. สื่อสารกับโฮสต์ IPv4 จากอุปกรณ์ปลายทางเทรด

ตอนนี้คุณสื่อสารกับโฮสต์ในเครือข่าย IPv4 จากอุปกรณ์ปลายทางที่เราเพิ่งตั้งค่าได้แล้ว

ส่งคำขอ ICMP Echo ไปยังโฮสต์ IPv4

จาก CLI ของอุปกรณ์ปลายทางเทรด ให้ทำดังนี้

> 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

Border Router สร้างรายการการแมป NAT64 สําหรับอุปกรณ์นี้ด้วยคําสั่ง 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 ควรเป็นที่อยู่ IPv6 ของอุปกรณ์เทรด

เรียกใช้คําสั่งนี้ใน Border Router ได้ทุกเมื่อเพื่อดูวิธีนับการเข้าชม

ส่งคำขอ DNS ไปยังเซิร์ฟเวอร์ DNS ที่ใช้ IPv4

ใช้ dns resolve4 เพื่อแก้ไขชื่อโฮสต์ในเครือข่าย IPv4 ที่อยู่เซิร์ฟเวอร์ DNS อาจเป็นที่อยู่ 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

สื่อสารผ่าน TCP

การเชื่อมต่อ TCP ระหว่างอุปกรณ์ปลายทางกับโฮสต์ในเครือข่าย IPv4 นั้นเป็นไปได้

สมมติว่าที่อยู่ IP ของโฮสต์ IPv4 ของ Linux คือ 192.168.0.2

ในโฮสต์ IPv4 ของ Linux ให้ใช้ nc เพื่อรอรับการเชื่อมต่อ TCP โดยทำดังนี้

$ nc -l 0.0.0.0 12345

จากอุปกรณ์ปลายทางเทรด ให้สร้างการเชื่อมต่อ TCP และส่งข้อความไปยังโฮสต์ 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

เอาต์พุตของโฮสต์ IPv4 ของ Linux

hello

นอกจากนี้ คุณยังส่งข้อความจากโฮสต์ IPv4 ของ Linux ไปยังอุปกรณ์ปลายทางเทรดได้อีกด้วย พิมพ์ "world" แล้วกด Enter ในโฮสต์ IPv4 ของ Linux ที่ใช้ nc และอุปกรณ์ปลายทางเทรดจะแสดงผลดังนี้

TCP: Received 6 bytes: world

สื่อสารผ่าน UDP

อุปกรณ์ Thread และโฮสต์ในเครือข่าย IPv4 สามารถสื่อสารกันโดยใช้ UDP ได้

สมมติว่าที่อยู่ IP ของโฮสต์ IPv4 ของ Linux คือ 192.168.0.2

ใช้ nc เพื่อรอการเชื่อมต่อ UDP โดยทำดังนี้

$ nc -u -l 0.0.0.0 12345

จากอุปกรณ์ปลายทางเทรด โปรดสร้างการเชื่อมต่อ UDP และส่งข้อความไปยังโฮสต์ IPv4 ของ Linux โดยทำดังนี้

> 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

เอาต์พุตของโฮสต์ IPv4 ของ Linux

hello

นอกจากนี้ คุณยังส่งข้อความจากโฮสต์ IPv4 ของ Linux ไปยังอุปกรณ์ปลายทางเทรดได้อีกด้วย พิมพ์ "world" แล้วกด Enter ในโฮสต์ IPv4 ของ Linux ที่ใช้ nc และอุปกรณ์ปลายทางเทรดจะแสดงผลดังนี้

6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world

5. สลับ NAT64 ใน Border Router

คุณเปิดหรือปิดใช้ NAT64 ได้ทุกเมื่อที่ต้องการ ใช้ nat64 disable เพื่อปิดใช้ NAT64 และใช้ nat64 state เพื่อตรวจสอบสถานะของ NAT64

> nat64 disable
Done
> nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

หลังจากปิดใช้แล้ว อุปกรณ์จะไม่เผยแพร่คำนำหน้า 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

นอกจากนี้ อุปกรณ์ในเครือข่ายเทรดจะเข้าถึงโฮสต์ IPv4 ผ่าน Border Router นี้ไม่ได้อีกต่อไป

จาก CLI ของอุปกรณ์ปลายทางเทรด ให้ทำดังนี้

> ping 8.8.8.8
Error 13: InvalidState

ใช้ nat64 enable เพื่อเปิดใช้ NAT64 ระบบอาจใช้เวลาสักครู่ก่อนที่เครื่องมือจัดการคำนำหน้าจะเริ่มโฆษณาคำนำหน้า NAT64

> nat64 enable
Done
> nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

หลังจากผ่านไป 2-3 วินาที คอมโพเนนต์ NAT64 ควรพร้อมใช้งาน

> 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

โปรดทราบว่าการปิดใช้ NAT64 จะล้างตารางการแมป ดังนี้

> 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. ส่งต่อคำขอ DNS ไปยังเซิร์ฟเวอร์ DNS ต้นทาง

เมื่อเปิดใช้ NAT64 ใน Border Router แล้ว OpenThread จะพยายามส่งต่อคำขอ DNS สำหรับโดเมนอินเทอร์เน็ตไปยังเซิร์ฟเวอร์ DNS ต้นทาง

ในอุปกรณ์ปลายทาง ให้ตรวจสอบว่าเซิร์ฟเวอร์ DNS เริ่มต้นคือ Border Router

> 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

ที่อยู่ IPv6 ของเซิร์ฟเวอร์ (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d ในตัวอย่างด้านบน) ควรเป็นหนึ่งในที่อยู่ของ Border Router ของ OpenThread

ตอนนี้คุณสามารถส่งคำขอ DNS สำหรับโดเมนอินเทอร์เน็ตจากอุปกรณ์ปลายทางได้แล้ว โดยทำดังนี้

> 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. ขอแสดงความยินดี

ขอแสดงความยินดี คุณได้ตั้งค่า Border Router ที่รองรับ NAT64 และใช้งานเพื่อมอบสิทธิ์เข้าถึงอินเทอร์เน็ตแก่อุปกรณ์ปลายทาง Thread เรียบร้อยแล้ว

อ่านเพิ่มเติม

เอกสารอ้างอิง