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

1. บทนำ

7299534792dd9439.png

Thread คืออะไร

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

OpenThread คืออะไร

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

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

OpenThread Border Router (OTBR) ที่ Google เปิดตัวเป็นโอเพนซอร์สสำหรับ Thread Border Router

NAT64

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

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

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

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

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

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

สิ่งที่ต้องมี

  • เวิร์กสเตชันของ Linux สำหรับการสร้างและแฟลช Thread NCP, OpenThread CLI และการทดสอบการเชื่อมต่อ IPv4
  • Raspberry Pi 4 พร้อม RAM 4 GB สำหรับ Border Router เทรด เวิร์กสเตชันของ Linux ของคุณควรเข้าถึงได้ผ่าน IPv4 จากอุปกรณ์เครื่องนี้
  • Nordic เซมิคอนดักเตอร์ nRF52840 DK 2 แผ่น

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

c3cd2e081bc052fd.png

2. ตั้งค่า Border Router ของ OpenThread

ทำตามขั้นตอนตั้งค่า OTBR ของ Thread Border Router - Bidirectional IPv6 Connectivity และ DNS-Based Service Discovery Codelab เพื่อสร้าง Border Router ของ OpenThread โดยมีการเปลี่ยนแปลงต่อไปนี้

ในสร้างและติดตั้ง OTBR คุณต้องบอกสคริปต์ให้เปิดใช้เครื่องมือแปล NAT64 ใน OpenThread โดยการตั้งค่าตัวแปรสภาพแวดล้อม NAT64 เป็น 1 และ NAT64_SERVICE เป็น openthread เรียกใช้คำสั่งต่อไปนี้ก่อนขั้นตอน

$ export NAT64=1 NAT64_SERVICE=openthread

ดำเนินการต่อด้วย Codelab ของ Thread Border Router - Bidirectional IPv6 Connectivity and DNS-Based Service Discovery ตามที่เขียนไว้ หลังจากสร้างเครือข่ายเทรดแล้ว คุณสามารถยืนยันได้ว่า Border Router กำลังเผยแพร่คำนำหน้า NAT64 ด้วยคำสั่ง OpenThread CLI

ก่อนอื่น ให้ตรวจสอบว่า Border Router เปิดอยู่และมีการเปิดใช้ NAT64 ใน Border Router โดยทำดังนี้

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done

เราควรจะเห็นว่า OTBR ทำหน้าที่เป็นผู้นำเทรด และมีคำนำหน้า NAT64 (fd4c:9574:3720:2:0:0::/96ในกรณีของเรา) ในข้อมูลเครือข่ายเทรด

$ 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

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

3. ตั้งค่าอุปกรณ์สิ้นสุดเทรด

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

ใน Build and Flash คุณต้องเพิ่ม -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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

ดำเนินการต่อด้วย Build a Thread network with nRF52840 boards and OpenThread codelab ตามที่เขียนไว้ หลังจากอุปกรณ์ปลายทางกะพริบด้วยอิมเมจ CLI ให้ทำตาม Thread Border Router - การเชื่อมต่อ IPv6 แบบสองทิศทางและ DNS-Based Service Discovery เพื่อตั้งค่าอุปกรณ์ปลายทางเทรด

รอสักครู่หลังจากตั้งค่าอุปกรณ์ปลายทางของเทรด แล้วตรวจสอบว่าเข้าร่วมเครือข่ายเทรดสำเร็จหรือไม่ คุณควรเห็นคำนำหน้า NAT64 จากข้อมูลเครือข่าย (ในกรณีของเรา 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

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

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

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

ส่งคำขอเสียงสะท้อน ICMP ไปยังโฮสต์ IPv4

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

> 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

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

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

ส่งคำขอ DNS ไปยังเซิร์ฟเวอร์ DNS แบบ IPv4

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

สื่อสารผ่าน 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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> tcp send hello

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

hello

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

TCP: Received 6 bytes: world

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

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

สมมติว่าที่อยู่ 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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> udp send hello
Done

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

hello

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

6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world

5. เปิด/ปิด NAT64 บน Border Router

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

$ sudo ot-ctl nat64 disable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

หลังจากปิดใช้แล้ว อุปกรณ์จะไม่เผยแพร่คำนำหน้า NAT64 อีกต่อไป

$ 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

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

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

> ping 8.8.8.8
Error 13: InvalidState

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

$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

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

$ 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

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

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
Done

6. ส่งต่อคำขอ DNS ไปยังเซิร์ฟเวอร์ DNS อัปสตรีม

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

เซิร์ฟเวอร์ DNS-SD ภายในรองรับฟังก์ชันนี้ ดังนั้นคุณต้องตรวจสอบว่าเซิร์ฟเวอร์ DNS-SD เปิดใช้อยู่

$ sudo ot-ctl srp server state
running
Done

หากไม่ใช่ running ให้เปิดใช้ตามขั้นตอนต่อไปนี้

$ sudo ot-ctl srp server enable
Done

ตรวจสอบว่าได้เปิดใช้พร็อกซี DNS ต้นทางแล้ว

$ sudo ot-ctl dns server upstream
Enabled
Done

หากไม่ใช่ Enabled ให้เปิดใช้ตามขั้นตอนต่อไปนี้

$ sudo ot-ctl dns server upstream enable
Done

ในอุปกรณ์ปลายทาง ให้ตรวจสอบว่าไคลเอ็นต์ SRP เปิดใช้อยู่เพื่อให้ส่งคำขอ DNS ไปยัง Border Router โดยทำดังนี้

> srp client state
Enabled
Done

หากไม่ใช่ Enabled ให้เปิดใช้ตามขั้นตอนต่อไปนี้

> srp client autostart enable
Done

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

> dns config
Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
Done

ที่อยู่ IPv6 ของเซิร์ฟเวอร์ (fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf ในตัวอย่างข้างต้น) ควรเป็นหนึ่งในที่อยู่ของ Border Router ของ OpenThread

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

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

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

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

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