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

1. บทนำ

7299534792dd9439.png

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 นี้

c3cd2e081bc052fd.png

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 เข้าถึงอินเทอร์เน็ตได้เรียบร้อยแล้ว

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

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