1. บทนำ

Thread คืออะไร
Thread เป็นโปรโตคอลเครือข่าย Mesh ไร้สายแบบใช้พลังงานต่ำที่อิงตาม IP ซึ่งช่วยให้การสื่อสารระหว่างอุปกรณ์กับอุปกรณ์และอุปกรณ์กับระบบคลาวด์เป็นไปอย่างปลอดภัย เครือข่าย Thread สามารถปรับให้เข้ากับการเปลี่ยนแปลงโทโพโลยีเพื่อหลีกเลี่ยงจุดเดียวที่ทำให้เกิดข้อผิดพลาด
OpenThread คืออะไร
OpenThread ที่ Google เปิดตัวเป็นการใช้งาน Thread® แบบโอเพนซอร์ส
OpenThread Border Router คืออะไร
OpenThread Border Router (OTBR) ที่ Google เปิดตัวเป็นการติดตั้งใช้งาน Thread Border Router แบบโอเพนซอร์ส
NAT64
NAT64 เป็นกลไกที่ช่วยให้โฮสต์ในเครือข่าย IPv6 เท่านั้นเข้าถึงทรัพยากรในเครือข่าย IPv4 ได้ เกตเวย์ NAT64 เป็นตัวแปลระหว่างโปรโตคอล IPv4 กับโปรโตคอล IPv6
ตัวแปล NAT64 ซึ่งเป็นส่วนหนึ่งของ OpenThread Border Router รองรับการแปลโปรโตคอล TCP, UDP และ ICMP (ICMPv6)
สิ่งที่คุณจะสร้าง
ในโค้ดแล็บนี้ คุณจะได้ตั้งค่า OpenThread Border Router (OTBR) และอุปกรณ์ Thread จากนั้นเปิดใช้และยืนยันการสื่อสารระหว่างอุปกรณ์ Thread กับโฮสต์ IPv4 บนอินเทอร์เน็ตผ่าน OpenThread Border Router
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้าง OpenThread Border Router ที่มีฟีเจอร์ NAT64
- วิธีสื่อสารกับโฮสต์ IPv4 จากอุปกรณ์ปลายทาง Thread
สิ่งที่คุณต้องมี
- เวิร์กสเตชัน Linux สำหรับสร้างและแฟลช Thread RCP, OpenThread CLI และทดสอบการเชื่อมต่อ IPv4
- Raspberry Pi สำหรับ Thread Border Router เวิร์กสเตชัน Linux ควรเข้าถึงได้ผ่าน IPv4 จากอุปกรณ์นี้
- ดองเกิล USB Nordic Semiconductor nRF52840 จำนวน 2 ตัว (1 ตัวสำหรับ RCP และ 1 ตัวสำหรับอุปกรณ์ปลายทาง Thread)
โทโพโลยีเครือข่ายสำหรับ Codelab นี้

2. ตั้งค่า OpenThread Border Router
วิธีที่เร็วที่สุดในการตั้งค่า OTBR คือการทำตามคู่มือการตั้งค่า OTBR
หลังจากตั้งค่า OTBR เสร็จแล้ว ให้ใช้ ot-ctl เพื่อตรวจสอบว่าได้เปิดใช้บริการ NAT64 ใน Border Router แล้ว
> nat64 state PrefixManager: Active Translator: Active Done
Thread Border Router จะเผยแพร่คำนำหน้า NAT64 ในข้อมูลเครือข่าย 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
คำนำหน้า NAT64 จะปรากฏเป็นรายการเส้นทางที่มีแฟล็ก n ในตัวอย่างด้านบน fd16:a3d:e170:2:0:0::/96 คือคำนำหน้า NAT64
อุปกรณ์ Thread จะใช้คำนำหน้า NAT64 เมื่อสื่อสารกับโฮสต์ IPv4
3. ตั้งค่าอุปกรณ์ปลายทางของ Thread
ทำตามขั้นตอนการตั้งค่า FTD ของ Codelab สร้างเครือข่าย Thread ด้วยบอร์ด nRF52840 และ OpenThread เพื่อสร้างและแฟลชอุปกรณ์ปลายทาง 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
ทำตามสร้างเครือข่าย Thread ด้วยบอร์ด nRF52840 และ Codelab ของ OpenThread ตามที่เขียนไว้ หลังจากแฟลชอุปกรณ์ปลายทางด้วยรูปภาพ CLI แล้ว ให้ทำตามเข้าร่วมโหนดที่ 2 ในเครือข่าย Thread เพื่อเพิ่มอุปกรณ์ Thread ลงในเครือข่าย Thread
รอสักครู่หลังจากตั้งค่าอุปกรณ์ปลายทาง Thread แล้วตรวจสอบว่าเข้าร่วมเครือข่าย Thread ได้สำเร็จหรือไม่ คุณสามารถดูคำนำหน้า NAT64 ที่เผยแพร่แล้วได้ในข้อมูลเครือข่าย 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
ตรวจสอบว่าข้อมูลเครือข่ายตรงกับข้อมูลจาก OTBR
4. สื่อสารกับโฮสต์ IPv4 จากอุปกรณ์ปลายทางของ Thread
ตอนนี้คุณสื่อสารกับโฮสต์ในเครือข่าย IPv4 จากอุปกรณ์ปลายทางที่เราเพิ่งตั้งค่าได้แล้ว
ส่งคำขอ ICMP Echo ไปยังโฮสต์ IPv4
จาก CLI ของอุปกรณ์ปลายทาง 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
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 ของอุปกรณ์ Thread
เรียกใช้คำสั่งนี้ในเราเตอร์ชายแดนได้ทุกเมื่อเพื่อดูวิธีนับการเข้าชม
ส่งคำขอ 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 ของโฮสต์ Linux IPv4 คือ 192.168.0.2
ในโฮสต์ IPv4 ของ Linux ให้ใช้ nc เพื่อรอการเชื่อมต่อ TCP
$ nc -l 0.0.0.0 12345
จากอุปกรณ์ปลายทาง Thread ให้สร้างการเชื่อมต่อ TCP และส่งข้อความไปยังโฮสต์ 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
เอาต์พุตของโฮสต์ IPv4 ของ Linux
hello
นอกจากนี้ คุณยังส่งข้อความจากโฮสต์ IPv4 ของ Linux ไปยังอุปกรณ์ปลายทางของ Thread ได้ด้วย พิมพ์ "world" แล้วกด Enter ในโฮสต์ IPv4 ของ Linux ที่ใช้ nc และอุปกรณ์ปลายทาง Thread จะแสดงผลดังนี้
TCP: Received 6 bytes: world
สื่อสารผ่าน UDP
คุณสื่อสารโดยใช้ UDP ระหว่างอุปกรณ์ Thread กับโฮสต์ในเครือข่าย IPv4 ได้
สมมติว่าที่อยู่ IP ของโฮสต์ Linux IPv4 คือ 192.168.0.2
ใช้ nc เพื่อฟังการเชื่อมต่อ UDP
$ nc -u -l 0.0.0.0 12345
สร้างการเชื่อมต่อ UDP และส่งข้อความไปยังโฮสต์ Linux IPv4 จากอุปกรณ์ปลายทาง Thread โดยทำดังนี้
> 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 ไปยังอุปกรณ์ปลายทางของ Thread ได้ด้วย พิมพ์ "world" แล้วกด Enter ในโฮสต์ IPv4 ของ Linux ที่ใช้ nc และอุปกรณ์ปลายทาง Thread จะแสดงผลดังนี้
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
นอกจากนี้ อุปกรณ์ในเครือข่าย Thread จะเข้าถึงโฮสต์ IPv4 ผ่าน Border Router นี้ไม่ได้อีกต่อไป
จาก CLI ของอุปกรณ์ปลายทาง Thread ให้ทำดังนี้
> 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 ในเราเตอร์ชายแดน 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 ในตัวอย่างด้านบน) ควรเป็นที่อยู่ใดที่อยู่หนึ่งของ OpenThread Border Router
ตอนนี้คุณส่งคำค้นหา 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 เข้าถึงอินเทอร์เน็ตได้เรียบร้อยแล้ว
อ่านเพิ่มเติม
- คู่มือ OpenThread
- ข้อมูลอ้างอิงเกี่ยวกับ OpenThread CLI
- เอกสารอ้างอิง OpenThread API สำหรับ NAT64
- เอกสารอ้างอิง OpenThread API สำหรับ DNS ต้นทาง
- การแยกแพลตฟอร์ม OpenThread สำหรับ DNS