1. บทนำ
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 นี้
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 เรียบร้อยแล้ว
อ่านเพิ่มเติม
- คู่มือ OpenThread
- ข้อมูลอ้างอิงเกี่ยวกับ CLI ของ OpenThread
- ข้อมูลอ้างอิง OpenThread API สำหรับ NAT64
- การอ้างอิง OpenThread API สําหรับ DNS ต้นทาง
- การแยกแยะแพลตฟอร์ม OpenThread สำหรับ DNS