پینگ کردن تمام گره های IPv6 در یک کانال

چند روز تا شروع جریان جدید با نرخ باقی مانده است "مهندس شبکه" از OTUS در این راستا، مایلیم ترجمه ای از مطالب مفید در این زمینه را با شما به اشتراک بگذاریم.

پینگ کردن تمام گره های IPv6 در یک کانال

مجموعه ای از پست های وبلاگ در مورد نکات و ترفندهایی برای عیب یابی مشکلات پینگ IPv6 (ICMPv6 Echo Request/Echo Reply)

لطفاً توجه داشته باشید که من از لینوکس (مخصوصاً فدورا 31) استفاده می کنم، با این حال دستور ping برای سایر سیستم عامل ها باید بسیار شبیه باشد.

پینگ کردن تمام گره های IPv6 در یک کانال

اولین و ساده ترین نکته این است که تمام گره های IPv6 را در لینک پینگ کنید.

IPv6 از آدرس های چندپخشی برای همه انواع ارتباطات یک به چند استفاده می کند. هیچ آدرس IPv6 پخش (یا پخش) وجود ندارد. این امر IPv6 را از IPv4 متمایز می کند، جایی که چندین نوع آدرس پخش وجود دارد، به عنوان مثال، آدرس "پخش محدود" 255.255.255.255 [RFC1122].

با این حال، یک آدرس IPv6 "همه گره های چندپخشی" وجود دارد، بنابراین از آن برای پینگ کردن تمام گره های IPv6 در پیوند استفاده می کنیم. (آدرس "پخش" در واقع فقط یک آدرس چندپخشی خاص است که یک گروه چندپخشی است که شامل همه گره ها می شود. توجه داشته باشید که برای مثال، بیت آدرس "گروهی" یا چندپخشی در آدرس های پخش اترنت در لایه پیوند روشن است. ).

آدرس IPv6 چندپخشی همه گره برای کانال: ff02::1. ff نشان دهنده یک آدرس IPv6 چندپخشی است. 0 بعدی بخشی از پرچم با بیت های تنظیم نشده است.

بیشتر 2 مساحت یک گروه چندپخشی را مشخص می کند. برخلاف آدرس‌های IPv4 چندپخشی، آدرس‌های IPv6 چندپخشی دارای یک دامنه هستند. مقدار scope قسمتی از شبکه را نشان می دهد که یک بسته چندپخشی مجاز است از طریق آن ارسال شود. هنگامی که یک بسته به مرز محدوده مشخص شده رسید، بسته باید حذف شود، صرف نظر از اینکه فیلد Hop Count آن غیر صفر باشد یا خیر. البته اگر تعداد پرش قبل از رسیدن به مرز گروه چندپخشی مشخص شده به صفر برسد، بلافاصله تنظیم مجدد می شود. در اینجا لیست کاملی از دامنه چندپخشی IPv6 آمده است.

در نهایت، ::1 یک گروه چندپخشی همه گره را مشخص می کند.

در مورد آدرس ff02::1 لازم به ذکر است که مبهم است. در یک میزبان IPv6 با چندین رابط، مانند یک روتر یا میزبان چند خانه، آدرس ff02::1 هیچ چیزی وجود ندارد که بتوانید تعیین کنید که درخواست های اکو ICMPv6 به کدام رابط ارسال شود یا انتظار دریافت پاسخ های اکو ICMPv6 را هنگام رسیدن آنها داشته باشید. ff02::1 معتبر است و می تواند در هر یک از رابط ها و کانال های متصل به گره چند رابط استفاده شود.

بنابراین وقتی همه گره‌های IPv6 را روی یک پیوند پینگ می‌کنیم، باید به نحوی به ابزار نیز بگوییم ping برای IPv6، از کدام رابط استفاده کنید.

تعریف رابط - گزینه خط فرمان

همانطور که قبلاً دیدیم، آدرس چندپخشی همه گره‌ها که می‌خواهیم استفاده کنیم − است ff02::1 - هیچ گونه اطلاعاتی در مورد این که کدام رابط برای ارسال و دریافت بسته های پژواک پژواک ICMPv6 و پاسخ اکو ارائه شود، ارائه نمی کند.

بنابراین، چگونه رابط کاربری را برای فضای آدرس چندپخشی یا فضای آدرس unicast Link-Local مشخص کنیم؟

اولین و واضح ترین راه این است که آن را به عنوان یک پارامتر برای برنامه ای که استفاده می کنیم ارائه دهیم.

برای کاربرد ping ما آن را از طریق گزینه ارائه می کنیم -I.

[mark@opy ~]$ ping -w 1 -I enp3s2 ff02::1
ping: Warning: source address might be selected on device other than: enp3s2
PING ff02::1(ff02::1) from :: enp3s2: 56 data bytes
64 bytes from fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.438 ms
64 bytes from fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 time=0.589 ms (DUP!)
64 bytes from fe80::7e31:f5ff:fe1b:9fdb%enp3s2: icmp_seq=1 ttl=64 time=5.15 ms (DUP!)
64 bytes from fe80::f7f8:15ff:fe6f:be6e%enp3s2: icmp_seq=1 ttl=64 time=58.0 ms (DUP!)
64 bytes from fe80::877d:4ff:fe1a:b881%enp3s2: icmp_seq=1 ttl=64 time=62.3 ms (DUP!)
64 bytes from fe80::877d:4ff:fe1a:ad79%enp3s2: icmp_seq=1 ttl=64 time=62.8 ms (DUP!)
 
--- ff02::1 ping statistics ---
1 packets transmitted, 1 received, +5 duplicates, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.438/31.544/62.786/29.566 ms
[mark@opy ~]$

با استفاده از این پینگ چندپخشی همه گره ها، پاسخ هایی از 6 گره IPv6 دریافت کردیم. پاسخ ها از آدرس گره های Link-Local IPv6، با پیشوند شروع می شود fe80::/10.

که ping به طور نامحدود به ارسال درخواست های اکو ICMPv6 ادامه نمی دهد تا زمانی که آن را قطع نکنیم، معمولا تعداد بسته هایی را برای ارسال از طریق گزینه -c مشخص می کنیم. با این حال، این همچنین از پذیرش و نمایش بیش از یک پاسخ اکو ICMPv6 هنگام ارسال درخواست اکو ICMPv6 چندپخشی جلوگیری می کند. در عوض، ما از گزینه -w استفاده کردیم تا مشخص کنیم که پینگ باید پس از 1 ثانیه کامل شود، مهم نیست که چه تعداد درخواست اکو ICMPv6 یا پاسخ اکو ارسال یا دریافت شده است.

نکته دیگری که باید به آن توجه کرد این است که (DUP!) خروجی در پاسخ دوم و بعدی. این بسته‌ها به‌عنوان پاسخ‌های تکراری شناسایی می‌شوند، زیرا دارای مقدار توالی ICMP مشابه درخواست‌های انحصاری اکو ICMPv6 هستند که در وهله اول ارسال شده‌اند. آنها به این دلیل ظاهر می شوند که یک درخواست اکو چندپخشی ICMPv6 منجر به چندین پاسخ تک پخشی منفرد می شود. تعداد موارد تکراری نیز در خلاصه آمار ذکر شده است.

تعریف رابط - شناسه منطقه

راه دیگر برای نمایش یک رابط برای استفاده به عنوان بخشی از پارامتر آدرس IPv6 است.

می‌توانیم نمونه‌ای از این را در خروجی پینگ ببینیم، جایی که آدرس‌های میزبان IPv6 پاسخ‌دهنده نیز پسوند دارند. %enp3s2، برای مثال:

64 bytes from fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.438 ms

این روش تعیین رابط ها به طور رسمی در [RFC4007]، "معماری آدرس تعریف شده IPv6" توضیح داده شده است. اگرچه آنها معمولاً رابط سیستم عامل نامیده می شوند، اما در واقع چیزی کلی تر را تعریف می کنند - "منطقه" یا "محدوده".

دلیل داشتن مناطق یا محدوده های عمومی تر این است که، همانطور که در [RFC4007] ذکر شد، یک گره IPv6 می تواند چندین رابط IPv6 مختلف متصل به یک کانال داشته باشد. این رابط ها اعضای یک منطقه هستند.

گروه بندی چندین رابط در یک منطقه تحت سیستم عامل باید امکان پذیر باشد. در حال حاضر من نمی دانم که آیا این کار در لینوکس امکان پذیر است یا چگونه می توان آن را انجام داد.

با استفاده از پسوند %<zone_id>، می توانیم گزینه خط فرمان را حذف کنیم -I ping.

[mark@opy ~]$ ping -w 1 ff02::1%enp3s2
PING ff02::1%enp3s2(ff02::1%enp3s2) 56 data bytes
64 bytes from fe80::2392:6213:a15b:66ff%enp3s2: icmp_seq=1 ttl=64 time=0.106 ms
64 bytes from fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.453 ms (DUP!)
64 bytes from fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 time=0.606 ms (DUP!)
64 bytes from fe80::7e31:f5ff:fe1b:9fdb%enp3s2: icmp_seq=1 ttl=64 time=6.23 ms (DUP!)
64 bytes from fe80::f7f8:15ff:fe6f:be6e%enp3s2: icmp_seq=1 ttl=64 time=157 ms (DUP!)
64 bytes from fe80::877d:4ff:fe1a:ad79%enp3s2: icmp_seq=1 ttl=64 time=159 ms (DUP!)
64 bytes from fe80::877d:4ff:fe1a:b881%enp3s2: icmp_seq=1 ttl=64 time=161 ms (DUP!)
64 bytes from fe80::23d:e8ff:feec:958c%enp3s2: icmp_seq=1 ttl=64 time=179 ms (DUP!)
 
--- ff02::1%enp3s2 ping statistics ---
1 packets transmitted, 1 received, +7 duplicates, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.106/82.858/179.216/81.281 ms
 
[mark@opy ~]$

لینک-پاسخ های آدرس محلی

از این پینگ چندپخشی همه گره، در مجموع 6 پاسخ منحصر به فرد دریافت کردیم.

این پاسخ ها از آدرس های میزبان unicast Link-Local IPv6 آمده است. به عنوان مثال، این پاسخ اول است:

64 bytes from fe80::2392:6213:a15b:66ff%enp3s2: icmp_seq=1 ttl=64 time=0.106 ms

آدرس‌های Unicast Link-Local IPv6 در تمام رابط‌های دارای IPv6 [RFC4291]، «معماری آدرس‌دهی نسخه 6 IP» مورد نیاز است. دلیل این امر این است که یک گره IPv6 همیشه به طور خودکار دارای یک آدرس IPv6 unicast است که حداقل می تواند از آن برای برقراری ارتباط با گره های دیگر در پیوندهای مستقیماً متصل خود استفاده کند. این شامل برقراری ارتباط با برنامه‌های موجود در میزبان‌های دیگر از طریق آدرس‌های میزبان Link-Local است.

این امر طراحی و اجرای پروتکل هایی مانند IPv6 Neighbor Discovery و OSPFv3 را ساده می کند. همچنین به برنامه‌های کاربر نهایی روی میزبان‌ها اجازه می‌دهد تا از طریق کانال بدون نیاز به زیرساخت پشتیبانی IPv6 دیگر در کانال ارتباط برقرار کنند. ارتباط مستقیم بین میزبان های IPv6 متصل نیازی به روتر IPv6 یا سرور DHCPv6 در اتصال ندارد.

آدرس های لینک محلی با یک پیشوند 10 بیتی شروع می شوند fe80و سپس 54 بیت صفر و سپس شناسه رابط 64 بیتی (IID). در پاسخ اول بالا 2392:6213:a15b:66ff یک ID 64 بیتی است.

چندپخشی حلقه شده

به‌طور پیش‌فرض، بسته‌های چندپخشی به صورت داخلی به گره‌ای که آن‌ها را ارسال کرده، بازگردانده می‌شوند. این امر برای آدرس دهی IPv6 و IPv4 اتفاق می افتد.

دلیل این رفتار پیش‌فرض این است که وقتی بسته‌های چندپخشی ارسال می‌شوند، ممکن است یک برنامه چندپخشی محلی شنود نیز در خود میزبان ارسال کننده و همچنین در جایی در شبکه اجرا شود. این برنامه محلی باید بسته های چندپخشی را نیز دریافت کند.

ما می توانیم این حلقه محلی چندپخشی را در خروجی پینگ خود ببینیم:

[mark@opy ~]$ ping -w 1 ff02::1%enp3s2
PING ff02::1%enp3s2(ff02::1%enp3s2) 56 data bytes
64 bytes from fe80::2392:6213:a15b:66ff%enp3s2: icmp_seq=1 ttl=64 time=0.106 ms
64 bytes from fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.453 ms (DUP!)
...

اولین و سریع‌ترین پاسخ (0,106 میلی‌ثانیه در مقایسه با 0,453 میلی‌ثانیه) از آدرس Link-Local پیکربندی شده در خود اینترفیس می‌آید. enp3s2.

[mark@opy ~]$ ip addr show dev enp3s2 | grep fe80
    inet6 fe80::2392:6213:a15b:66ff/64 scope link noprefixroute 
[mark@opy ~]$

سودمندی ping راهی برای سرکوب بازخورد چندپخشی محلی با استفاده از پارامتر ارائه می دهد -L. اگر یک پینگ چندپخشی همه گره ها را با این پرچم ارسال کنیم، پاسخ ها به گره های راه دور محدود می شوند. ما پاسخی از آدرس Link-Local رابط ارسال دریافت نمی کنیم.

[mark@opy ~]$ ping -L -w 1 ff02::1%enp3s2
PING ff02::1%enp3s2(ff02::1%enp3s2) 56 data bytes
64 bytes from fe80::1d36:1fff:fefd:82be%enp3s2: icmp_seq=1 ttl=64 time=0.383 ms
 
64 bytes from fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 time=0.467 ms (DUP!)
...

پینگ لینک-آدرس های محلی

همانطور که ممکن است حدس بزنید، آدرس‌های unicast Link-Local به خودی خود اطلاعات کافی برای نشان دادن اینکه از کدام رابط برای دسترسی به آنها استفاده شود را ارائه نمی‌دهند. مانند پینگ چندپخشی همه گره ها، ما همچنین باید رابط را به عنوان پارامتر خط فرمان مشخص کنیم ping یا شناسه منطقه با آدرس هنگام پینگ کردن آدرس های Link-Local.

این بار می توانیم استفاده کنیم -cبرای محدود کردن تعداد بسته ها و پاسخ های ارسالی و دریافتی ping، از آنجایی که ما در حال اجرای پینگ unicast هستیم.

[mark@opy ~]$ ping -c 1 fe80::f31c:ccff:fe26:a6d9%enp3s2
 
PING fe80::f31c:ccff:fe26:a6d9%enp3s2(fe80::fad1:11ff:feb7:3704%enp3s2) 56 data bytes
64 bytes from fe80::f31c:ccff:fe26:a6d9%enp3s2: icmp_seq=1 ttl=64 time=0.395 ms
 
--- fe80::f31c:ccff:fe26:a6d9%enp3s2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.395/0.395/0.395/0.000 ms
[mark@opy ~]$

پینگ (همه) آدرس های IPv6 دیگر؟

در این مقاله، نحوه پینگ کردن تمام گره های IPv6 در یک کانال با استفاده از آدرس IPv6 چندپخشی همه گره ها را دیدیم. ff02::1. ما همچنین دیدیم که چگونه می‌توانیم مشخص کنیم که کدام رابط را با آدرس IPv6 چندپخشی همه گره‌ها استفاده کنیم، زیرا خود آدرس نمی‌تواند این اطلاعات را ارائه دهد. ما از یکی از گزینه های خط فرمان استفاده کردیم ping، یا رابط را با استفاده از پسوند مشخص کرد %<zone_id>.

سپس در مورد آدرس‌های unicast Link-Local، که آدرس‌هایی هستند که برای پاسخ به درخواست‌های اکو چندپخشی ICMPv6 همه گره‌ها استفاده می‌شوند، آشنا شدیم.

همچنین دیدیم که چگونه بسته‌های چندپخشی به‌طور پیش‌فرض به گره ارسال بازگردانده می‌شوند و چگونه می‌توان آن را برای ابزار غیرفعال کرد. ping.

در نهایت، یک آدرس Link-Local را با استفاده از پسوند پینگ کردیم %<zone_id>، از آنجایی که خود آدرس های Link-Local نیز اطلاعاتی در مورد رابط خروجی ارائه نمی دهند.

پس در مورد تمام گره‌های دیگر پینگ و آدرس‌های unicast سراسری (GUA) آنها (یعنی آدرس‌های عمومی آنها در اینترنت) یا آدرس‌های unicast محلی منحصر به فرد آنها (ULA) چیست؟ در پست بعدی وبلاگ به این موضوع خواهیم پرداخت.

همه چیز هست

می توانید در مورد دوره ما بیشتر بدانید یادداشت های روز باز.

منبع: www.habr.com

اضافه کردن نظر