Thread Border Router - دسترسی به اینترنت را از طریق NAT64 فراهم می کند

1. معرفی

7299534792dd9439.png

Thread چیست؟

Thread یک پروتکل شبکه بی سیم کم مصرف مبتنی بر IP است که ارتباطات دستگاه به دستگاه و دستگاه به ابر را ایمن می کند. شبکه های نخ می توانند با تغییرات توپولوژی سازگار شوند تا از خرابی های تک نقطه ای جلوگیری کنند.

OpenThread چیست؟

OpenThread منتشر شده توسط Google یک پیاده سازی متن باز Thread® است.

روتر مرزی OpenThread چیست؟

روتر مرزی OpenThread (OTBR) منتشر شده توسط گوگل یک پیاده سازی متن باز از Thread Border Router است.

NAT64

NAT64 مکانیزمی است که میزبان ها را در شبکه های فقط IPv6 قادر می سازد به منابع در شبکه های IPv4 دسترسی داشته باشند. دروازه NAT64 یک مترجم بین پروتکل های IPv4 و پروتکل های IPv6 است.

مترجم NAT64، به عنوان بخشی از OpenThread Border Router، از ترجمه پروتکل های TCP، UDP و ICMP (ICMPv6) پشتیبانی می کند.

چیزی که خواهی ساخت

در این کد لبه، می‌خواهید یک مسیریاب مرزی OpenThread و یک دستگاه Thread راه‌اندازی کنید، سپس ارتباط بین دستگاه‌های Thread و میزبان‌های IPv4 را در اینترنت از طریق OpenThread Border Router فعال و تأیید کنید.

چیزی که یاد خواهید گرفت

  • چگونه یک روتر مرزی OpenThread با ویژگی های NAT64 بسازیم.
  • نحوه ارتباط با میزبان های IPv4 از دستگاه های Thread end.

آنچه شما نیاز دارید

  • یک ایستگاه کاری لینوکس، برای ساخت و فلش کردن Thread NCP، OpenThread CLI و آزمایش اتصال IPv4.
  • Raspberry Pi 4 با 4 گیگابایت رم برای روتر مرزی Thread. ایستگاه کاری لینوکس شما باید از طریق IPv4 از این دستگاه قابل دسترسی باشد.
  • 2 برد Nordic Semiconductor nRF52840 DK.

توپولوژی شبکه برای این کد لبه:

c3cd2e081bc052fd.png

2. روتر مرزی OpenThread را راه اندازی کنید

برای ساخت روتر مرزی OpenThread با تغییر زیر ، مرحله Setup OTBR را در Thread Border Router - اتصال IPv6 دوطرفه و کد آزمایشگاه مبتنی بر DNS Service Discovery دنبال کنید:

در ساخت و نصب OTBR ، باید به اسکریپت بگویید که مترجم NAT64 را در OpenThread با تنظیم متغیر محیطی NAT64 روی 1 و NAT64_SERVICE روی openthread فعال کند. قبل از مرحله دستور زیر را اجرا کنید:

$ export NAT64=1 NAT64_SERVICE=openthread

همانطور که نوشته شده است، با Thread Border Router - اتصال IPv6 دوطرفه و کدهای DNS-Based Service Discovery ادامه دهید. پس از تشکیل شبکه موضوع ، می توانید تأیید کنید که روتر مرزی یک پیشوند NAT64 را با دستورات OpenThread CLI منتشر می کند.

ابتدا، مطمئن شوید که روتر مرزی ما فعال است و NAT64 در روتر مرزی فعال است:

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

ما باید بتوانیم ببینیم که OTBR به عنوان رهبر Thread عمل می کند و یک پیشوند NAT64 ( fd4c:9574:3720:2:0:0::/96 در مورد ما) در Thread Network Data وجود دارد:

$ 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 توسط دستگاه های Thread هنگام برقراری ارتباط با میزبان IPv4 استفاده می شود.

3. دستگاه پایان موضوع را راه اندازی کنید

برای ساختن و فلش کردن یک دستگاه انتهایی nRF52840 CLI، با تغییر به مرحله زیر ، مرحله Set up the FTDs از شبکه Build a Thread را با بردهای nRF52840 و Codelab OpenThread دنبال کنید:

در Build و Flash ، هنگام فراخوانی script/build باید -DOT_DNS_CLIENT=ON ، -DOT_SRP_CLIENT=ON و -DOT_ECDSA=ON را به خط فرمان اضافه کنید:

$ 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 را با بردهای nRF52840 و کد OpenThread ادامه دهید. پس از اینکه دستگاه نهایی با تصویر CLI فلش شد، Thread Border Router - Bidirectional IPv6 Connectivity and DNS-Based Service Discovery را دنبال کنید تا دستگاه پایان Thread را راه اندازی کنید.

پس از راه اندازی دستگاه پایان موضوع، چند ثانیه صبر کنید و بررسی کنید که آیا پیوستن به شبکه Thread موفقیت آمیز است یا خیر. شما باید بتوانید پیشوند 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 از دستگاه پایان Thread ارتباط برقرار کنید

اکنون می‌توانید با میزبان‌های شبکه 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

روتر مرزی با دستور nat64 mappings یک آیتم نقشه برداری NAT64 برای این دستگاه ایجاد می کند:

$ 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 شما باشد.

هر زمان که بخواهید این دستور را روی روتر مرزی اجرا کنید تا ببینید چگونه ترافیک را محاسبه می کند.

پرس و جوهای DNS را به سرورهای DNS IPv4 ارسال کنید

برای حل یک نام میزبان در شبکه IPv4 dns resolve4 استفاده کنید. آدرس سرور 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 لینوکس شما 192.168.0.2 است.

در میزبان IPv4 لینوکس خود، از nc برای گوش دادن به اتصالات TCP استفاده کنید:

$ nc -l 0.0.0.0 12345

از دستگاه Thread end خود، یک اتصال TCP ایجاد کنید و پیام هایی را به میزبان لینوکس IPv4 خود ارسال کنید:

> 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 لینوکس شما:

hello

همچنین می‌توانید از میزبان IPv4 لینوکس خود به دستگاه پایان Thread پیام ارسال کنید. "world" را تایپ کنید و روی میزبان IPv4 لینوکس خود که nc اجرا می کند و خروجی های دستگاه Thread end خود را فشار دهید:

TCP: Received 6 bytes: world

از طریق UDP ارتباط برقرار کنید

امکان برقراری ارتباط با استفاده از UDP بین دستگاه های Thread و هاست در شبکه IPv4 وجود دارد.

فرض کنید آدرس IP میزبان IPv4 لینوکس شما 192.168.0.2 است.

از nc برای گوش دادن به اتصالات UDP استفاده کنید:

$ nc -u -l 0.0.0.0 12345

از دستگاه پایان Thread خود، یک اتصال UDP ایجاد کنید و پیام هایی را به میزبان IPv4 لینوکس خود ارسال کنید:

> 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 لینوکس شما:

hello

همچنین می‌توانید از میزبان IPv4 لینوکس خود به دستگاه پایان Thread پیام ارسال کنید. "world" را تایپ کنید و روی میزبان IPv4 لینوکس خود که nc اجرا می کند و خروجی های دستگاه Thread end خود را فشار دهید:

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

5. NAT64 را روی Border Router روشن کنید

هر زمان که بخواهید می توانید NAT64 را فعال یا غیرفعال کنید. برای غیرفعال کردن NAT64 nat64 disable استفاده کنید. و 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

همچنین دستگاه های موجود در شبکه Thread دیگر نمی توانند از طریق این روتر مرزی به میزبان IPv4 دسترسی داشته باشند.

از CLI دستگاه پایان موضوع ما:

> ping 8.8.8.8
Error 13: InvalidState

برای فعال کردن NAT64 nat64 enable استفاده کنید. ممکن است مدتی طول بکشد تا مدیر پیشوند شروع به تبلیغ پیشوند NAT64 کند:

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

پس از چند ثانیه، اجزای 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 در روتر مرزی فعال است، 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 را به روتر مرزی ارسال می‌کند:

> srp client state
Enabled
Done

اگر Enabled نیست، آن را فعال کنید:

> srp client autostart enable
Done

در دستگاه نهایی خود، مطمئن شوید که سرور DNS پیش‌فرض روتر مرزی است:

> 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 در مثال بالا)، باید یکی از آدرس‌های روتر مرزی 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. تبریک می گویم

تبریک می‌گوییم، شما با موفقیت یک روتر مرزی را با پشتیبانی NAT64 راه‌اندازی کردید و از آن برای دسترسی به اینترنت به دستگاه‌های پایانی Thread استفاده کردید!

بیشتر خواندن

اسناد مرجع