এই পর্বে যা শিখবেন
- VPC, VNet আর Google-এর global VPC-র মিল ও অমিল বলা
- CIDR থেকে ঠিকানা, ব্যবহারযোগ্য ঠিকানা আর দরকারি subnet-এর মাপ হাতে বের করা
- কোন কাজ public, private না data subnet-এ যাবে, তা যুক্তি দিয়ে ঠিক করা
- তিন AZ-এ তিন স্তরের একটি পূর্ণ ঠিকানার নকশা বানানো
- Pod-এর কারণে IP ফুরিয়ে যাওয়া ধরা, আর overlap আগেই আটকানো
১ · VPC কী — cloud-এর ভেতরে নিজের আবাসিক এলাকা
একটি বড় আবাসিক এলাকা ভাবুন। সীমানার ভেতরে রাস্তা, ব্লক আর বাড়ির নম্বর সব এলাকার নিজের ঠিক করা। মূল গেট কোথায় হবে, কোন ব্লকে বাইরের মানুষ ঢুকতে পারবে, আর কোন ব্লকে শুধু বাসিন্দারা, তাও এলাকার সমিতিই ঠিক করে। পাশের এলাকাতেও “রোড ৫, বাড়ি ১২” থাকতে পারে; কেউ বিভ্রান্ত হয় না, কারণ দুই এলাকার মধ্যে সরাসরি রাস্তা নেই।
VPC (Virtual Private Cloud) cloud-এর ভেতরে এমনই একটি এলাকা। এটি আপনার নিজের virtual network: ঠিকানার পরিসর আপনি বাছেন, সেটিকে subnet নামের ব্লকে ভাগ করেন, আর ঠিক করেন packet কোন পথে যাবে। পর্ব ১৫-এর VM, পর্ব ১৮-এর load balancer আর পর্ব ২২-এর database, সবই কোনো না কোনো subnet-এ বসে। এই মডিউলের ছয়টি পর্বে আমরা সেই network-টিই গড়ব।
ভেতরে কোনো আলাদা switch বা তার আপনার জন্য বসানো হয় না। VPC হলো software-defined network: নিয়মগুলো একটি control plane-এ লেখা থাকে, আর hypervisor-এর সফটওয়্যার প্রতিটি packet-কে সেই নিয়মে চালায়। আপনার packet একটি বাইরের খামে মুড়ে provider-এর সাধারণ network দিয়ে যায়; এই কৌশলকে বলে overlay network. তাই একই 10.20.0.5 ঠিকানা দুই গ্রাহকের দুই VPC-তে থাকতে পারে। নিয়ন্ত্রণ আলাদা করার ধারণাটি পাবেন Computer Networks-এর SDN পর্বে, আর সারসংক্ষেপ cloud আর container নেটওয়ার্কিং পর্বে। এখানে আমাদের প্রশ্ন একটিই: ঠিকানা সাজাবেন কীভাবে?
| ধারণা | AWS | Azure | Google Cloud |
|---|---|---|---|
| নিজের network | VPC | VNet (Virtual Network) | VPC |
| Network-এর বিস্তার | একটি region | একটি region | Global, অনেক region জুড়ে |
| Subnet-এর বিস্তার | একটি AZ | পুরো region | পুরো region |
| কাটা ঠিকানা (subnet প্রতি) | ৫টি | ৫টি | ৪টি |
এই টেবিল লেখার সময়ের সাধারণ চিত্র; কাজে নামার আগে নিজের provider-এর নথি দেখে নিন। বিশেষ করে Google-এর একটি VPC একাধিক region-এ subnet রাখতে পারে, তাই “VPC প্রতি region-এ একটি” ধরে নিলে ওখানে নকশা মিলবে না।
VPC-র ভেতরে কী কী থাকে: একটি বা একাধিক ঠিকানার পরিসর, subnet, routing table আর firewall-এর নিয়ম। Route আর gateway আসবে পর্ব ২৬-এ, firewall পর্ব ২৭-এ, আর VPC জোড়া পর্ব ২৮-এ। আজ শুধু ঠিকানার নকশা।
২ · CIDR-এর ঝটপট ঝালাই আর RFC 1918
Binary subnetting-এর পুরো তত্ত্ব আছে Computer Networks-এর subnetting পর্বে। এখানে দুই লাইনের ঝালাই। CIDR লেখায় 10.20.0.0/16 মানে প্রথম ১৬ bit network-এর, বাকি ১৬ bit host-এর। মোট bit ৩২, তাই ঠিকানা = 232−p, যেখানে p হলো prefix.
/16 → 65,536 · /20 → 4,096 · /24 → 256 · /28 → 16
Prefix এক বাড়লে ঠিকানা অর্ধেক হয়, এক কমলে দ্বিগুণ। এটুকু মনে থাকলে বাকি হিসাব সহজ।
কোন পরিসর থেকে বাছবেন
VPC-র ঠিকানা সাধারণত private IP পরিসর থেকে নেওয়া হয়। RFC 1918 (ফেব্রুয়ারি ১৯৯৬) তিনটি পরিসর ইন্টারনেটের বাইরে ভেতরের ব্যবহারের জন্য আলাদা করে রেখেছে। এগুলো ইন্টারনেটে route হয় না, তাই সবাই ব্যবহার করতে পারে। মূল্য হলো: এগুলো পৃথিবীতে অনন্য নয়।
| পরিসর | শেষ ঠিকানা | মোট ঠিকানা | সাধারণ ব্যবহার |
|---|---|---|---|
10.0.0.0/8 | 10.255.255.255 | ১,৬৭,৭৭,২১৬ | বড় প্রতিষ্ঠান আর cloud-এর VPC |
172.16.0.0/12 | 172.31.255.255 | ১০,৪৮,৫৭৬ | Docker-এর default আর অনেক অফিস |
192.168.0.0/16 | 192.168.255.255 | ৬৫,৫৩৬ | বাসার router আর ছোট অফিস |
একটি চেনা ফাঁদ: 172.32.0.1 private নয়। /12 মানে 172.16 থেকে 172.31 পর্যন্ত। আর ঠিকানা private হলেই VPC-তে চলবে, তা-ও নয়; provider নিজের কিছু পরিসরে বিধিনিষেধ রাখতে পারে, তাই নথি মিলিয়ে নিন।
নিচের calculator যেকোনো CIDR-এর মাপ, mask আর পরিসর বের করে। list-এ নিজের CIDR বসিয়ে চালান। খেয়াল করুন, ঠিকানার সংখ্যা হিসাব করতে এখানে bit shift ব্যবহার হয়নি, কারণ JavaScript-এর << ৩২-bit signed সংখ্যায় কাজ করে আর বড় ঠিকানায় মান ঋণাত্মক হয়ে যায়।
// CIDR calculator: size, mask, range and usable addresses.
// Plain arithmetic, because JS << works on signed 32-bit numbers.
const toInt = s => s.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(b => Math.floor(n / 2 ** b) % 256).join(".");
function info(cidr) {
const [base, p] = cidr.split("/");
const size = 2 ** (32 - Number(p)), ip = toInt(base);
const first = ip - (ip % size); // clear the host bits
return { size, first, last: first + size - 1, mask: toIp(2 ** 32 - size) };
}
const usable = (size, r) => (size > r ? size - r : "none");
console.log("cidr addresses mask range");
const list = ["10.20.0.0/16", "10.20.0.0/20", "10.20.16.0/24",
"10.20.16.0/26", "10.20.16.0/28", "10.20.37.5/20"];
for (const c of list) {
const x = info(c);
console.log(c.padEnd(16), String(x.size).padStart(9), "", x.mask.padEnd(16),
toIp(x.first), "..", toIp(x.last));
}
console.log("\nprefix reserve 5 reserve 4"); // AWS and Azure 5, Google 4 (check docs)
for (const p of [16, 20, 24, 26, 28, 30]) {
const s = 2 ** (32 - p);
console.log(`/${p}`.padEnd(7), String(usable(s, 5)).padStart(9), String(usable(s, 4)).padStart(10));
}
// Smallest subnet for a host count, with growth room and reserved addresses.
function fit(hosts, growthPct, reserved) {
const need = Math.ceil(hosts * (100 + growthPct) / 100) + reserved;
const prefix = 32 - Math.ceil(Math.log2(need));
return `${hosts} hosts +${growthPct}% +${reserved} = ${need} -> /${prefix} (${2 ** (32 - prefix)})`;
}
console.log("\n" + [[500, 30, 5], [30, 50, 5], [2000, 50, 5]].map(a => fit(...a)).join("\n"));আউটপুট:
cidr addresses mask range
10.20.0.0/16 65536 255.255.0.0 10.20.0.0 .. 10.20.255.255
10.20.0.0/20 4096 255.255.240.0 10.20.0.0 .. 10.20.15.255
10.20.16.0/24 256 255.255.255.0 10.20.16.0 .. 10.20.16.255
10.20.16.0/26 64 255.255.255.192 10.20.16.0 .. 10.20.16.63
10.20.16.0/28 16 255.255.255.240 10.20.16.0 .. 10.20.16.15
10.20.37.5/20 4096 255.255.240.0 10.20.32.0 .. 10.20.47.255
prefix reserve 5 reserve 4
/16 65531 65532
/20 4091 4092
/24 251 252
/26 59 60
/28 11 12
/30 none none
500 hosts +30% +5 = 655 -> /22 (1024)
30 hosts +50% +5 = 50 -> /26 (64)
2000 hosts +50% +5 = 3005 -> /20 (4096)
শেষ সারি 10.20.37.5/20 দেখুন। Host bit শূন্য নয়, তবু calculator network খুঁজে পেল: 10.20.32.0. দ্বিতীয় টেবিলে /30-এর ঘরে none, কারণ ৪টি ঠিকানার সবই provider-এর কাটায় চলে যায়। শেষ তিন লাইনে দরকারি host সংখ্যা থেকে মাপ বের হয়েছে, পরের অংশে এর ব্যাখ্যা।
৩ · VPC-র মাপ, কাটা ঠিকানা আর হাতে হিসাব
ঠিকানার মাপ বাছা বাড়ির জমি কেনার মতো। ছোট জমি কিনলে পরে ঘর বাড়ানো কঠিন। আবার অকারণে বিশাল জমি নিলে পাশের এলাকার সাথে সীমানা নিয়ে ঝগড়া বাধে। VPC-তে সমস্যাটি একই: খুব ছোট হলে ঠিকানা ফুরায়, খুব বড় হলে প্রতিষ্ঠানের ভাগের ঠিকানা শেষ হয় আর অন্য network-এর সাথে ঠোকাঠুকি বাড়ে।
| Prefix | ঠিকানা | কোথায় মানায় |
|---|---|---|
/16 | ৬৫,৫৩৬ | Production, অনেক subnet, Kubernetes-সহ |
/20 | ৪,০৯৬ | ছোট সেবা বা development |
/24 | ২৫৬ | Sandbox, খুব ছোট পরীক্ষা |
এগুলো নিয়ম নয়, ধারণা। AWS-এ লেখার সময়ে একটি VPC CIDR /16 থেকে /28 পর্যন্ত হতে পারে; অন্য provider-এর সীমা আলাদা। আকার ঠিক করুন উল্টো দিক থেকে: আগে গুনুন কতগুলো subnet লাগবে।
ধার করা bit s = ⌈log₂ N⌉ · Subnet prefix = VPC prefix + s
প্রতি subnet-এ কাটা ঠিকানা
একটি subnet-এর সব ঠিকানা আপনার নয়। Provider কয়েকটি কেটে রাখে। AWS-এর উদাহরণে 10.20.0.0/20-এ পাঁচটি ঠিকানা যায়:
| ঠিকানা | কাজ |
|---|---|
10.20.0.0 | Network ঠিকানা |
10.20.0.1 | VPC-র router |
10.20.0.2 | DNS-এর জন্য রাখা (VPC-র ভিত্তি + ২-এর নিয়মে) |
10.20.0.3 | ভবিষ্যতের জন্য তোলা |
10.20.15.255 | Broadcast ঠিকানা, যদিও VPC broadcast চালায় না |
Azure-এও পাঁচটি যায়, তবে কাজের ভাগ একটু আলাদা। Google Cloud-এ সাধারণত চারটি যায়: প্রথম দুটি আর শেষ দুটি। পাঠ্যবইয়ের সূত্র 2h − 2 cloud-এ সরাসরি খাটে না। আর /28-এর মতো ছোট subnet-এ এই পাঁচটি মানে ১৬-র প্রায় এক-তৃতীয়াংশ।
পাঁচটি numerical, পূর্ণ সমাধান
- /20-এ কতটি? 232−20 = 212 = ৪,০৯৬। AWS বা Azure-এ ব্যবহারযোগ্য ৪,০৯৬ − ৫ = ৪,০৯১, Google-এ ৪,০৯৬ − ৪ = ৪,০৯২।
- /16 থেকে কতগুলো /20? ধার করা bit ২০ − ১৬ = ৪, তাই 24 = ১৬টি। তৃতীয় octet-এ লাফ ২৫৬ ÷ ১৬ = ১৬:
10.20.0.0,10.20.16.0,10.20.32.0… - ৫০০ host, ৩০% বৃদ্ধি, AWS. ৫০০ × ১.৩ = ৬৫০; ৫টি যোগ করলে ৬৫৫। 29 = ৫১২ ছোট, 210 = ১,০২৪ যথেষ্ট। Host bit ১০, তাই prefix ৩২ − ১০ = /22.
- 10.20.37.5 কোন /20-এ? Block ১৬। ৩৭ ÷ ১৬-র ভাগফল ২, আর ২ × ১৬ = ৩২। Network
10.20.32.0/20, পরিসর10.20.47.255পর্যন্ত। 10.20.0.0/16আর10.20.128.0/17কি মেলে? সংখ্যায় লিখি। প্রথমটি ১৬,৯০,৮২,৮৮০ থেকে ১৬,৯১,৪৮,৪১৫। দ্বিতীয়টি ১৬,৯১,১৫,৬৪৮ থেকে ১৬,৯১,৪৮,৪১৫। নিয়ম: lo₁ ≤ hi₂ আর lo₂ ≤ hi₁. দুটিই সত্য, তাই overlap.
৪ · Subnet কোথায় থাকে — zone নাকি region
পর্ব ৫-এ দেখেছেন, availability zone একটি region-এর ভেতরে আলাদা বিদ্যুৎ ও network-এর data center দল। Multi-AZ নকশায় অ্যাপের কপি একাধিক zone-এ থাকে। Subnet-এর সাথে zone-এর সম্পর্ক provider ভেদে দুই রকম, আর এটি ঠিকানার হিসাব সরাসরি বদলায়।
AWS-এর ধরন: subnet এক AZ-এ
প্রতিটি subnet ঠিক একটি AZ-এ বাঁধা। তিন AZ-এ public স্তর চাইলে তিনটি আলাদা subnet, আর তিনটি আলাদা CIDR. Failure domain ঠিকানা দেখেই বোঝা যায়, কিন্তু subnet-এর সংখ্যা স্তর × AZ হারে বাড়ে।
৩ স্তর × ৩ AZ = ৯ subnetGoogle ও Azure-এর ধরন: subnet পুরো region-এ
একটি subnet region-এর সব zone জুড়ে থাকে। তিন zone-এর VM একই CIDR থেকে ঠিকানা পেতে পারে। Subnet কম লাগে, নকশা সহজ, কিন্তু ঠিকানা দেখে zone বোঝা যায় না।
৩ স্তর = ৩ subnetদুই ধরনেই নকশার নীতি একই: কোনো একটি zone পড়ে গেলে বাকি zone-এ চলার মতো জায়গা থাকতে হবে। এই পর্বের হিসাবে আমরা AWS-এর ধরন ধরছি, কারণ এতে subnet বেশি লাগে আর হিসাব কঠিন হয়। সহজ ধরনে কমিয়ে নেওয়া সহজ, উল্টোটা নয়।
লঞ্চঘাটের কথা ভাবুন। এক ধরনের ব্যবস্থায় প্রতিটি পন্টুনের টিকিট কাউন্টারের নম্বরের সিরিজ আলাদা; নম্বর দেখেই বোঝা যায় কোন পন্টুন। আরেক ধরনে পুরো ঘাটের একটিই সিরিজ, যেকোনো পন্টুনে যেকোনো নম্বর। প্রথমটিতে হিসাব পরিষ্কার, কিন্তু সিরিজ বেশি লাগে। দ্বিতীয়টিতে সিরিজ কম, কিন্তু নম্বর দেখে জায়গা বোঝা যায় না।
৫ · Public, private আর isolated — subnet-কে কী public বানায়
সবচেয়ে প্রচলিত ভুল ধারণা হলো: subnet-এর নাম “public” রাখলেই সেটি public. নাম শুধু লেবেল। Subnet-এ কোনো “public” সুইচও থাকে না। পার্থক্য তৈরি করে তার সাথে জোড়া routing table, মানে packet বাইরে যাওয়ার পথ।
| ধরন | বাইরের জন্য route | বাইরে থেকে শুরু? | ভেতর থেকে বাইরে? | কী থাকে |
|---|---|---|---|---|
| Public | Internet gateway | হ্যাঁ, public IP থাকলে | হ্যাঁ | Load balancer, NAT gateway |
| Private | NAT gateway | না | হ্যাঁ, NAT দিয়ে | App server, worker |
| Isolated (data) | নেই | না | না | Database, cache |
দুটি শর্ত একসাথে লাগে: route আর public IP. Public subnet-এর VM-এ public IP না থাকলে ইন্টারনেট থেকে তাকে পাওয়া যাবে না। Route না থাকলে public IP দিয়েও লাভ নেই। আর VM-এর নিজের network card-এ private IP-ই থাকে; public IP-কে তার সাথে সাধারণত provider-এর NAT মিলিয়ে দেয়। পুরো পথের হিসাব পর্ব ২৬-এ। “Public subnet” শব্দটিও মূলত AWS-এর নথির; Google বা Azure-এ VM-ভিত্তিক external IP আর route দিয়েই একই ফল আসে, এবং সেখানে ধারণাটি কম আনুষ্ঠানিক।
বাইরের packet কোন পথে যায়, সেটিই subnet-এর পরিচয়।
তিন স্তরের নকশা
বিয়েবাড়ির কথা ভাবুন। গেটে অতিথি আসেন, মঞ্চ আর খাবারের ঘর ভেতরে, আর রান্নাঘর একদম পেছনে, যেখানে অতিথি যান না, শুধু খাবার আসে। তিন স্তরের নকশা একই: Load balancer গেটে, app মাঝখানে, database পেছনে। প্রতিটি স্তর শুধু পরের স্তরের সাথে কথা বলে।
তিন AZ, তিন স্তর
VPC 10.20.0.0/16 with public, private and data subnets
কোন কাজ কোন স্তরে যাবে? দুটি প্রশ্নেই বেশিরভাগ সিদ্ধান্ত হয়: বাইরের কেউ কি সরাসরি এর সাথে যোগাযোগ শুরু করবে? এটি কি নিজে বাইরে যাবে? নিচে ছয়টি কাজ পরপর যাচাই করুন।
| কাজ | |
| বাইরে থেকে শুরু? | |
| নিজে বাইরে যায়? | |
| স্তর |
- Load balancer. ক্রেতার browser সরাসরি এখানে আসে, তাই এটি public স্তরে। কিন্তু খেয়াল করুন, ক্রেতারা শুধু এটিকেই দেখেন, পেছনের VM-কে নয়।
- Web app VM. Traffic আসে load balancer থেকে, তাই বাইরে থেকে সরাসরি কেউ আসে না। তবে payment API-তে নিজে যেতে হয়। শুধু বাইরে যাওয়া লাগে, তাই private স্তর।
- NAT gateway. নিজে ভেতরের কাজ, কিন্তু অন্যদের হয়ে ইন্টারনেটে যায়। তাই AWS-ধরনের নকশায় এটি নিজে public subnet-এ বসে। “NAT private-এর জিনিস” ভাবলে এই ধাপেই ভুল হয়।
- Database. শুধু app কথা বলে, আর এর ইন্টারনেটের কোনো দরকার নেই। তাই isolated data স্তর। Managed database-এর patch আর backup provider-এর নিজের পথে চলে।
- Bastion. পর্ব ১২-এর bastion ব্যবহার করলে এটি public স্তরে, শুধু অফিসের ঠিকানায় খোলা। আধুনিক provider-এ অনেকে bastion-ই রাখেন না, public IP ছাড়াই provider-এর session সেবা দিয়ে ঢোকেন। সেই সুযোগ থাকলে সেটিই ভালো।
- নিজে চালানো DB VM. Package update লাগে বলে একে public করার লোভ হয়। সঠিক উত্তর নয়। পুরো স্তরের নিরাপত্তা একটি update-এর জন্য বদলানো যায় না। Private package mirror বা নিয়ন্ত্রিত পথ ব্যবহার করুন, আর স্তর data-ই থাকুক।
- ফল। Public-এ ৩টি কাজ (bastion না রাখলে ২টি), private-এ ১টি, data-য় ২টি। মনে রাখার নিয়ম: যত কম public, তত ভালো। সন্দেহ হলে আরও ভেতরের স্তরে রেখে শুরু করুন।
৬ · কাল্পনিক দোকানের নকশা — 10.20.0.0/16 থেকে /20
একটি কাল্পনিক অনলাইন বাজার অ্যাপ এক region-এ চলবে। শর্ত: তিন AZ, তিন স্তর, প্রতিটি subnet-এ কয়েকশো থেকে কয়েক হাজার ঠিকানা। পরে চতুর্থ AZ বা নতুন স্তর আসতে পারে। স্তর × AZ-এর ঘর = ৩ × ৩ = ৯, কিন্তু ভবিষ্যতের জন্য আমরা ৪ স্তর × ৪ AZ = ১৬টি ঘর ধরব। ⌈log₂ ১৬⌉ = ৪ bit, তাই /16 + ৪ = /20.
| Prefix | |
| Host bit | |
| Block | |
| প্রতি block | |
| Octet-এর লাফ | |
| ব্যবহৃত /20 |
- পুরো জমি।
10.20.0.0/16-এ host bit ১৬, তাই ৬৫,৫৩৬টি ঠিকানা। প্রথম দুই octet10.20স্থির, বাকি দুটি আমাদের। - এক bit ধার। /17-এ দুটি অর্ধেক, প্রতিটিতে ৩২,৭৬৮। তৃতীয় octet-এ লাফ ১২৮, তাই শুরু ০ আর ১২৮।
- আরও এক bit. /18-এ চারটি block, প্রতিটিতে ১৬,৩৮৪, লাফ ৬৪। প্রতি স্তরকে একটি করে /18 দিলাম, আর চতুর্থটি খালি। এখন ঠিকানা দেখেই স্তর বোঝা যায়, আর firewall-এ পুরো স্তর এক নিয়মে লেখা যায়।
- আরও দুই bit. প্রতি /18 ভেঙে চারটি /20, মোট ১৬টি, প্রতিটিতে ৪,০৯৬। লাফ ১৬। শেষ সারি 192-এর, যেটি খালি স্তরের।
- Public স্তর বসানো। AZ-a, b, c পেল ০, ১৬, ৩২। ৪৮-এর ঘর চতুর্থ AZ-এর জন্য তোলা। ব্যবহৃত ৩টি।
- Private আর data. একই ছাঁচ: private ৬৪, ৮০, ৯৬ আর data ১২৮, ১৪৪, ১৬০। AZ-এর অবস্থান তিন স্তরেই মিলছে, যেমন ১২৮ মানে data-র প্রথম ঘর। ব্যবহৃত ৯টি।
- হিসাব মেলানো। ৯ × ৪,০৯৬ = ৩৬,৮৬৪ ঠিকানা ব্যবহৃত, ৭ × ৪,০৯৬ = ২৮,৬৭২ খালি। মোট ৬৫,৫৩৬, মিলে গেল। খালি ৭টির তিনটি AZ-d-র ঘর, চারটি নতুন স্তরের।
নিচের planner একই নকশা হিসাব করে টেবিল ছাপে। VPC, TIER_P, SUB_P বা AZS বদলে নিজের নকশা চালান। জায়গায় না ধরলে এটি error দেবে, যা ভুল টেবিল ছাপার চেয়ে ভালো।
// VPC subnet planner: one /18 block per tier, one /20 per AZ inside each block.
// The fourth /20 of each block stays empty for a future AZ.
const VPC = "10.20.0.0/16", TIER_P = 18, SUB_P = 20, RES_FRONT = 4, RES_BACK = 1;
const TIERS = ["public", "private", "data"], AZS = ["a", "b", "c"];
const toInt = s => s.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(b => Math.floor(n / 2 ** b) % 256).join(".");
const [base, vp] = VPC.split("/");
const start = toInt(base), vpcSize = 2 ** (32 - Number(vp));
const tierSize = 2 ** (32 - TIER_P), subSize = 2 ** (32 - SUB_P);
const slots = tierSize / subSize;
if (TIERS.length * tierSize > vpcSize || AZS.length > slots) throw new Error("plan does not fit");
console.log("subnet cidr usable from usable to usable");
let used = 0;
TIERS.forEach((tier, i) => {
const block = start + i * tierSize;
AZS.forEach((az, j) => {
const s = block + j * subSize;
const from = s + RES_FRONT, to = s + subSize - 1 - RES_BACK;
console.log(`${tier}-${az}`.padEnd(10), `${toIp(s)}/${SUB_P}`.padEnd(15),
toIp(from).padEnd(14), toIp(to).padEnd(14), to - from + 1);
used++;
});
console.log(` held for ${tier}: ${toIp(block + AZS.length * subSize)}/${SUB_P}`);
});
const free = (vpcSize - used * subSize) / subSize;
const nextBlock = start + TIERS.length * tierSize;
const each = subSize - RES_FRONT - RES_BACK;
console.log(`\nsubnets: ${used} x /${SUB_P} = ${used * subSize} addresses`);
console.log(`usable : ${used} x ${each} = ${used * each}`);
console.log(`free : ${free} x /${SUB_P} = ${free * subSize}`);
console.log(`next tier block: ${toIp(nextBlock)}/${TIER_P}`);আউটপুট:
subnet cidr usable from usable to usable
public-a 10.20.0.0/20 10.20.0.4 10.20.15.254 4091
public-b 10.20.16.0/20 10.20.16.4 10.20.31.254 4091
public-c 10.20.32.0/20 10.20.32.4 10.20.47.254 4091
held for public: 10.20.48.0/20
private-a 10.20.64.0/20 10.20.64.4 10.20.79.254 4091
private-b 10.20.80.0/20 10.20.80.4 10.20.95.254 4091
private-c 10.20.96.0/20 10.20.96.4 10.20.111.254 4091
held for private: 10.20.112.0/20
data-a 10.20.128.0/20 10.20.128.4 10.20.143.254 4091
data-b 10.20.144.0/20 10.20.144.4 10.20.159.254 4091
data-c 10.20.160.0/20 10.20.160.4 10.20.175.254 4091
held for data: 10.20.176.0/20
subnets: 9 x /20 = 36864 addresses
usable : 9 x 4091 = 36819
free : 7 x /20 = 28672
next tier block: 10.20.192.0/18
“usable from” শেষ হয় .4-এ, কারণ প্রথম চারটি AWS-এর। “usable to” .254-এ, কারণ শেষটিও কাটা। ৯ × ৪,০৯১ = ৩৬,৮১৯টি ঠিকানা ব্যবহারযোগ্য। Google-ধরনের হিসাব দেখতে RES_FRONT ২ আর RES_BACK ২ করুন।
এই নকশা তিন provider-এ তৈরির নমুনা নিচে। চালানোর দরকার নেই; পড়লেই চলবে। আইডিগুলো নমুনা। VPC নিজে সাধারণত খরচহীন হলেও NAT gateway আর public IP-তে টাকা লাগতে পারে, তাই নিজে পরীক্ষা করলে শেষে মুছে ফেলুন আর দাম provider-এর পাতায় দেখুন।
aws ec2 create-vpc --cidr-block 10.20.0.0/16
aws ec2 create-subnet --vpc-id vpc-0123456789abcdef0 \
--cidr-block 10.20.0.0/20 --availability-zone ap-southeast-1aaz network vnet create --resource-group shop-rg --name shop-vnet \
--address-prefixes 10.20.0.0/16
az network vnet subnet create --resource-group shop-rg \
--vnet-name shop-vnet --name public --address-prefixes 10.20.0.0/20gcloud compute networks create shop-vpc --subnet-mode=custom
gcloud compute networks subnets create public-1 --network=shop-vpc \
--range=10.20.0.0/20 --region=asia-southeast1Azure আর Google-এর নমুনায় একটি subnet-ই region জুড়ে থাকে, তাই সেখানে AZ-প্রতি /20 না করে স্তর-প্রতি একটি বড় subnet নেওয়াই বেশি স্বাভাবিক। হাতে CIDR না লিখে Terraform-এর cidrsubnet("10.20.0.0/16", 4, 6) ফাংশনে ঘরের নম্বর দিয়ে হিসাব করানো যায়; এটি দেয় 10.20.96.0/20, মানে private-c. Terraform আসবে পর্ব ৫২-তে।
৭ · বৃদ্ধির পরিকল্পনা আর Kubernetes-এর IP ক্ষুধা
Subnet-এর মাপ বেশিরভাগ provider-এ পরে সহজে বদলানো যায় না। AWS-এ subnet-এর CIDR বদলানো যায় না; মুছে নতুন বানাতে হয়, আর ভেতরের সব কিছু সরাতে হয়। Google-এ subnet বড় করা যায়, ছোট নয়। তাই আগে থেকেই ভাবুন: VPC-তে একটি secondary CIDR পরে যোগ করা অনেক provider-এ সম্ভব, কিন্তু সেটি জরুরি পথ, নকশার বিকল্প নয়।
VM গোনা সহজ। ঝামেলা বাধায় container. Kubernetes-এর নকশায় প্রতিটি pod নিজের IP পায় (বিস্তারিত পর্ব ৪৩-এ)। কোথা থেকে পাবে, তা ঠিক করে CNI plugin. AWS-এর VPC CNI-র মতো নকশায় pod সরাসরি VPC-র ঠিকানা পায়, আর দ্রুত চালু হওয়ার জন্য node আগে থেকেই কিছু warm IP ধরে রাখে। ফলে দশটি VM-এর জায়গায় হঠাৎ শতাধিক ঠিকানা উধাও। মোট হিসাব:
এবার দেখুন একটি IP সংকট কীভাবে আসে। একটি কাল্পনিক দল 10.30.1.0/24 subnet-এ cluster চালাচ্ছে, ব্যবহারযোগ্য ঠিকানা ২৫১। ধরে নিই node-প্রতি warm IP ১০টি। আসল সংখ্যা CNI-র setting আর version-ভেদে আলাদা।
| Node | |
| Warm IP/node | |
| Pod | |
| Subnet-এ IP লাগে | |
| Subnet-এ খালি | |
| Pod subnet-এ খালি |
- সাধারণ দিন। ৪ node, ৮০ pod. IP খরচ ৪ + ৪০ + ৮০ = ১২৪, খালি ১২৭। Dashboard সবুজ, কেউ চিন্তিত নন।
- ঈদের সেল। Pod ১৬০, node ৮ হলো। খরচ ৮ + ৮০ + ১৬০ = ২৪৮, খালি মাত্র ৩। Application এখনো ঠিক চলছে, তাই কোনো alert বাজেনি।
- আরও ২০ pod দরকার। ৯ node-এ লাগবে ৯ + ৯০ + ১৮০ = ২৭৯, আছে ২৫১, ঘাটতি ২৮। নতুন pod আটকে থাকে
ContainerCreatingঅবস্থায়। লগের বার্তাটি নমুনা; CNI ভেদে শব্দ আলাদা হয়। - ভুল জায়গায় খোঁজা। CPU আর memory ঠিক আছে। VPC-তে হাজার হাজার ঠিকানা খালি। কিন্তু pod পায় শুধু নিজের subnet থেকে, আর subnet-এ খালি ৩টি। মাপতে হয় subnet ধরে, VPC ধরে নয়।
- তাৎক্ষণিক উপশম। Warm IP ১০ থেকে ২ করা হলো। খরচ ৯ + ১৮ + ১৮০ = ২০৭, খালি ৪৪। সেল বাঁচল, তবে pod চালু হতে একটু বেশি সময় লাগতে পারে। এটি মলম, চিকিৎসা নয়।
- স্থায়ী সমাধান। VPC-তে secondary CIDR
100.64.0.0/18থেকে pod-এর আলাদা subnet. ব্যবহারযোগ্য ১৬,৩৭৯, pod আর warm মিলিয়ে ১৯৮ গেলে খালি ১৬,১৮১। পুরোনো subnet-এ শুধু ৯টি node, খালি ২৪২। - আবার যেন না ঘটে। প্রতিটি subnet-এর খালি ঠিকানার ওপর alert, ধরুন ব্যবহার ৮০% ছাড়ালে। আর cluster-এর সর্বোচ্চ pod ধরে আগেই হিসাব। Alert আসবে পর্ব ৬৬-তে।
100.64.0.0/10 হলো shared address space (RFC 6598, ২০১২), যা মূলত carrier-grade NAT-এর জন্য রাখা। কিছু provider pod-এর জন্য এটি ব্যবহারের পথ দেখায়, কারণ এটি সাধারণত অফিসের network-এ থাকে না। তবে কিছু network-এ থাকতে পারে, আর এই পরিসরের pod-কে অফিস থেকে সরাসরি পাওয়া না-ও যেতে পারে। আগে যাচাই করুন।
| পথ | কী বদলায় | মূল্য |
|---|---|---|
| Warm IP কমানো | ফাঁকা ধরে রাখা ঠিকানা কমে | Pod চালু হতে একটু দেরি, API call বাড়ে |
| Secondary CIDR | Pod আলাদা পরিসরে যায় | Node-এর setting, পুনরায় চালু করা |
| Prefix delegation | Node একসাথে ছোট block পায়, যেমন /28 | Subnet-এ ভাঙা জায়গা থাকলে block মেলে না |
| Overlay CNI | Pod-এর ঠিকানা VPC-র বাইরের আলাদা পরিসরে | Pod-কে VPC থেকে সরাসরি পাওয়া যায় না, overhead |
| IPv6 | Pod-প্রতি ঠিকানার অভাব আর থাকে না | সব নির্ভরতা IPv6 বুঝতে হবে |
Provider-ভেদে নকশা আলাদা। GKE-র VPC-native cluster-এ সাধারণত pod-এর জন্য subnet-এর secondary range থাকে, আর প্রতি node একটি ছোট block পায়; default হিসেবে /24-এর কথা নথিতে পাওয়া যায়। Azure CNI Overlay-তে pod VNet-এর বাইরের আলাদা পরিসরে থাকে। Kubernetes-এর Service CIDR-ও (পর্ব ৪৫) আলাদা একটি পরিসর, আর সেটিও VPC বা অফিসের সাথে মিলতে দেওয়া যাবে না।
৮ · Overlap এড়ানো — VPC, অফিস আর peering
দুটি ভিন্ন গ্রামে একই নামের “রহিম মিয়া” থাকলে সমস্যা নেই। সমস্যা শুরু হয় দুই গ্রাম এক ইউনিয়নে মিশলে আর চিঠিতে শুধু নাম লেখা থাকলে। Network-এও তাই। দুটি VPC আলাদা থাকলে একই CIDR চলে। কিন্তু peering, VPN বা on-premises অফিসের সাথে জোড়া দিলে router বুঝতে পারে না 10.20.5.9 কোন দিকে পাঠাবে। সাধারণত provider এমন peering নিজেই নাকচ করে।
CIDR block কখনো আংশিক মেলে না: হয় আলাদা, নয় একটি অন্যটির ভেতরে
দ্বিতীয় লাইনটি একটি সুন্দর সত্য। প্রতিটি CIDR block তার নিজের মাপের গুণিতকে শুরু হয়, তাই দুটি block অর্ধেক মিলতে পারে না। নিচের checker আটটি network-এর ২৮ জোড়া মিলিয়ে দেখে, তারপর পরের খালি /16 খোঁজে। default-vpc-র 172.31.0.0/16 হলো AWS-এর default VPC-র পরিচিত পরিসর, আর docker0-র 172.17.0.0/16 হলো Docker bridge-এর সাধারণ default.
// Overlap checker: every pair of networks, then the next free /16.
const toInt = s => s.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(b => Math.floor(n / 2 ** b) % 256).join(".");
function parse(name, cidr) {
const [base, p] = cidr.split("/");
const size = 2 ** (32 - Number(p)), lo = toInt(base);
if (lo % size !== 0) throw new Error(`${cidr}: host bits are set`);
return { name, cidr, size, lo, hi: lo + size - 1 };
}
const nets = [
["shop-prod", "10.20.0.0/16"],
["shop-stage", "10.21.0.0/16"],
["analytics", "10.20.128.0/17"],
["office-vpn", "192.168.10.0/24"],
["partner", "172.16.0.0/12"],
["default-vpc", "172.31.0.0/16"],
["docker0", "172.17.0.0/16"],
["pods", "100.64.0.0/16"],
].map(([n, c]) => parse(n, c));
const overlaps = (a, b) => a.lo <= b.hi && b.lo <= a.hi;
let clashes = 0;
for (let i = 0; i < nets.length; i++) for (let j = i + 1; j < nets.length; j++) {
const a = nets[i], b = nets[j];
if (!overlaps(a, b)) continue;
const [big, small] = a.size >= b.size ? [a, b] : [b, a];
console.log(`CLASH ${big.name} ${big.cidr} contains ${small.name} ${small.cidr}`);
console.log(` shared addresses: ${small.size}`);
clashes++;
}
console.log(`checked ${nets.length * (nets.length - 1) / 2} pairs, ${clashes} clashes`);
// Search upward from 10.20.0.0 for a /16 that touches nothing.
let c = parse("candidate", "10.20.0.0/16");
while (nets.some(n => overlaps(n, c))) c = parse("candidate", `${toIp(c.lo + c.size)}/16`);
console.log(`next free /16: ${c.cidr}`);আউটপুট:
CLASH shop-prod 10.20.0.0/16 contains analytics 10.20.128.0/17
shared addresses: 32768
CLASH partner 172.16.0.0/12 contains default-vpc 172.31.0.0/16
shared addresses: 65536
CLASH partner 172.16.0.0/12 contains docker0 172.17.0.0/16
shared addresses: 65536
checked 28 pairs, 3 clashes
next free /16: 10.22.0.0/16
প্রথম সংঘর্ষটি বিপজ্জনক: analytics দলের VPC পুরো data স্তরের ওপর পড়ছে, তাই peering হবে না। পরের দুটি দেখায়, ঠিকানা না বদলেও অংশীদারের /12 আপনার default VPC বা container bridge-এর সাথে মিলতে পারে। Docker-এর ঘটনাটি সূক্ষ্ম: host-এর route 172.17.x.x-কে bridge-এ পাঠায়, তাই সেই পরিসরের দূরের server-কে পাওয়া যায় না, কোনো error ছাড়াই। সমাধান হিসেবে শেষ লাইন পরের খালি পরিসর দেখাল: 10.22.0.0/16.
প্রতিষ্ঠানের পুরো ঠিকানার ছক
একটি VPC ঠিক রাখা যথেষ্ট নয়। ঠিকানা ভাগ করতে হবে ওপর থেকে। 10.0.0.0/8-কে ১৬টি /12-তে ভাগ করা যায়, আর প্রতিটি /12 থেকে ১৬টি /16 আসে। ধরুন একটি /12 এক region-এর, আর তার /16-গুলো সেখানকার VPC-র। Production, staging আর development আলাদা জায়গা পায়। এই খাতা একটি শেয়ার করা spreadsheet দিয়ে শুরু হতে পারে, তবে বড় হলে IPAM টুল লাগে, যেমন provider-এর IPAM সেবা বা খোলা উৎসের NetBox. তাতে দুই দল একই পরিসর নিতে পারে না।
Overlap হয়ে গেলে পথ তিনটি: একটি পাশের ঠিকানা বদলানো (কষ্টকর, কিন্তু পরিষ্কার), মাঝখানে NAT বসিয়ে ঠিকানা অনুবাদ করা (কাজ চলে, জটিলতা স্থায়ী), অথবা private endpoint-এর মতো নির্দিষ্ট সেবা ভাগ করা (পর্ব ২৮)। তিনটির চেয়েই সস্তা হলো আগে দুই মিনিট মিলিয়ে নেওয়া। অফিসের VPN-এ বাসার 192.168.1.0/24-ও মাঝে মাঝে ঠোকাঠুকি বাধায়, তাই ওই পরিসর VPC-তে না নেওয়াই ভালো। Google-এর auto mode VPC নিজে থেকে 10.128.0.0/9 থেকে subnet বানায়; সব VPC একই পরিসর পায় বলে peering-এ ঠোকাঠুকি হতে পারে, তাই production-এ custom mode-ই নিরাপদ।
হিসাবের ভেতরটি দেখতে চাইলে নিচের Bash block চালান। এটি ঠিকানাকে ৩২-bit সংখ্যায় বদলায়: প্রথম octet ২৪ bit বাঁয়ে সরে, পরেরটি ১৬, তারপর ৮। এরপর mask দিয়ে AND করলে network বেরিয়ে আসে। Router-ও মূলত এই কাজই করে।
#!/usr/bin/env bash
# IPv4 <-> integer with shifts, then a subnet membership test.
set -euo pipefail
ip2int() {
local a b c d
IFS=. read -r a b c d <<< "$1"
echo $(( (a << 24) | (b << 16) | (c << 8) | d ))
}
int2ip() {
local n=$1
printf '%d.%d.%d.%d\n' $(( (n >> 24) & 255 )) $(( (n >> 16) & 255 )) \
$(( (n >> 8) & 255 )) $(( n & 255 ))
}
mask_of() { echo $(( (0xFFFFFFFF << (32 - $1)) & 0xFFFFFFFF )); }
ip=10.20.37.5; prefix=20
n=$(ip2int "$ip"); mask=$(mask_of "$prefix"); net=$(( n & mask ))
last=$(( net | (~mask & 0xFFFFFFFF) ))
echo "$ip = $n"
echo "mask /$prefix = $(int2ip "$mask")"
echo "network = $(int2ip "$net")"
echo "last = $(int2ip "$last")"
echo "size = $(( last - net + 1 ))"
echo "--- is it inside 10.20.32.0/20?"
want=$(ip2int 10.20.32.0)
for host in 10.20.32.0 10.20.47.255 10.20.48.1 10.21.37.5; do
if (( ($(ip2int "$host") & mask) == want )); then r=yes; else r=no; fi
printf '%-14s %s\n' "$host" "$r"
doneআউটপুট:
10.20.37.5 = 169092357
mask /20 = 255.255.240.0
network = 10.20.32.0
last = 10.20.47.255
size = 4096
--- is it inside 10.20.32.0/20?
10.20.32.0 yes
10.20.47.255 yes
10.20.48.1 no
10.21.37.5 no
10.20.37.5 হলো ১৬,৯০,৯২,৩৫৭। Mask-এর AND host bit মুছে দেয়, তাই network দাঁড়ায় 10.20.32.0. Subnet-এর সীমানায় 10.20.47.255 ভেতরে, আর পরের subnet-এর 10.20.48.1 বাইরে। Bash-এর সংখ্যা ৬৪-bit, তাই এখানে shift নিরাপদ, তবে সে কারণেই 0xFFFFFFFF দিয়ে ৩২ bit-এ ছেঁটে নিতে হয়েছে। একটি সাবধানতা: Bash 010-কে octal ধরে, তাই শূন্য-দিয়ে-শুরু octet ভুল হিসাব দেবে।
৯ · IPv6 সংক্ষেপে — আর ঠিকানার অভাব থাকে না?
IPv6-এর ঠিকানা ১২৮ bit, আর তার বিস্তারিত আছে Computer Networks-এর IPv6 পর্বে। Cloud-এর চোখে চারটি জিনিস বদলায়:
- মাপের ভাবনা আলাদা: AWS-এর মতো provider VPC-কে সাধারণত /56 দেয়, আর প্রতিটি subnet /64 হয়। একটি /64-এ 264টি ঠিকানা, তাই host গোনার প্রশ্নই ওঠে না। ঠিকানা সাধারণত provider-এর দেওয়া, আপনার বাছা নয়।
- Public-private-এর অর্থ বদলায়: অনেক IPv6 ঠিকানা বিশ্বজুড়ে route হয়। তাই “private ঠিকানা” বলে আড়াল থাকে না; আড়াল আসে route আর firewall থেকে। শুধু বাইরে যাওয়ার জন্য AWS-এর আছে egress-only gateway.
- সাধারণত দুটি একসাথে চলে: Dual-stack মানে প্রতিটি resource-এ IPv4 আর IPv6 দুটিই। IPv4-এর নকশার দায় তাতে যায় না।
- IPv4-এর দাম একটি কারণ: AWS ২০২৪ সাল থেকে public IPv4 ঠিকানার জন্য আলাদা ঘণ্টাভিত্তিক দাম ধরে। তাই IPv6 এখন শুধু ঠিকানার নয়, বিলেরও প্রশ্ন। আসল দাম provider-এর পাতায় দেখুন।
আরও গভীরে: Multi-tenant network virtualization-এর নকশা পাবেন Koponen et al. “Network Virtualization in Multi-tenant Datacenters” (NSDI ২০১৪) আর Google-এর Andromeda (NSDI ২০১৮) পেপারে। Andromeda দেখায়, প্রতিটি packet-এর পথ ঠিক করা hypervisor-এর সফটওয়্যার আর কেন্দ্রীয় control plane কীভাবে ভাগ করে নেয়। VPC-র route-এর সংখ্যা, হঠাৎ বেশি traffic আর network quota-র সীমা এই নকশা থেকেই আসে। RFC 1918 আর RFC 6598 পড়লে দেখবেন, পরিসরগুলোর পেছনে কত যুক্তিতর্ক ছিল।
পরীক্ষা ও ইন্টারভিউতে:
- Subnet-কে public বানায় কী? Internet gateway-তে যাওয়ার route; VM-এ public IP-ও লাগে।
- AWS-এ /24-এ কতটি ঠিকানা ব্যবহার করা যায়? ২৫৬ − ৫ = ২৫১।
- NAT gateway কোন subnet-এ থাকে? AWS-ধরনের নকশায় public subnet-এ, আর private subnet-এর route সেখানে আসে।
- দুটি VPC-র CIDR এক হলে peering হবে? না; ঠিকানা মিললে route ঠিক করা যায় না।
- VPC-তে ঠিকানা আছে, তবু pod আটকে কেন? Subnet ফুরিয়েছে; pod পায় subnet থেকে, VPC থেকে নয়।
১০ · AI-এর যুগে VPC-র নকশা — হিসাব যাচাই আপনার
AI কয়েক সেকেন্ডে পুরো VPC-র Terraform লিখে দেয়। দেখতেও গোছানো হয়। কিন্তু AI আপনার অফিসের CIDR, পুরোনো VPC বা অংশীদারের network চেনে না, যদি না আপনি বলে দেন। আর ঠিকানার ভুল পরে সারাতে subnet ভেঙে সব কিছু সরাতে হয়, তাই এই ভুলের দাম বেশি।
| AI-এর ভুল | কেন বিপদ | যাচাই |
|---|---|---|
সব জায়গায় 10.0.0.0/16 | পরে peering বা VPN-এ overlap | IPAM বা overlap checker |
Database subnet-এ public IP, SSH-এ 0.0.0.0/0 | গোটা ইন্টারনেট থেকে দরজা খোলা | Route আর firewall নিজে পড়া |
| “usable = 2h − 2” দিয়ে হিসাব | Provider-এর কাটা ঠিকানা বাদ পড়ে | নথি দেখে হিসাব |
| /24-এ Kubernetes cluster | কিছুদিন পরেই IP সংকট | সর্বোচ্চ node ও pod ধরে হিসাব |
| অস্তিত্বহীন resource argument | terraform plan-এ error, বা ভুল default | Provider-এর সরকারি নথি |
| প্রতি AZ-এ NAT না ভেবেই বসানো বা না বসানো | খরচ বা এক AZ-নির্ভরতা | Budget alert আর বিলের হিসাব |
AI-কে সংখ্যা, সীমা আর আগে থেকে থাকা network সব বলে দিন, আর ভুল ধরার কাজটিও তাকেই দেওয়ার আগে নিজের checker চালান। নিচের কাঠামো ব্যবহার করুন:
AI-এর নকশা প্রয়োগের আগে — চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১EC2 তো ২০০৬ সালেই চলছিল। তাহলে Amazon-কে ২০০৯ সালে VPC আনতে হলো কেন?
২০০৬ সালের EC2-তে সব গ্রাহকের VM একটি সমতল, ভাগ করা network-এ থাকত। প্রতিটি VM provider-এর বেছে দেওয়া একটি ঠিকানা পেত, আর সেটি পুনরায় চালু করলে বদলেও যেত। পরে এই ব্যবস্থার নাম হয় EC2-Classic. ছোট web app-এর জন্য এটি চলত। কিন্তু প্রতিষ্ঠানগুলোর দরকার ছিল আরও কিছু।
- পরিচিত ঠিকানা: নিজের অফিসের network-এর মতো নিজের ঠিকানার পরিকল্পনা। পুরোনো সফটওয়্যারে ঠিকানা অনেক সময় বাঁধা থাকত।
- অফিসের সাথে জোড়া: ঠিকানা না মিললে VPN দিয়ে cloud-কে অফিসের অংশ বানানো যায় না।
- স্তর ভাগ: Database-কে আলাদা অংশে রাখা, যেমনটি data center-এ করা হতো।
২০০৯ সালে VPC এই সুযোগ দিল, আর একই সময়ে overlay-র প্রযুক্তিও পরিণত হচ্ছিল। প্রকৌশলের দিক থেকে কঠিন কাজ ছিল গ্রাহকের দেখা ঠিকানা আর আসল যন্ত্রের ঠিকানা আলাদা করা। প্রতিটি packet খামে মুড়ে, কোন VM কোন যন্ত্রে আছে তা একটি কেন্দ্রীয় হিসাবে রেখে পাঠাতে হয়। পরে নতুন account-এ VPC-ই default হয়, আর ২০২০-এর দশকের শুরুতে EC2-Classic বন্ধের ঘোষণা আসে।
এখানে একটি বড় শিক্ষা আছে। Cloud-এর শুরুর আকর্ষণ ছিল network নিয়ে কম ভাবা। কিন্তু বড় গ্রাহকদের চাহিদা গেল উল্টো দিকে: তাঁরা নিয়ন্ত্রণ চাইলেন, কারণ নিরীক্ষা, নিরাপত্তা আর পুরোনো সিস্টেম সবই ঠিকানা আর পথের ওপর দাঁড়িয়ে। ফলে আজ একজন cloud engineer-কে CIDR আর route বুঝতেই হয়, যদিও নিচের switch তিনি কখনো চোখে দেখেন না।
মূল উপলব্ধি: VPC প্রযুক্তির বিলাসিতা নয়। এটি ব্যবসার চাহিদা, মানে পুরোনো জগতের সাথে জোড়া আর নিয়ন্ত্রণ, থেকে এসেছে। তাই নকশা করার সময়ও আগে ভাবুন কোন network-এর সাথে জুড়তে হবে।
প্র ০২RFC 1918 না থাকলে আজ cloud কি অন্যরকম হতো? ব্যক্তিগত ঠিকানার আসল দাম কী?
১৯৯০-এর দশকের শুরুতে পরিষ্কার হলো, IPv4 ঠিকানা একদিন ফুরাবে। প্রতিষ্ঠানগুলো ভেতরের network-এ হয় অনুরোধ করে বিশ্বজোড়া ঠিকানা নিত, নয় ইচ্ছেমতো যেকোনো ঠিকানা ব্যবহার করত। ১৯৯৪ সালে RFC 1597 ভেতরের ব্যবহারের জন্য কিছু পরিসর ঘোষণা করল। মজার ব্যাপার, তখনই বিরোধিতাও এলো। একই বছর RFC 1627-এর শিরোনামই ছিল “Network 10 Considered Harmful”. লেখকদের যুক্তি ছিল: ঠিকানা অনন্য না থাকলে প্রতিষ্ঠান জোড়া লাগলে ঝামেলা হবে, আর ঠিকানা-সংকটের আসল সমাধান পিছিয়ে যাবে। ১৯৯৬ সালে RFC 1918 সেই পরিসরগুলো পাকা করল। একই সময়ের NAT (RFC 1631, ১৯৯৪) ব্যক্তিগত ঠিকানাকে ইন্টারনেটে পাঠানোর পথ দিল।
তিরিশ বছর পরে দুই পক্ষই ঠিক। ব্যক্তিগত ঠিকানা আর NAT ইন্টারনেটকে বাঁচিয়েছে; IANA-র ফাঁকা ঠিকানার ভান্ডার ফুরায় ২০১১ সালে, এবং তার পরেও নেট চলছে। ওদিকে সমালোচকদের ভয়ও সত্যি হলো। দুই কোম্পানি একীভূত হলে দুই পক্ষের 10.0.0.0/16 ঠোকাঠুকি করে। এক দলের VPC অন্য দলের সাথে মেলে না। একই পরিসর অফিসে, VPN-এ, container-এ বারবার ফিরে আসে।
Cloud-এর VPC এই সিদ্ধান্তের ওপরেই দাঁড়িয়ে। Overlay না থাকলে একই ঠিকানা লক্ষ গ্রাহক ব্যবহার করতে পারতেন না। আজকের overlap-এর সব সমস্যা তাই একটি পুরোনো লেনদেনের কিস্তি: সবার জন্য বিনামূল্যের ঠিকানা, বিনিময়ে অনন্যতার গ্যারান্টি নেই।
এই ইতিহাস নকশায় একটি কাজের অভ্যাস শেখায়: ব্যক্তিগত ঠিকানাকেও এমনভাবে ভাগ করুন যেন তা প্রতিষ্ঠানের ভেতরে অনন্য। পৃথিবীর কেউ তা নিশ্চিত করবে না, সে দায়িত্ব আপনার IPAM-এর।
মূল উপলব্ধি: “Private” মানে নিরাপদ বা অনন্য নয়। মানে শুধু এটি ইন্টারনেটে route হয় না। অনন্যতা রক্ষা করা আপনার নিজের কাজ।
প্র ০৩তাহলে প্রতিটি VPC-কে সবচেয়ে বড় মাপ দিলেই তো ঠিকানা ফুরানোর ভয় যায়। সমস্যা কোথায়?
প্রথম নজরে যুক্তিটি ভালো: ঠিকানা তো বিনামূল্যে। কিন্তু একটু হিসাব করুন। 10.0.0.0/8-এ ঠিক ২৫৬টি /16 আছে। ১০০টি দল প্রতিটি region-এ production, staging আর development-এর জন্য একটি করে /16 নিলে, তিন region-এই ৯০০টি লাগে। পুরো 10/8 শেষ হয়ে যায়, যদিও বেশিরভাগ VPC-তে কয়েক ডজন VM মাত্র। RFC 1918-এর বাকি দুটি পরিসর মিলিয়েও সংখ্যাটি অনেক বাড়ে না। ঠিকানা বিনামূল্যের, কিন্তু অফুরন্ত নয়, বিশেষ করে যেখানে সব network একে অন্যের সাথে জুড়তে পারতে হবে।
দ্বিতীয় সমস্যা ঠোকাঠুকি। পরিসর যত বড়, অন্য কারো ঠিকানার সাথে মেলার সম্ভাবনা তত বেশি। পরিচিত উদাহরণ: কেউ প্রতিষ্ঠানের network-এ পুরো 172.16.0.0/12 নিলেন, আর সেটি Docker-এর default আর অনেক অফিস network-এর ওপর পড়ল।
তৃতীয়টি পরিচালনা। বড় subnet মানে বড় blast radius: একটি network নিয়ম বা ভুল route অনেক বেশি কিছুকে ছোঁয়। এক /16 subnet-এ হাজারো জিনিস থাকলে firewall-এর নিয়মে স্তর আলাদা করা কঠিন হয়।
উল্টো দিকে খুব ছোট মাপও ভুল। /24 subnet-এর cluster ঈদের ভিড়ে আটকে যায়। ভালো পথ মাঝখানে: প্রতিষ্ঠানের ঠিকানাকে ওপর থেকে ভাগ করুন, প্রতিটি VPC-কে তার প্রকৃত বৃদ্ধির মাপ দিন, আর Kubernetes-এর মতো ঠিকানা-খাদককে আলাদা পরিসরে রাখুন। ছোট দলের development VPC-তে /20 যথেষ্ট; production-এ /16. সব মাপ একটি খাতায় লিখে রাখুন, যাতে পরের দল দেখে নিতে পারে। আর কিছু খালি রাখুন, কারণ পরে আলাদা পরিসর জোড়া যায়, কিন্তু ভেতরের subnet বদলানো কঠিন।
মূল উপলব্ধি: ঠিকানা প্রতিষ্ঠানের সম্পদ। মাপ ঠিক করার প্রশ্ন “এই VPC-তে কত লাগবে” শুধু নয়, “পুরো প্রতিষ্ঠানের ভাগের কতটা নিচ্ছি” তাও।
প্র ০৪AWS কেন subnet-কে এক AZ-এ বাঁধল, আর Google কেন region-জোড়া subnet বেছে নিল? কোনটি ভালো?
দুটি নকশা দুটি ভিন্ন প্রশ্নের উত্তর। AWS-এর ধরন বলে: subnet একটি failure domain. একটি AZ পড়লে ঠিক কোন subnet গেল তা জানা যায়, আর প্রতিটি AZ-এর জন্য আলাদা route table রাখা যায়। ধরুন প্রতি AZ-এ একটি NAT gateway আছে। AZ-a-র private subnet যায় AZ-a-র NAT-এ। অন্য AZ পড়লেও এই পথ বদলায় না। Load balancer, database আর autoscaling সবাই “subnet-এর তালিকা” পড়ে কোন zone-এ চলবে তা ঠিক করে। ফলে নকশাটি স্পষ্ট, কিন্তু subnet অনেক: ৩ স্তর × ৩ AZ = ৯, আর ঠিকানাও ভাগ হয়ে যায়। এক AZ-এর subnet ফুরিয়ে গেলে অন্য AZ-এর খালি ঠিকানা কোনো কাজে আসে না।
Google আর Azure-এর ধরন বলে: ঠিকানা আর failure domain আলাদা ব্যাপার। Subnet region-জোড়া, তাই একই পরিসর থেকে যেকোনো zone-এ VM বসে। Zone নির্বাচন VM-এর একটি বৈশিষ্ট্য। ফলে ঠিকানার খাতা সরল, ঠিকানার অপচয় কম, আর VM-কে অন্য zone-এ সরালেও একই subnet-এ থাকা যায়। মূল্য হলো: ঠিকানা দেখে zone বোঝা যায় না, আর route-এর মাধ্যমে zone-ভিত্তিক আলাদা নিয়ম লেখাও কঠিন।
Google-এর আরেকটি পার্থক্য হলো global VPC. একটি VPC অনেক region-এ subnet রাখতে পারে, আর সেগুলো peering ছাড়াই ভেতরের ঠিকানায় কথা বলতে পারে। AWS বা Azure-এ দুই region জুড়তে আলাদা ব্যবস্থা লাগে (পর্ব ২৮)। ওদিকে এক VPC-র একটি ভুল নিয়ম সব region-এ ছড়িয়ে পড়তে পারে।
কোনটি ভালো? প্রশ্নটি ভুল। দুটিতেই ভালো multi-zone নকশা হয়। শুধু সতর্ক হতে হয় যেন এক provider-এর অভ্যাস অন্যটিতে না চলে আসে। মনে রাখবেন, আচরণগুলো সময়ের সাথে বদলাতে পারে, তাই নথি দেখে নিন।
মূল উপলব্ধি: নকশার পার্থক্য একটি প্রশ্নে আসে: failure domain কি ঠিকানার অংশ হবে, নাকি resource-এর গুণ? উত্তর বুঝলে নতুন provider-ও দ্রুত পড়তে পারবেন।
প্র ০৫IPv6 এলে কি CIDR পরিকল্পনা, NAT আর এই পর্বের সব ঝামেলা শেষ হয়ে যাবে?
আংশিক হ্যাঁ, আংশিক না। ঠিকানার অভাব মিটে যায়, এটি সত্যি। একটি /64 subnet-এ 264 ঠিকানা, যা পুরো IPv4-এর 232 গুণ। তাই pod-এর IP সংকটের একটি পরিষ্কার সমাধান IPv6; AWS-এর EKS-সহ বড় Kubernetes সেবা এই পথ দিয়েছে। Overlap-ও অনেকটা কমে, কারণ provider-এর দেওয়া ঠিকানা সাধারণত বিশ্বে অনন্য। ফলে দুই VPC জোড়ার সময় ঠোকাঠুকির ভয় থাকে না।
তবে কয়েকটি জিনিস থেকে যায়। প্রথমত, নিরাপত্তা। IPv4-এর দুনিয়ায় NAT ভুল করে একটি পাঁচিলের কাজও করত। IPv6-তে ঠিকানাটি সরাসরি পৌঁছানো যায়, তাই route আর firewall-এর ভুল সরাসরি উন্মুক্ত করে। Egress-only gateway এই কারণেই আছে। দ্বিতীয়ত, আগের জগতের সাথে জোড়া। বেশিরভাগ অফিস, অনেক API, পুরোনো লাইব্রেরি আর কিছু managed সেবা IPv4 চায়। তাই dual-stack চলে, আর সেখানে IPv4-এর সব নকশা থেকেই যায়। IPv6-only network-কে পুরোনো IPv4 সেবার সাথে জুড়তে NAT64 আর DNS64-এর মতো অনুবাদ লাগে। তৃতীয়ত, লোকের অভ্যাস। Log, dashboard, firewall-এর নিয়ম আর alert সব জায়গায় নতুন ঠিকানা বুঝতে হবে। ছোট একটি regex-ই অনেক সময় IPv4 ধরে নিয়ে লেখা। এসব বদলাতে সময় আর পরীক্ষা লাগে, যা বিলে সরাসরি দেখা যায় না।
পরিকল্পনাও যায় না, শুধু বদলায়। প্রশ্নটি “কতটি host” থেকে “কীভাবে সুন্দরভাবে ভাগ করব, যাতে route আর নিয়ম সংক্ষেপ করা যায়”। IPv6-এও ULA (fd00::/8, RFC 4193) নামে ব্যক্তিগত ধরন আছে। ইতিহাস বলে, IPv6-এর মান প্রায় তিন দশকের পুরোনো, তবু রূপান্তর এখনো চলছে। AWS-এর public IPv4 দাম এই রূপান্তরে একটি অর্থনৈতিক চাপ যোগ করেছে।
মূল উপলব্ধি: IPv6 ঠিকানার সংকট মেটায়, নকশার দায় নয়। Route, firewall আর স্তরের ভাবনা একই থাকে; ঠিকানা শুধু আর সীমাবদ্ধতা থাকে না।
অনুশীলন
কাগজ-কলমে করুন, তারপর উত্তর মেলান। কোনো cloud account লাগবে না।
-
পুরো হিসাব: একটি VPC
10.30.0.0/18. (ক) এখান থেকে কতগুলো /22 হয়? (খ) প্রতিটিতে AWS-এর নিয়মে ব্যবহারযোগ্য ঠিকানা কত, আর সবগুলোতে মোট কত? (গ) পঞ্চম /22-টি কোথায় শুরু? (ঘ) ১,৫০০ host আর ২০% বৃদ্ধির জন্য সবচেয়ে ছোট কোন subnet লাগবে?- (ক) ধার করা bit ২২ − ১৮ = ৪, তাই ১৬টি /22.
- (খ) প্রতিটিতে 210 = ১,০২৪, ব্যবহারযোগ্য ১,০১৯। মোট ১৬ × ১,০১৯ = ১৬,৩০৪।
- (গ) তৃতীয় octet-এ লাফ ৪। পঞ্চমটি ৪ নম্বর ঘর (গোনা ০ থেকে), তাই ৪ × ৪ = ১৬:
10.30.16.0/22. - (ঘ) ১,৫০০ × ১.২ = ১,৮০০; ৫ যোগে ১,৮০৫। 210 = ১,০২৪ ছোট, 211 = ২,০৪৮ যথেষ্ট, তাই /21.
-
নকশার সমালোচনা: একজন লিখলেন: “VPC
10.0.0.0/16, পুরোটাই একটি subnet, একটি AZ-এ। App আর database সেখানেই, দুটিতেই public IP, যাতে SSH সহজ হয়। অফিসের network10.0.0.0/16-এর সাথে VPN জুড়ব।” অন্তত পাঁচটি সমস্যা ধরুন, আর একটি ভালো নকশা বলুন।- Overlap: VPC আর অফিস একই পরিসরে, VPN-এর route ঠিক হবে না। অন্য পরিসর নিতে হবে।
- এক AZ: Zone পড়লে সব বন্ধ।
- এক subnet: স্তর আলাদা হয়নি, route দিয়ে database-কে আড়াল করা যায় না।
- Database-এ public IP: অকারণে ইন্টারনেটের দিকে উন্মুক্ত।
- SSH-এর পথ: Public IP না দিয়ে session সেবা বা কড়া নিয়মের bastion ব্যবহার করা উচিত।
ভালো নকশা: অব্যবহৃত /16, যেমন
10.20.0.0/16, তিন AZ-এ public, private আর data স্তর, load balancer শুধু public-এ, database data-য়, আর overlap checker দিয়ে আগে মিলিয়ে নেওয়া। -
ফল আগে বলুন: AWS-এর নিয়মে VPC
10.20.0.0/16-এ এই পাঁচটি subnet পরপর চাওয়া হলো: A10.20.0.0/20, B10.20.16.0/20, C10.20.8.0/21, D10.21.0.0/24, E10.20.32.0/29. শেষে কোন subnet-গুলো থাকবে, আর মোট ব্যবহারযোগ্য ঠিকানা কত?- A, B: সফল।
- C: নাকচ।
10.20.8.0/21মানে 10.20.8.0 থেকে 10.20.15.255, যা A-র ভেতরে। - D: নাকচ। পরিসরটি VPC-র বাইরে।
- E: নাকচ। AWS-এ subnet-এর সবচেয়ে ছোট মাপ /28; অন্য provider-এ সীমা আলাদা।
থাকবে A আর B. ব্যবহারযোগ্য ২ × ৪,০৯১ = ৮,১৮২।
-
Pod-এর ধারণক্ষমতা: তিন AZ-এ একটি করে /21 subnet, AWS-এর কাটা ঠিকানা ধরে। প্রতি node-এ ২৯টি pod আর ৫টি warm IP. এই নকশায় সর্বোচ্চ কতটি node আর কতটি pod চলবে? তিনটি AZ সমানভাবে ভরা ধরুন।
/21-এ ২,০৪৮, ব্যবহারযোগ্য ২,০৪৩। প্রতি node-এর খরচ ১ + ৫ + ২৯ = ৩৫। ২,০৪৩ ÷ ৩৫ ≈ ৫৮.৩৭, তাই AZ-প্রতি ৫৮টি node (৫৮ × ৩৫ = ২,০৩০)। তিন AZ-এ ৩ × ৫৮ = ১৭৪ node, আর ১৭৪ × ২৯ = ৫,০৪৬ pod. সীমা একটি AZ-এর subnet দিয়েই ঠিক হয়: কোনো AZ আগে ভরে গেলে সেখানে নতুন pod আটকে যাবে, অন্য AZ-এ জায়গা থাকলেও।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি নতুন VPC-র ঠিকানা নকশার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- অফিস, অন্য VPC আর partner-এর সব পরিসরের তালিকা করা
- Overlap মিলিয়ে একটি খালি VPC CIDR বাছা
- স্তর আর AZ-এর সংখ্যা থেকে ধার করা bit হিসাব করা
- কাটা ঠিকানা আর pod ধরে subnet-এর মাপ মিলিয়ে নেওয়া
- IaC-তে লিখে প্রয়োগ করা আর খালি ঠিকানার alert বসানো
একটি subnet 10.20.16.0/20. Provider প্রতি subnet-এ ৫টি ঠিকানা কেটে রাখলে ব্যবহারযোগ্য ঠিকানা কত?
- 4,096
- 4,094
- 4,091
- 251
AWS-ধরনের VPC-তে কোনো subnet-কে public বানায় কোনটি?
- Subnet-এর নামে “public” শব্দ থাকা
- Routing table-এ internet gateway-তে যাওয়ার route
- Subnet-এর CIDR 10.x দিয়ে শুরু হওয়া
- Subnet-এর মাপ /24 বা তার বড় হওয়া
নিচের কোন ঠিকানাটি RFC 1918-এর private পরিসরের বাইরে?
- 10.255.0.1
- 172.31.200.5
- 192.168.0.1
- 172.32.0.1
নিচের কোন জোড়া CIDR overlap করে?
- 10.20.0.0/16 আর 10.20.128.0/17
- 10.20.0.0/16 আর 10.21.0.0/16
- 10.20.0.0/20 আর 10.20.16.0/20
- 172.16.0.0/12 আর 172.32.0.0/16
Kubernetes-এর নতুন pod আটকে আছে, লগে IP না পাওয়ার বার্তা। VPC /16-এ অনেক ঠিকানা খালি, কিন্তু cluster-এর /24 subnet-এ খালি ২টি। সবচেয়ে সঠিক ব্যাখ্যা কোনটি?
- Node-এর CPU শেষ, তাই IP পাওয়া যাচ্ছে না
- VPC খালি থাকলে pod নিজে থেকেই অন্য subnet-এর ঠিকানা নেবে, তাই সমস্যা অন্য কোথাও
- Pod ঠিকানা পায় নিজের subnet বা নির্ধারিত পরিসর থেকে, আর সেটিই ফুরিয়েছে
- Internet gateway-র সংযোগ সীমা শেষ হয়েছে
Google Cloud-এর VPC-র সাধারণ নকশা সম্পর্কে কোন কথাটি ঠিক?
- VPC এক region-এ, subnet এক zone-এ
- VPC global, subnet একটি region জুড়ে
- VPC এক region-এ, subnet global
- VPC আর subnet দুটিই global
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- VPC সফটওয়্যারে বানানো নিজের network; AWS ও Azure-এ region-ভিত্তিক, Google-এ global.
- ঠিকানা = 232−p, আর ব্যবহারযোগ্য = ঠিকানা − provider-এর কাটা অংশ (AWS-এ ৫)।
- Route subnet-এর পরিচয় ঠিক করে: internet gateway মানে public, NAT মানে private, কোনো পথ না থাকলে isolated.
- আগে জায়গা রাখুন: নতুন AZ, নতুন স্তর আর pod-এর ঠিকানা হিসাবে ধরুন, আর মাপুন subnet ধরে।
- Overlap আগে মেলান: lo₁ ≤ hi₂ এবং lo₂ ≤ hi₁. প্রতিষ্ঠানের ঠিকানা ওপর থেকে ভাগ করুন।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২৬ · Route table, internet gateway আর NAT — packet কোন পথে যায়পরবর্তী পর্বSubnet-এর পথ ধরে packet-এর যাত্রা।
- ক্লাউড কম্পিউটিং ও DevOps · কোর্স হোম৮১টি পর্বপুরো কোর্সের রোডম্যাপ।
- Computer Networks · Subnettingগভীরে যানBinary হিসাব, VLSM আর route summarisation.
- Computer Networks · Cloud আর container নেটওয়ার্কিংপাশের ট্র্যাকVPC, overlay আর Kubernetes network-এর সারসংক্ষেপ।
- পর্ব ০৫ · Cloud-এর ভৌগোলিক কাঠামোআগের পর্বRegion আর availability zone-এর ভিত্তি।