NETWORK

راهنمای عملی CIDR و زیرشبکه‌بندی (Subnetting) برای مهندسان DevOps

ماسک شبکه، نماد CIDR، تعداد میزبان و تقسیم‌بندی VLSM را با مثال‌های واقعی VPC و Kubernetes یاد بگیرید؛ بدون نیاز به حفظ‌کردن جدول.

عبارت‌هایی مثل 10.20.0.0/22 در طراحی VPC، نوشتن قانون Security Group، تعریف Pod CIDR در Kubernetes و تنظیم مسیرها در روتر مدام استفاده می‌شوند. برای کار با آن‌ها نیازی به حفظ‌کردن جدول نیست؛ یک قاعده‌ی ساده برای محاسبه‌ی تعداد میزبان و مرز بلوک‌ها کافی است. این راهنما آن قاعده را همراه با مثال‌های واقعی از VPC و Kubernetes و فهرستی از اشتباه‌های رایج ارائه می‌کند.

CIDR یعنی چه و عدد بعد از اسلش چیست؟

یک آدرس IPv4 چهار بایت (۳۲ بیت) است. CIDR با نوشتن /n مشخص می‌کند n بیت اول، بخش «شبکه» است و بقیه‌ی بیت‌ها برای شماره‌گذاری میزبان‌ها در همان شبکه‌اند. پس /24 یعنی سه بایت اول شبکه و یک بایت آخر مال میزبان‌ها؛ و /16 یعنی دو بایت اول شبکه.

همین عدد را می‌توان به شکل «ماسک زیرشبکه» هم نوشت: n بیت اول ۱ و بقیه ۰. مثلاً /24 برابر 255.255.255.0 و /22 برابر 255.255.252.0 است.

محاسبه‌ی تعداد میزبان در ذهن

بیت‌های میزبان 32 − n تا هستند، پس شبکه 2^(32−n) آدرس دارد. دو آدرس از آن‌ها برای کار شبکه رزرو است: آدرس شبکه (همه‌ی بیت‌های میزبان صفر) و broadcast (همه یک). بنابراین:

usable_hosts = 2^(32 - n) - 2

/24  →  2^8  - 2  =  254
/22  →  2^10 - 2  =  1022
/16  →  2^16 - 2  =  65534

جدول زیر پرکاربردترین پیشوندها را نشان می‌دهد:

پیشوندماسککل آدرسمیزبان قابل‌استفاده
/8255.0.0.016,777,21616,777,214
/16255.255.0.065,53665,534
/20255.255.240.04,0964,094
/22255.255.252.01,0241,022
/24255.255.255.0256254
/26255.255.255.1926462
/27255.255.255.2243230
/28255.255.255.2401614
/29255.255.255.24886
/30255.255.255.25242
/31255.255.255.25422 (نقطه‌به‌نقطه)
/32255.255.255.25511
CIDRCIDR Calculatorیک CIDR را وارد کنید و رنج، broadcast و ماسک باینری را ببینید.

آدرس شبکه همیشه روی «مرز» قرار می‌گیرد

اندازه‌ی هر بلوک توان ۲ است و شروع آن باید مضربی از اندازه‌اش باشد. مثلاً یک بلوک /26 (۶۴ آدرس) فقط می‌تواند از .0، .64، .128 یا .192 شروع شود. به همین دلیل 10.0.0.10/26 «آدرس شبکه» نیست؛ شبکه‌ای که این میزبان در آن است 10.0.0.0/26 است. بیشتر ابزارها و فایروال‌ها در این حالت خطا می‌دهند یا بی‌سروصدا رنج را «گرد» می‌کنند، که منبع اشتباه‌های گیج‌کننده است.

رنج‌های خصوصی که باید بشناسید

رنجاندازهکاربرد معمول
10.0.0.0/8≈ 16.7Mشبکه‌های بزرگ سازمانی و VPC ابرها
172.16.0.0/12≈ 1Mشبکه‌ی پیش‌فرض Docker (172.17.0.0/16) در همین رنج است
192.168.0.0/16≈ 65Kشبکه‌های خانگی و آزمایشگاهی
100.64.0.0/10≈ 4MCGNAT؛ فضای ویژه‌ی اپراتورها، نه شبکه‌ی خصوصی معمولی
169.254.0.0/1665KLink-local؛ اگر این را روی یک کارت می‌بینید یعنی DHCP پاسخ نداده
tip رنج پیش‌فرض Docker (172.17.0.0/16) گاهی با شبکه‌ی شرکت همپوشانی پیدا می‌کند و دسترسی به بعضی سرورها را بدون علت آشکار قطع می‌کند. در این حالت در daemon.json مقدار default-address-pools را عوض کنید.

تقسیم یک شبکه به بخش‌های نابرابر (VLSM)

فرض کنید شبکه‌ی 10.0.0.0/24 دارید و چهار بخش لازم است: ۱۰۰ سرور، ۵۰ دستگاه مدیریت، ۲۰ دستگاه Wi-Fi مهمان و یک لینک نقطه‌به‌نقطه بین دو روتر. روش درست این است که از بزرگ‌ترین بخش شروع کنید و هرکدام را در کوچک‌ترین بلوکی که جا می‌شود بگذارید:

بخشنیازبلوکرنج
سرورها100/25 (126)10.0.0.0 – 10.0.0.127
مدیریت50/26 (62)10.0.0.128 – 10.0.0.191
Wi-Fi مهمان20/27 (30)10.0.0.192 – 10.0.0.223
لینک روتر2/30 (2)10.0.0.224 – 10.0.0.227

اگر ترتیب را برعکس می‌کردید، مثلاً اول /30 و بعد /25 را می‌گذاشتید، بلوک /25 باید روی مرز .128 می‌رفت و فضایی که در میان می‌ماند بی‌استفاده می‌شد. ابزار زیر دقیقاً همین ترتیب‌دهی را برای شما انجام می‌دهد و اگر شبکه‌ی اصلی کوچک باشد هشدار می‌دهد.

IPVLSM Subnet Calculatorبخش‌ها را با نام و تعداد میزبان وارد کنید تا رنج کامل هر زیرشبکه ساخته شود.

در ابر و Kubernetes چه چیزی فرق می‌کند؟

  • آدرس‌های رزرو‌شده: ابرهای عمومی در هر زیرشبکه چند آدرس را برای خودشان نگه می‌دارند (در AWS پنج آدرس). برای یک زیرشبکه‌ی /28 این یعنی فقط ۱۱ آدرس واقعاً قابل‌استفاده است.
  • VPC را بزرگ بگیرید. اندازه‌ی VPC را بعداً به‌سختی می‌شود تغییر داد. یک /16 برای شروع معمولاً کافی و ارزان است، چون آدرس خصوصی هزینه ندارد.
  • Pod و Service CIDR در Kubernetes: این دو رنج با شبکه‌ی گره‌ها، شبکه‌ی شرکت و هم‌دیگر نباید هم‌پوشانی داشته باشند. تغییر این رنج‌ها بعد از ساخت کلاستر دشوار و پرهزینه است.
  • همپوشانی با VPN: قبل از وصل‌کردن دو شبکه (VPN، peering، Direct Connect) رنج‌ها را مقایسه کنید؛ دو شبکه‌ی همپوشان هرگز مسیریابی نمی‌شوند.

اشتباه‌های رایج

  1. فراموش‌کردن دو آدرس رزرو. «۲۰ سرور دارم، پس /27 (۳۲ آدرس) کافی است» درست است، اما «۳۰ سرور دارم، /27 کافی است» خیر؛ فقط ۳۰ میزبان قابل‌استفاده است و فضایی برای رشد نمی‌ماند.
  2. رشد را در نظر نگرفتن. اگر قرار است سال بعد دو برابر شوید، همین حالا یک پیشوند کوچک‌تر (بلوک بزرگ‌تر) بگیرید.
  3. همپوشانی ناخواسته. رنج‌ها را در یک جدول مرکزی (حتی یک فایل در Git) ثبت کنید.
  4. مبهم‌نوشتن رول‌های فایروال. /32 یعنی فقط یک میزبان و /0 یعنی «همه‌ی اینترنت»؛ تفاوت یک رقم می‌تواند یک رخنه باشد.
  5. اشتباه گرفتن ماسک و wildcard. در ACLهای بعضی روترها (مثل Cisco) از wildcard mask استفاده می‌شود که معکوس ماسک است (0.0.0.255 به‌جای 255.255.255.0).
note در IPv6 همین منطق برقرار است، فقط عدد بزرگ‌تر است: کوچک‌ترین بلوک استاندارد برای یک شبکه‌ی محلی /64 است و نیازی به صرفه‌جویی در آدرس نیست؛ دغدغه‌ی اصلی، طرح‌ریزی سلسله‌مراتب است نه تعداد میزبان.

یک تمرین سریع

بدون ابزار حساب کنید: 172.16.40.0/21 از کجا تا کجاست؟ بلوک /21 یعنی ۲۰۴۸ آدرس، که در بایت سوم ۸ واحد را می‌گیرد (چون ۲۴ − ۲۱ = ۳ بیت از بایت سوم میزبان است). بایت سوم باید مضرب ۸ باشد؛ ۴۰ مضرب ۸ است، پس شبکه از 172.16.40.0 شروع و در 172.16.47.255 تمام می‌شود. حالا جوابتان را با ابزار بالا مقایسه کنید.

جمع‌بندی

سه نکته را به خاطر بسپارید: تعداد میزبان قابل‌استفاده 2^(32−n) − 2 است، بلوک‌ها همیشه روی مرز اندازه‌ی خودشان قرار می‌گیرند، و رنج‌های شبکه باید پیش از ساخت زیرساخت ثبت و بررسی شوند. اگر روی Kubernetes کار می‌کنید، بعد از طراحی رنج‌ها سراغ نوشتن مانیفست‌ها بروید؛ و اگر مشکلی در رسیدن به یک سرویس دارید، چک‌لیست عیب‌یابی DNS و SSL ترتیب درست بررسی را نشان می‌دهد.

پرسش‌های متداول

در شبکه‌ی /24 چند آدرس قابل‌استفاده وجود دارد؟
در مجموع ۲۵۶ آدرس وجود دارد؛ یکی آدرس شبکه و یکی broadcast است، پس ۲۵۴ میزبان. در ابرهای عمومی معمولاً چند آدرس دیگر هم رزرو می‌شود (مثلاً در AWS پنج آدرس هر زیرشبکه)، بنابراین ظرفیت واقعی کمتر است.
فرق /31 و /32 با بقیه چیست؟
/32 فقط یک آدرس است (برای مثال یک مسیر مشخص یا یک رول فایروال)، و /31 طبق RFC 3021 برای لینک نقطه‌به‌نقطه دو آدرس قابل‌استفاده می‌دهد بدون آدرس شبکه و broadcast.
چرا نباید رنج‌های خصوصی شبکه‌ها همپوشانی داشته باشند؟
اگر دو شبکه که قرار است با VPN یا peering به هم وصل شوند رنج مشترک داشته باشند، مسیریابی ممکن نیست. به همین دلیل، قبل از ساخت VPC یا کلاستر، رنج‌ها را در یک جدول مرکزی ثبت کنید.
VLSM چه فرقی با subnetting ثابت دارد؟
در تقسیم ثابت همه‌ی زیرشبکه‌ها یک اندازه‌اند؛ در VLSM هر بخش به اندازه‌ی نیازش آدرس می‌گیرد و آدرس کمتری هدر می‌رود.