এই পর্বে যা শিখবেন
- Public আর private hosted zone বানানো, আর registrar-এর সাথে জোড়া
- A, AAAA, CNAME, alias, MX, TXT, NS আর CAA কোন কাজে লাগে
- TTL কমিয়ে downtime ছাড়া site সরানো, আর পুরোনো server কখন বন্ধ করবেন
- Weighted, latency, geo আর failover routing বাছাই, সাথে failover-এর সময়ের হিসাব
- Split-horizon, VPC resolver, hybrid forwarding আর DNS-এর নিরাপত্তা
১ · Hosted zone — আপনার domain-এর রেজিস্টার খাতা
রাত দুইটায় একটি কাল্পনিক অনলাইন বাজার অ্যাপের দল নতুন region-এ সরে গেল। Server ঠিক আছে, load balancer ঠিক আছে, তবু ঢাকার কিছু ব্যবহারকারী পুরোনো site দেখছেন। অথচ চট্টগ্রামের অন্য কেউ দেখছেন নতুনটি। কেউ ভাবলেন, “DNS এখনো propagate হয়নি।” এই একটি বাক্যে যে ভুল ধারণা লুকিয়ে আছে, এই পর্ব সেটি ভাঙবে।
DNS-এর protocol আর নামের গাছের তত্ত্ব আছে Computer Networks · DNS পর্বে। সংক্ষেপে: resolver আপনার হয়ে root, TLD আর authoritative server-কে জিজ্ঞেস করে উত্তর আনে, তারপর cache করে। এখানে আমরা দেখব অন্য দিকটি। আপনি যখন একটি সেবা চালান, তখন DNS কীভাবে সাজাবেন, বদলাবেন, আর বিপদে কীভাবে ব্যবহার করবেন।
Cloud-এ authoritative server আপনাকে বানাতে হয় না। আপনি একটি hosted zone তৈরি করেন। এটি একটি domain-এর সব record-এর managed খাতা, আর provider সেটি দুনিয়াজুড়ে ছড়ানো name server থেকে পরিবেশন করে। এই server-গুলো সাধারণত anycast-এ চলে।
লঞ্চঘাটের টিকিট কাউন্টারের কথা ভাবুন। Registrar হলো যে অফিসে ঘাটের নাম নিবন্ধন হয়। Hosted zone হলো কাউন্টারের খাতা, যেখানে লেখা কোন লঞ্চ কোন পন্টুনে। আর resolver হলো সেই কুলি, যিনি একবার জেনে নিয়ে খাতায় না গিয়ে কিছুক্ষণ মনে রাখা তথ্যেই যাত্রীদের পথ দেখান।
Public আর private zone
- Public hosted zone: Internet-এর যে কেউ জিজ্ঞেস করতে পারে। ওয়েবসাইট, API আর mail-এর record এখানে থাকে।
- Private hosted zone: শুধু আপনার নির্বাচিত VPC-র ভেতর থেকে উত্তর মেলে। Database বা ভেতরের সেবার নাম এখানে রাখা হয়।
একটি ধাপ নতুনরা প্রায়ই ভুলে যান। Public zone বানালে provider আপনাকে কয়েকটি name server-এর নাম দেয়, যেমন Route 53-এ সাধারণত চারটি। এগুলো registrar-এ বসাতে হবে। তবেই TLD আপনার zone-এর দিকে পথ দেখাবে। এই কাজ না করলে zone-এ যত record-ই লিখুন, কেউ দেখবে না। Zone মুছে আবার বানালে নাম বদলে যেতে পারে, তাই তখনো registrar-এ মিলিয়ে দেখুন।
Resolver থেকে hosted zone আর routing policy
From a recursive resolver to a hosted zone with a routing policy
একই কাজ তিন provider-এ এই নামে পাবেন। নামগুলো লেখার সময়ের; নতুন সুবিধা আসতে থাকে, তাই official docs মিলিয়ে নিন।
| কাজ | AWS | Azure | Google Cloud |
|---|---|---|---|
| Public zone | Route 53 public hosted zone | Azure DNS public zone | Cloud DNS public zone |
| Private zone | Private hosted zone, VPC-র সাথে যুক্ত | Private DNS zone, VNet link | Cloud DNS private zone |
| Traffic routing | Route 53 routing policy | Traffic Manager | Cloud DNS routing policy |
| Health check | Route 53 health check | Traffic Manager endpoint monitoring | Health check, কোন target-এ চলে তা docs-এ দেখুন |
| Hybrid DNS | Resolver endpoint আর rule | DNS Private Resolver | Forwarding zone আর server policy |
২ · Record-এর ধরন — চালানোর সময় যেগুলো হাতে লাগে
প্রতিটি record-এর চারটি অংশ: নাম, TTL, ধরন আর মান। এদের তাত্ত্বিক রূপ আছে Computer Networks-এর DNS পর্বে। এখানে দেখুন কোনটি কখন, আর কোথায় ঠকতে হয়।
| ধরন | কাজ | চালানোর সময়ের সতর্কতা |
|---|---|---|
| A / AAAA | নাম থেকে IPv4 / IPv6 ঠিকানা | Load balancer-এর IP বদলাতে পারে, তাই সরাসরি IP লিখবেন না। Alias বা CNAME দিন। |
| CNAME | এক নামকে আরেক নামের ডাকনাম করা | Apex-এ বসে না। একই নামে অন্য record-ও বসে না। |
| ALIAS / ANAME | Provider-এর বাড়তি সুবিধা: apex-এও নাম দিয়ে target বলা | এটি standard record নয়, provider-ভেদে আলাদা। Zone অন্য provider-এ সরালে হুবহু যায় না। |
| MX | এই domain-এর mail কোন server নেবে | মান IP নয়, নাম হবে। ভুল হলে mail নীরবে হারিয়ে যেতে পারে। |
| TXT | SPF, DKIM, DMARC আর domain যাচাই (যেমন DNS-01) | Secret রাখবেন না; সবাই পড়তে পারে। পুরোনো যাচাই record জমতে দেবেন না। |
| NS | এই zone বা sub-zone কোন server সামলায় | Registrar-এর NS আর zone-এর NS মিলতে হবে। TLD-তে থাকা NS-এর TTL আপনার হাতে নেই। |
| CAA | কোন Certificate Authority এই domain-এ certificate দিতে পারবে | নতুন CA-তে যাওয়ার আগে আপডেট করুন, নইলে certificate নবায়ন আটকে যাবে। |
| SOA | Zone-এর প্রশাসনিক তথ্য, negative cache-এর TTL | Cloud-এ সাধারণত provider বসিয়ে দেয়। শেষ মানটি অংশ ৪-এ কাজে লাগবে। |
CAA-র একটি নিয়ম মনে রাখা দরকার। CA/Browser Forum-এর নিয়মে ২০১৭ সাল থেকে public CA-কে certificate দেওয়ার আগে CAA দেখতে হয়। Standard-টি এখন RFC 8659 (২০১৯)। তাই এটি একটি ছোট কিন্তু সত্যিকারের নিরাপত্তা-স্তর। এটি অন্য CA-কে ভুল করে আপনার নামে certificate দেওয়া থেকে থামায়।
৩ · Apex-এ CNAME কেন বসে না, আর alias কী করে
Zone apex মানে domain-এর নিজের নাম, www ছাড়া example.com. ধরুন আপনার site একটি load balancer-এর পেছনে, যার নাম lb-demo.example.net. www-এর জন্য CNAME বসানো সহজ। কিন্তু example.com-এ বসাতে গেলে console আপত্তি করবে।
কারণটি provider-এর খেয়াল নয়, DNS-এর নিয়ম। RFC 1034 (১৯৮৭) বলে, কোনো নামে CNAME থাকলে সেই নামে অন্য কোনো record থাকতে পারবে না। আর RFC 2181 (১৯৯৭) তা আরও স্পষ্ট করে। অথচ apex-এ SOA আর NS থাকতেই হবে, সাধারণত MX আর TXT-ও থাকে। দুই নিয়ম একসাথে মানা যায় না।
একটি ঠিকানায় “এই বাড়ি নেই, ওই বাড়িতে যান” লেখা সাইনবোর্ড ঝোলালে সেখানে আর কোনো চিঠির বাক্স রাখা চলে না। CNAME ঠিক এই সাইনবোর্ড। কিন্তু apex বাড়িতে তো দলিল (SOA) আর মালিকের নাম (NS) থাকতেই হবে।
Alias record এই গিঁট খোলে কৌশলে। আপনি provider-কে বলেন, “apex-এর A উত্তরের জন্য এই target-এর ঠিকানাগুলো দেখে নিন।” Authoritative server নিজের দিক থেকে target-এর বর্তমান IP বের করে, আর resolver-কে একটি সাধারণ A উত্তর দেয়। Resolver CNAME দেখেই না। তাই নিয়ম ভাঙে না, আর load balancer-এর IP বদলালেও আপনাকে কিছু করতে হয় না।
| বিষয় | CNAME | Alias |
|---|---|---|
| Apex-এ চলে? | না | হ্যাঁ |
| Resolver কী দেখে? | CNAME, তারপর নিজেই target খোঁজে | সরাসরি A/AAAA |
| Target | যেকোনো DNS নাম | সাধারণত provider-এর সমর্থিত target; কিছু provider যেকোনো নাম নেয় |
| Standard? | হ্যাঁ | না, provider-এর নিজস্ব সুবিধা |
উদাহরণ: Route 53-এর alias, Azure DNS-এর alias record set, আর কিছু DNS provider-এর ALIAS, ANAME বা CNAME flattening. Google Cloud DNS-এ এই সুবিধার অবস্থা সময়ের সাথে বদলেছে, তাই docs দেখে নিন। নাম কাছাকাছি হলেও ভেতরের কাজ আর target-এর সীমা provider-ভেদে আলাদা।
৪ · TTL আর “propagation” — আসলে কী ছড়ায়
“DNS propagate হতে ৪৮ ঘণ্টা লাগে” কথাটি শুনে মনে হয়, নতুন record ঢেউয়ের মতো দুনিয়ায় ছড়াচ্ছে। বাস্তব উল্টো। Propagation বলে কিছু push হয় না। Provider-এর নিজের name server-গুলো সাধারণত দ্রুত মিলে যায়। তারপর কিছুই ছড়ায় না। শুধু দুনিয়ার লাখো resolver-এর cache একে একে মেয়াদোত্তীর্ণ হয়। প্রত্যেকে নিজের সময়ে আবার জিজ্ঞেস করে।
TTL একটি প্রতিশ্রুতি: “এই উত্তর সর্বোচ্চ এতক্ষণ রাখা যাবে।” উত্তরটি যে মুহূর্তে cache-এ ঢুকল, সেই TTL তখনই ঠিক হয়ে গেল। পরে authoritative-এ TTL কমালে আগে নেওয়া কপির ওপর তার কোনো প্রভাব নেই। তাই TTL কমাতে হয় আগে, অন্তত এক পুরোনো TTL সময় অপেক্ষা করে।
নিজের চোখে দেখতে পারেন। Resolver-এর কাছে থাকা TTL কমতে থাকে, আর authoritative সবসময় পুরো মান দেখায়। আউটপুট নমুনা; নাম আর মান আলাদা হবে।
# ask the resolver you normally use (cached copy, TTL counts down)
dig +noall +answer www.example.com A
# ask the authoritative server directly (full TTL)
dig +noall +answer @ns1.example.net www.example.com A
# নমুনা আউটপুট — version-ভেদে আলাদা হতে পারে
# www.example.com. 47 IN A 198.51.100.20
# www.example.com. 60 IN A 198.51.100.20Site সরানো: TTL আগে কমানোর পুরো ধাপ
নিচের কাল্পনিক site-এর পুরোনো ঠিকানা old = 198.51.100.10, নতুন new = 203.0.113.50. Record-এর TTL 86400 s, অর্থাৎ ১ দিন। T হলো cutover, অর্থাৎ যে মুহূর্তে record বদলে নতুন ঠিকানায় যাওয়া হবে। R1 একটি resolver, যে T-এর ২৬ ঘণ্টা আগে উত্তরটি নিয়েছিল।
| সময় | |
| Authoritative-এর উত্তর | |
| R1-এর cache | |
| Old-এ traffic | |
| New-এ traffic | |
| Old server |
- T-26h. R1 উত্তরটি নিল। এই কপি ২৪ ঘণ্টা বৈধ, অর্থাৎ T-2h পর্যন্ত। দল ঠিক করল T-25h-এ TTL কমাবে।
- T-25h. Authoritative-এ TTL হলো 60, ঠিকানা একই। R1-এর কোনো পরিবর্তন নেই; তার কপিতে এখনো 82800 s বাকি। এই ধাপের ফল চোখে পড়ে না, আর সেখানেই ফাঁদ: কেউ ভাবতে পারেন কাজ শেষ, এখনই ঠিকানা বদলাই।
- T-2h. R1-এর ২৪ ঘণ্টার কপি শেষ। সে নতুন করে নিল, এবার TTL 60. এখন থেকে প্রতিটি কপির আয়ু এক মিনিট। T-25h-এর ঠিক আগে কপি নেওয়া resolver-ও T-1h-এ শেষ করবে, তাই ১ ঘণ্টা হাতে থাকে।
- T. Record-এ new বসল। এই মুহূর্তে সবার হাতে এখনো old, কিন্তু সর্বোচ্চ ৬০ সেকেন্ডের জন্য। Rollback চাইলে এখন এক মিনিটেই ফেরা যাবে।
- T+60 s. TTL মেনে চলা resolver-রা new নিয়েছে। প্রায় ২% traffic (ধরে নেওয়া মান) এখনো old-এ: TTL না মানা client আর চালু connection. তাই old এখনো চলবে, আর চালু সংযোগগুলো ধীরে শেষ হতে দেওয়া হবে (drain).
- T+24h. Old-এর log-এ অনুরোধ নেই। এবার old বন্ধ করা যায়। TTL-ও বাড়িয়ে 3600 করা যায়, যাতে query আর খরচ কমে।
যদি TTL না কমিয়েই সরাতেন? নিচের planner দুই পথের তুলনা করে। ধরে নেওয়া হয়েছে, ২% ট্রাফিক TTL না মেনে ২ ঘণ্টা পর্যন্ত পুরোনো ঠিকানা ধরে রাখে। এই সংখ্যা ধারণা, বাস্তবে আপনার log দেখে ঠিক করতে হবে। Resolver-দের cache-এর বাকি সময় সমভাবে ছড়ানো ধরা হয়েছে।
// TTL migration planner. Share of traffic still reaching the OLD address after cutover.
function mulberry32(a) {
return () => {
a = (a + 0x6D2B79F5) | 0;
let t = Math.imul(a ^ (a >>> 15), 1 | a);
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
const OLD_TTL = 86400, NEW_TTL = 60, SAFETY = 3600;
const STUCK = 0.02; // assumption: 2% of traffic ignores TTL and holds the old name
const STUCK_FOR = 7200; // assumption: such clients let go within 2 hours
console.log("lower TTL at T-" + (OLD_TTL + SAFETY) + " s (old TTL + 1 h safety)");
function oldShare(ttl, t, n = 20000) {
const r = mulberry32(2026);
let old = 0;
for (let i = 0; i < n; i++) {
const stuck = r() < STUCK;
const left = stuck ? r() * STUCK_FOR : r() * ttl; // time until this client re-asks
if (left > t) old++;
}
return (100 * old / n).toFixed(1).padStart(6) + "%";
}
const times = [0, 30, 60, 300, 1800, 3600, 7200, 21600, 86400];
console.log("t after cutover TTL 60 first no lowering (TTL 86400)");
for (const t of times) {
console.log((t + " s").padEnd(18) + oldShare(NEW_TTL, t).padEnd(15) + oldShare(OLD_TTL, t));
}
console.log("retire old server: not before T+" + STUCK_FOR + " s, and only when its log is quiet");প্রথম লাইন আসল পরামর্শ: lower TTL at T-90000 s, অর্থাৎ T-এর ২৫ ঘণ্টা আগে। TTL 60-এর সারিতে 60 s-এ পুরোনো ঠিকানায় মাত্র 2.1%, যার প্রায় সবটাই সেই “জেদি” দল। আর ডানে 3600 s-এ এখনো 94.7%, 21600 s-এ 73.4%. কমানো ছাড়া ১ দিন ধরে দুই server চালাতে হতো। শেষ লাইন বলে, হিসাবের ন্যূনতম সময়ের পরও old বন্ধ করার আসল সংকেত হলো তার log.
যা TTL-এর হিসাবে ধরা পড়ে না
- TTL না মানা client: কিছু resolver খুব ছোট TTL বাড়িয়ে নেয়। JVM-এর মতো runtime বা library নিজের মতো cache রাখতে পারে, সেটি version আর setting-নির্ভর।
- চালু connection: DNS শুধু নতুন সংযোগের আগে দেখা হয়। Connection pool আর keep-alive পুরোনো IP-তে থেকে যায়।
- NS বদলানো: DNS provider বদলালে TLD-তে থাকা NS-এর দীর্ঘ TTL কাজ করে, যা অনেক TLD-তে ১–২ দিন। এজন্য দুই zone-ই কিছুদিন একই record নিয়ে চালু রাখুন।
- Negative caching: নতুন record বসানোর আগে কেউ নামটি খুঁজে NXDOMAIN পেয়ে থাকলে, সেই “নেই” উত্তরও cache হয়। সময় ঠিক হয় SOA থেকে (RFC 2308, ১৯৯৮)। তাই নতুন record বসানোর আগে নামটি পরীক্ষা করে ফেলবেন না।
TTL কত রাখবেন — খরচসহ হিসাব
ছোট TTL মানে দ্রুত বদল, কিন্তু বেশি query. ধরে নিই ১০,০০০টি resolver সবসময় সক্রিয়, আর প্রতি ১০ লাখ query-র দাম $০.৫০ (ধরে নেওয়া সংখ্যা; আসল দাম provider-এর pricing পাতায় দেখুন)। ৩০ দিনের মাস ধরে হিসাব:
- TTL 3600: 10,000 × 1 × 720 = ৭২ লাখ query, প্রায় $৩.৬০।
- TTL 60: 10,000 × 60 × 720 = ৪৩.২ কোটি query, প্রায় $২১৬।
এটি সর্বোচ্চ সীমার হিসাব, তবু অনুপাতটি (৬০ গুণ) সত্যি। আরেকটি দাম আছে: ছোট TTL-এ provider-এর সমস্যা সাথে সাথে ব্যবহারকারীর গায়ে লাগে, কারণ cache-এর আড়াল থাকে না। তাই সাধারণ অবস্থায় 300–3600 s, migration-এর আগে 60 s, আর failover record-এ provider-এর পরামর্শমতো ছোট মান রাখা একটি প্রচলিত পথ। এটি নিয়ম নয়, শুরু করার জায়গা।
Zone file-এর ভুল চোখে ধরা কঠিন। Zone file হলো record-এর সাধারণ লেখা রূপ, যা export করা যায়। নিচের ছোট audit apex-এর CNAME, CNAME-এর সাথে অন্য record আর ঝুঁকিপূর্ণ দীর্ঘ TTL খোঁজে। ঠিকানা-জাতীয় record-এই শুধু দেখে, কারণ NS আর SOA-তে দীর্ঘ TTL স্বাভাবিক।
set -euo pipefail
cat > example.zone <<'EOF'
$ORIGIN example.com.
$TTL 3600
@ 86400 IN SOA ns1.example.net. ops.example.com. 2026103001 7200 3600 1209600 300
@ 86400 IN NS ns1.example.net.
@ 86400 IN NS ns2.example.net.
@ 300 IN CNAME lb-demo.example.net.
@ 3600 IN MX 10 mail.example.com.
www 60 IN CNAME lb-demo.example.net.
api 86400 IN A 198.51.100.20
pay IN A 198.51.100.30
blog 300 IN CNAME blog-demo.example.net.
blog 300 IN TXT "site-verification=demo"
EOF
awk -v max=3600 '
/^\$TTL/ { dflt = $2; next }
/^[$;]/ || NF == 0 { next }
{
n++; owner = $1; ttl = dflt; type = $3; note = " (zone default)"
if ($2 ~ /^[0-9]+$/) { ttl = $2; type = $4; note = "" }
count[owner]++
if (type == "CNAME") cname[owner] = 1
# NS and SOA change rarely, so a long TTL is normal there.
if (type ~ /^(A|AAAA|CNAME)$/ && ttl + 0 > max + 0)
printf "WARN %-5s %s TTL %s is above %s: a cutover would be slow\n", owner, type, ttl, max
if (type == "A" && note != "") printf "INFO %-5s %s TTL %s%s\n", owner, type, ttl, note
}
END {
if (cname["@"]) print "ERROR @ CNAME at the apex: SOA and NS must live there"
for (o in cname) if (o != "@" && count[o] > 1) print "ERROR " o " CNAME shares its name with other records"
print "records checked: " n
}' example.zoneWARN api A TTL 86400 বলছে, এই নাম সরাতে গেলে ১ দিন আগে থেকে পরিকল্পনা লাগবে। INFO pay লাইনটি ভুল নয়, শুধু জানায় TTL এসেছে zone-এর $TTL থেকে। আর ERROR @ সেই ভুলটি ধরেছে, যা অংশ ৩-এ দেখলেন। আসল DNS server বা console এমন zone নিত না। ERROR blog একই নিয়মের দ্বিতীয় রূপ: CNAME-এর পাশে TXT. records checked: 10 মানে ১০টি record পড়া হয়েছে, $ দিয়ে শুরু লাইন বাদে।
৫ · Routing policy — একই প্রশ্নের আলাদা উত্তর
সাধারণ DNS একটি প্রশ্নের একটিই উত্তর দেয়। Managed DNS এর ওপর আরেকটি স্তর বসায়: কে জিজ্ঞেস করছে, কোন target সুস্থ, আর আপনার ঠিক করা ভাগ দেখে উত্তর বাছাই। এই সিদ্ধান্ত হয় শুধু উত্তর দেওয়ার মুহূর্তে, অনুরোধের পথে নয়। Load balancer-এর সাথে এখানেই বড় পার্থক্য।
| Policy | কীভাবে বাছে | কোন কাজে |
|---|---|---|
| Simple | একটি record, একাধিক মান হলে সব দেয় | একটি target, সাধারণ site |
| Weighted | ওজনের অনুপাতে সম্ভাবনা: w ÷ মোট w | Canary, ধীরে migration |
| Latency | Provider-এর মাপা তথ্যে সবচেয়ে কম দেরির region | একাধিক region-এর সেবা |
| Geo | প্রশ্নকর্তার দেশ বা অঞ্চল অনুযায়ী | ভাষা, আইনগত সীমা, data residency |
| Failover | Primary সুস্থ হলে primary, নইলে secondary | Disaster recovery, পর্ব ২৪-এর কৌশল |
একটি প্রশ্ন জরুরি: “ব্যবহারকারী কোথায়” provider কীভাবে জানে? Authoritative server দেখে resolver-এর ঠিকানা, ব্যবহারকারীর নয়। ঢাকার কেউ সিঙ্গাপুরের public resolver ব্যবহার করলে ভুল অঞ্চলে যেতে পারেন। EDNS Client Subnet (RFC 7871, ২০১৬) ঠিকানার একটি অংশ পাঠিয়ে এটি কমায়, তবে সব resolver এটি পাঠায় না। তাই geo দিয়ে আইনগত সীমা মানতে গেলে শুধু DNS-এ ভরসা করবেন না; দরজায় অন্য যাচাইও লাগে। Latency-র ক্ষেত্রেও এটি মাপা গড়, প্রতিটি মানুষের নিশ্চয়তা নয়।
Weighted routing-এর সত্যিকারের চেহারা
৯০/১০ ভাগ মানে কি ঠিক ৯০/১০ traffic? নিচের সিমুলেটর দুটি অবস্থা দেখায়। প্রথমে প্রতিটি query আলাদাভাবে উত্তর পায়। পরে ব্যবহারকারীরা resolver-এর পেছনে, আর resolver ৬০ সেকেন্ড একটি উত্তর ধরে রাখে। Seed বাঁধা, তাই প্রতিবার একই ফল আসবে।
// Weighted DNS routing: 90% blue, 10% green. Seeded PRNG, so every run is identical.
function mulberry32(a) {
return () => {
a = (a + 0x6D2B79F5) | 0;
let t = Math.imul(a ^ (a >>> 15), 1 | a);
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
const pct = (x, n) => (100 * x / n).toFixed(1).padStart(5) + "%";
const WEIGHTS = { blue: 90, green: 10 }, SUM = 100;
const pick = (r) => (r() * SUM < WEIGHTS.blue ? "blue" : "green");
// Part 1: every DNS query is answered independently.
console.log("queries green share (target 10.0%)");
for (const n of [20, 100, 1000, 100000]) {
const r = mulberry32(1); let green = 0;
for (let i = 0; i < n; i++) if (pick(r) === "green") green++;
console.log(String(n).padStart(7) + " " + pct(green, n));
}
// Part 2: users sit behind resolvers, and a resolver caches one answer for 60 s.
const resolvers = [40000, 12000, 5000, 2000, 500, 200, 100, 100, 50, 50]; // users
const TOTAL = resolvers.reduce((a, b) => a + b, 0);
console.log("\nusers=" + TOTAL + " resolvers=" + resolvers.length + " minute by minute:");
const r = mulberry32(7);
let line = [];
for (let minute = 1; minute <= 10; minute++) {
let green = 0;
for (const users of resolvers) if (pick(r) === "green") green += users;
line.push(pct(green, TOTAL).trim());
}
console.log("green share: " + line.join(" "));প্রথম অংশে সূত্র ঠিক কাজ করে: ২০টি query-তে 15.0%, ১০০-তে 12.0%, আর ১ লাখে 9.9%. কম query-তে ওঠানামা স্বাভাবিক। দ্বিতীয় অংশে আসল শিক্ষা। Green-এর ভাগ এক মিনিটে 0.1%, অন্য মিনিটে 20.3%, আবার একবার 70.8%. কারণ ৬০,০০০ ব্যবহারকারীর ৪০,০০০ জন একটি resolver-এর পেছনে, আর সেটি green পেলে সবাই একসাথে green-এ চলে যায়। এই মডেলটি ইচ্ছা করে সরল। বড় resolver-এ অনেক আলাদা cache থাকে, তাই বাস্তবের ওঠানামা সাধারণত কম, তবে ঝোঁকটি একই। DNS-এর ভাগ হলো resolver-এর ভাগ, মানুষের ভাগ নয়।
DNS দিয়ে canary
DNS-ভিত্তিক canary মানে নতুন version-কে অল্প ওজন দিয়ে শুরু করা, যেমন ১%, ৫%, ২৫%, ১০০%. Terraform-এ Route 53-এর একটি উদাহরণ নিচে; অন্য provider-এর নিজস্ব resource আছে। Terraform নিজে শেখানো হবে পর্ব ৫২-তে।
resource "aws_route53_record" "www_blue" {
zone_id = var.zone_id
name = "www.example.com"
type = "A"
ttl = 60
records = ["198.51.100.20"]
set_identifier = "blue"
health_check_id = var.blue_check_id
weighted_routing_policy {
weight = 95
}
}
resource "aws_route53_record" "www_green" {
zone_id = var.zone_id
name = "www.example.com"
type = "A"
ttl = 60
records = ["198.51.100.21"]
set_identifier = "green"
health_check_id = var.green_check_id
weighted_routing_policy {
weight = 5
}
}DNS canary-র তিনটি দুর্বলতা জেনে রাখুন। ভাগ মোটা দাগের, কারণ resolver-এর cache আছে। Rollback সঙ্গে সঙ্গে হয় না, TTL পর্যন্ত অপেক্ষা লাগে। আর একই ব্যবহারকারী একবার blue, একবার green পেতে পারেন। সূক্ষ্ম ভাগের জন্য load balancer বা service mesh-এর weighted target ভালো (System Design · Canary, আর পর্ব ৫৯)। DNS canary মানায় পুরো cluster বা region-এর মধ্যে, যেখানে সামনে আর কোনো সাধারণ LB নেই।
৬ · Health check আর failover — কত সেকেন্ড লাগে
Failover record-এ primary-র সাথে একটি health check জোড়া থাকে। Provider দুনিয়ার কয়েকটি জায়গা থেকে endpoint-কে পরীক্ষা করে। Check ব্যর্থ হলে DNS failover শুরু হয়: authoritative এখন secondary-র ঠিকানা দেয়। কিন্তু উত্তর বদলানো আর ব্যবহারকারী সরে যাওয়া এক কথা নয়।
I = check interval · F = failure threshold · A = app-এর নিজের cache
লেখার সময়ে Route 53-এ interval সাধারণত 30 s বা 10 s, আর threshold পরিবর্তনযোগ্য। AWS failover record-এর TTL ৬০ সেকেন্ড বা কম রাখতে পরামর্শ দেয়। Provider-ভেদে এই মান আলাদা, তাই docs মিলিয়ে নিন। এবার ধাপে ধাপে দেখুন: I = 10, F = 3, TTL = 60. Primary ঠিক t = 0-তে পড়ে গেল, আর শেষ সফল check ঠিক তার আগে হয়েছিল। তিনজন ব্যবহারকারীর দল: R-A (উত্তর নিয়েছে t = -5-এ), R-B (t = -50-এ), আর App C, যে TTL না মেনে নিজের ১২০ সেকেন্ডের cache রাখে।
| সময় | |
| পরপর ব্যর্থ check | |
| Authoritative-এর উত্তর | |
| R-A-এর cache | |
| R-B-এর cache | |
| App C | |
| মৃত primary-তে আটকে |
- t = 0. Primary নীরব হলো। তিনজনের হাতেই primary-র ঠিকানা, তাই তিনজনই ব্যর্থ হচ্ছেন। DNS এখনো কিছু জানে না।
- t = 10. প্রথম check ব্যর্থ। গণনা 1, threshold 3, তাই উত্তর বদলায়নি। ঠিক এই সময়ে R-B-এর কপি শেষ হলো। সে আবার জিজ্ঞেস করে আবারও primary পেল, এবার ৬০ সেকেন্ডের জন্য। Detection-এর সময়ে নেওয়া কপিই সবচেয়ে ক্ষতিকর।
- t = 30. তৃতীয় check ব্যর্থ: I × F = 30. Status
unhealthy, authoritative এখন secondary দেয়। কিন্তু কারও cache বদলায়নি, তিনজনই আগের মতো ব্যর্থ। - t = 55. R-A-এর কপি শেষ, সে secondary পেল। ব্যর্থ বাকি ২ জন।
- t = 70. R-B-এর দ্বিতীয় কপি শেষ, সে-ও secondary পেল। এই নকশায় সবচেয়ে খারাপ TTL-মানা resolver সরত প্রায় t = 90-এ (t = 30-এর ঠিক আগে কপি নিলে)।
- t = 120. App C-র নিজের cache শেষ, এবার সে সরল। সূত্রের A অংশটি এটিই। আসল সমস্যা ছিল app-এ, DNS-এ নয়।
এক client-এর গল্প থেকে পুরো জনতার হিসাবে আসি। নিচের সিমুলেটর ২০,০০০ client-এর জন্য check-এর phase আর cache-এর বাকি সময় এলোমেলো রাখে, তবে seed বাঁধা।
// How long until clients leave a dead primary? Times in seconds.
function mulberry32(a) {
return () => {
a = (a + 0x6D2B79F5) | 0;
let t = Math.imul(a ^ (a >>> 15), 1 | a);
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
function simulate({ interval, fails, ttl, appCache }, n = 20000) {
const r = mulberry32(2929), moved = [];
for (let i = 0; i < n; i++) {
const detect = r() * interval + (fails - 1) * interval; // now answers "secondary"
// The resolver re-fetches every ttl seconds; its next fetch after detect wins.
let t = r() * ttl; // first expiry after the crash
while (t < detect) t += ttl;
moved.push(t + r() * appCache); // the app's own cache adds more
}
moved.sort((a, b) => a - b);
const q = (p) => Math.round(moved[Math.floor(p * (n - 1))]);
return [q(0.5), q(0.95), q(1)];
}
const cases = [
["slow check, long TTL", { interval: 30, fails: 3, ttl: 300, appCache: 0 }],
["fast check, long TTL", { interval: 10, fails: 3, ttl: 300, appCache: 0 }],
["fast check, TTL 60", { interval: 10, fails: 3, ttl: 60, appCache: 0 }],
["fast check, TTL 60, app 300", { interval: 10, fails: 3, ttl: 60, appCache: 300 }],
];
console.log("case".padEnd(29) + "worst-formula p50 p95 max");
for (const [name, c] of cases) {
const formula = c.fails * c.interval + c.ttl + c.appCache;
const [p50, p95, max] = simulate(c);
console.log(name.padEnd(29) + String(formula).padStart(13) +
String(p50).padStart(5) + String(p95).padStart(5) + String(max).padStart(5));
}worst-formula কলাম সূত্রের মান, আর max সিমুলেশনের সবচেয়ে দেরি। fast check, TTL 60-এ দুটিই 90, অর্থাৎ সূত্র আর হিসাব মিলেছে; অর্ধেক client সরে 55 s-এ। প্রথম সারি থেকে দ্বিতীয় সারিতে check দ্রুত করায় max কমেছে মাত্র ৬০ s (389 থেকে 329). আর TTL 300 থেকে 60 করায় কমেছে ২৩৯ s (329 থেকে 90). শেষ সারি দেখায়, app-এর ৩০০ s cache সব অর্জন নষ্ট করে আবার 386-এ নিয়ে যায়। সবচেয়ে বড় পদটি আগে কমান।
DNS failover-এর পথ পরীক্ষা না করলে তা কাজ করে না। Secondary-তে certificate, capacity আর database ঠিক আছে কি না, আগেই যাচাই করুন। ফেরার পথও ভাবুন: failback কি নিজে থেকেই হবে, না হাতে? Check দোল খেলে (flapping) উত্তর বারবার বদলায়। আর health check-এর পথটি যদি আসল ব্যবহারকারীর পথ না হয়, তবে “সুস্থ” দেখালেও মানুষ ব্যর্থ হতে পারেন।
৭ · Split-horizon, VPC resolver আর hybrid forwarding
প্রতিটি VPC-র ভেতরে provider একটি VPC resolver দেয়। VM আলাদা কিছু না করেই তাকে জিজ্ঞেস করে। AWS-এ এর ঠিকানা সাধারণত VPC CIDR-এর base + 2 (যেমন 10.0.0.2), Azure-এ 168.63.129.16, আর Google Cloud-এ metadata server-এর 169.254.169.254. এগুলো লেখার সময়ের তথ্য।
Split-horizon DNS মানে একই নামের দুই রকম উত্তর: ভেতর থেকে private ঠিকানা, বাইরে থেকে public ঠিকানা। এতে ভেতরের traffic ভেতরেই থাকে, আর NAT বা internet পথের ঝামেলা ও খরচ এড়ানো যায়। একই নামের কারণে certificate-ও একটিতেই চলে।
অফিসের রিসেপশন আর শহরের দিকনির্দেশক সাইনবোর্ড দুটিকে “হিসাব বিভাগ কোথায়” জিজ্ঞেস করুন। রিসেপশন বলবে, “তিনতলা, ডানদিকে।” বাইরের সাইনবোর্ড বলবে, “মূল ফটক।” প্রশ্ন একই, প্রশ্নকর্তার অবস্থান ভিন্ন, তাই উত্তরও ভিন্ন।
| প্রশ্নকর্তা | |
| নাম | |
| Resolver | |
| কোন zone | |
| উত্তর |
- VM জিজ্ঞেস করল। ভেতরের VM
api.example.comচায়। প্রশ্নটি internet-এ যায় না, যায় VPC resolver-এ। - Resolver মিলিয়ে দেখল। এই VPC-র সাথে যুক্ত private zone আছে কি না, যার নাম প্রশ্নের সাথে মেলে? আছে:
example.com. সে public পথে না গিয়ে এখানেই খোঁজে। - Private উত্তর।
10.0.2.20, ভেতরের load balancer-এর ঠিকানা। Traffic VPC-র ভেতরেই রইল। - বাইরের ল্যাপটপ। একই নাম, কিন্তু ISP resolver চলল root, TLD আর public zone-এর পথে। উত্তর
198.51.100.20. Private zone-এর অস্তিত্ব সে জানেই না। - ফাঁদ। VM এবার
www.example.comচাইল। Private zone নামের সাথে মিলে গেছে, অথচ ভেতরেwwwনেই। AWS-সহ অনেক ক্ষেত্রে resolver public-এ ফেরে না, সরাসরিNXDOMAINদেয়। বাইরে site চলছে, ভেতর থেকে ভাঙা। - সমাধান। Private zone-এ
wwwযোগ করা হলো (এখানে উত্তর198.51.100.40). ভালো নকশা হলো শুরু থেকেই সরু নাম, যেমনinternal.example.com, যাতে পুরো domain ঢেকে না যায়। Fallback-এর আচরণ provider-ভেদে আলাদা, তাই পরীক্ষা করে নিন।
Hybrid: অফিস আর cloud-এর নাম মেলানো
পর্ব ২৮-এর VPN বা dedicated link দিয়ে অফিস আর VPC জোড়া থাকলেও নাম নিজে থেকে মেলে না। অফিসের server db.internal.example.com চিনবে না, আর VM চিনবে না erp.corp.example. সমাধান conditional forwarding: নির্দিষ্ট নামের প্রশ্ন নির্দিষ্ট resolver-এ পাঠানো।
- Cloud থেকে অফিসে: Outbound endpoint আর forwarding rule:
corp.example-এর প্রশ্ন অফিসের DNS server-এ যাবে। - অফিস থেকে cloud-এ: Inbound endpoint: VPC-র ভেতরে একটি ঠিকানা, যেখানে অফিসের DNS server প্রশ্ন পাঠায়। VPC resolver-এর ঠিকানা সাধারণত VPC-র বাইরে থেকে ব্যবহার করা যায় না, তাই এটি লাগে।
Route 53 Resolver endpoint, Azure DNS Private Resolver আর Cloud DNS forwarding zone এই কাজের উদাহরণ। DNS TCP আর UDP দুই পথেই port 53 ব্যবহার করে, তাই firewall-এ দুটিই দরকার (পর্ব ২৭)। Hybrid-এর সবচেয়ে সাধারণ ত্রুটি হলো শুধু UDP খোলা; বড় উত্তর তখন ব্যর্থ হয়, আর সমস্যাটি মাঝেমধ্যে দেখা দেয়।
৮ · DNS যখন single point of failure
DNS সাধারণত এত নির্ভরযোগ্য যে কেউ ভাবে না। আবার সব সেবা এর ওপর দাঁড়িয়ে, তাই এটি পড়লে অনেকখানি পড়ে। ইঞ্জিনিয়ারদের মধ্যে একটি কৌতুক আছে, “It's always DNS.” সব সময় নয়, তবু কয়েকটি জনসমক্ষে বর্ণিত ঘটনা শিক্ষণীয়। বিস্তারিত সংশ্লিষ্ট প্রতিষ্ঠানের প্রকাশিত প্রতিবেদন থেকে দেখে নিন।
- Dyn, অক্টোবর ২০১৬: Managed DNS provider Dyn-এর ওপর বড় DDoS হয়, যার পেছনে Mirai botnet-এর ভূমিকার কথা জানা যায়। যে বড় বড় site শুধু এই একটি provider-এ ছিল, তাদের অনেকেই কিছু সময় পৌঁছানোর বাইরে চলে যায়, যদিও তাদের server সচল ছিল।
- Facebook, অক্টোবর ২০২১: প্রতিষ্ঠানটির প্রকাশিত বর্ণনা অনুযায়ী, backbone-এর একটি কাজে ভুলের পর তাদের DNS server-গুলোর BGP ঘোষণা সরে যায়। ফলে নাম মেলা বন্ধ হয়, আর ভেতরের সরঞ্জামও ক্ষতিগ্রস্ত হওয়ায় ঠিক করতে দেরি হয়।
- AWS us-east-1, অক্টোবর ২০২৫: AWS-এর প্রকাশিত সারাংশ অনুযায়ী, DynamoDB-র স্বয়ংক্রিয় DNS ব্যবস্থাপনায় একটি race condition একটি regional endpoint-এর record খালি করে দেয়। এর প্রভাব ওপর-নির্ভর আরও অনেক সেবায় ছড়ায়।
তিনটি ঘটনার ধরন তিন রকম: বাইরের আক্রমণ, network-এর ভুল, নিজের automation-এর ভুল। শিক্ষা একই: DNS-কে একটি single point of failure হিসেবে দেখুন, আর তাকে আলাদা করে নকশা করুন।
- দুই DNS provider: Secondary DNS বা দুই provider-এ একই zone রাখা। ধরে নিই একেকটির availability ৯৯.৯%, আর ব্যর্থতা স্বাধীন। তাহলে 1 − 0.001² = ৯৯.৯৯৯৯%. বাস্তবে স্বাধীনতা পুরো নয়, আর alias বা routing policy দুই provider-এ হুবহু মেলে না।
- যুক্তিসঙ্গত TTL: সবকিছু 60 s রাখলে provider পড়ার এক মিনিটেই সব cache খালি। Cache একটি আড়াল।
- ঠিক করার পথ DNS-এর বাইরে: Runbook আর জরুরি প্রবেশ যেন যে DNS পড়েছে, তার ওপরই নির্ভর না করে।
- Automation-এ সাবধানতা: DNS বদল review, ছোট blast radius আর দ্রুত rollback দিয়ে করুন।
৯ · নিরাপত্তা — registrar lock, DNSSEC আর dangling record
Domain-এর চাবি
DNS-এর সবচেয়ে উঁচু চাবি registrar account. কেউ সেটি পেলে NS বদলে পুরো domain নিয়ে যেতে পারে। Sea Turtle নামে যে DNS hijack অভিযান Cisco Talos ২০১৯ সালে প্রকাশ করে, তাতে registrar আর registry-স্তরের প্রবেশের কথা উঠে আসে। তাই চারটি সহজ অভ্যাস:
- Registrar-এ শক্ত MFA, আর সীমিত ব্যবহারকারী।
- Registrar lock চালু, যাতে সাধারণ অনুরোধে transfer না হয়। গুরুত্বপূর্ণ domain-এ registry lock-ও ভাবুন।
- Auto-renew চালু। সময়মতো নবায়ন না করে domain হারানো একটি অপ্রত্যাশিত রকমের সাধারণ দুর্ঘটনা।
- DNS বদলের IAM অনুমতি সরু, আর audit log চালু (পর্ব ৩১ ও ৩৪)।
DNSSEC, সংক্ষেপে
DNSSEC (RFC 4033–4035, ২০০৫) record-এ digital signature যোগ করে, যাতে resolver যাচাই করতে পারে উত্তরটি পথে বদলায়নি। এটি উত্তর গোপন করে না, শুধু খাঁটিত্ব প্রমাণ করে। চালু করতে zone-এ signing করতে হয়, আর registrar-এ DS record বসাতে হয়। ভুল key বা rollover-এ যাচাইকারী resolver-এ পুরো domain ব্যর্থ হতে পারে। Slack ২০২১ সালের DNSSEC rollout-এর সময় এমন একটি outage-এর বর্ণনা নিজেরাই প্রকাশ করেছে। তাই সুবিধা বড়, তবে ধাপে ধাপে চালু করুন।
Dangling record আর subdomain takeover
দল একটি campaign শেষ করে offer.example.com-এর পেছনের cloud resource মুছে দিল, কিন্তু DNS record রেখে দিল। এটি dangling record: নামটি এমন কিছুর দিকে তাকিয়ে আছে, যা আর আপনার নেই। Cloud-এর অনেক নাম ও ঠিকানা আবার অন্য ব্যবহারকারীর হাতে যেতে পারে। তখন আপনার নামের নিচে অন্য কারও বিষয়বস্তু দেখা দিতে পারে। একে বলে subdomain takeover. এতে phishing, আর cookie বা certificate-এর ঝুঁকি তৈরি হয়। Detectify-র গবেষকদের ২০১৪ সালের লেখার পর বিষয়টি ব্যাপক আলোচনায় আসে, আর Microsoft-এর docs-এও এটি প্রতিরোধের নির্দেশনা আছে।
ক্রম: আগে DNS record মুছুন, তারপর resource. IaC: record আর resource একই Terraform module-এ রাখুন, যাতে একসাথে তৈরি হয়, একসাথে মোছে। Alias: সম্ভব হলে provider-এর resource-এ alias দিন; যেমন Azure-এ resource মুছলে alias record খালি হয়ে যায়। Audit: নিয়মিত সব CNAME আর ঠিকানা মিলিয়ে দেখুন, target আপনার তালিকায় আছে কি না। যাচাই: যে platform domain-এর মালিকানা TXT দিয়ে যাচাই করে, সেই সুবিধা চালু রাখুন।
আরও গভীরে: Apex সমস্যার standard সমাধানের দিকে একটি ধাপ হলো SVCB আর HTTPS record (RFC 9460, ২০২৩), যার AliasMode apex-এও চলে; তবে সব client এখনো এটি ব্যবহার করে না। ANAME-এর IETF খসড়া RFC হয়নি। Failover-এর নকশায় AWS-এর প্রকাশিত নির্দেশনা health check-এর মতো data plane-এ ভরসা করতে বলে, record বদলানোর control plane-এ নয়, কারণ বিপদের দিনে control plane-ই প্রায়ই দুর্বল থাকে। তাদের Builders’ Library-তে static stability-র ওপর লেখা, আর RFC 8767 (২০২০)-এর serve-stale দুটিই পড়ার মতো।
পরীক্ষা ও ইন্টারভিউতে:
- Apex-এ CNAME বসে না কেন? CNAME-এর পাশে অন্য record চলে না, অথচ apex-এ SOA আর NS লাগে।
- Propagation কী? Push নয়; resolver-এর cache-এর TTL শেষ হওয়া।
- TTL 86400, migration কবে কমাবেন? Cutover-এর অন্তত ১ দিন আগে, হাতে কিছু বাড়তি সময় রেখে।
- I = 30, F = 3, TTL = 60, সবচেয়ে খারাপ সময়? 30 × 3 + 60 = 150 s, app-এর cache ছাড়া।
- Subdomain takeover কীভাবে ঠেকাবেন? Record আগে মুছুন, IaC-তে একসাথে রাখুন, নিয়মিত audit করুন।
১০ · AI-এর যুগে DNS-এর config যাচাই
AI কয়েক সেকেন্ডে record আর Terraform লিখে দিতে পারে। কিন্তু DNS-এর ভুলের ফল দেরিতে আসে, আর cache-এর কারণে ফেরানোও ধীর। একটি ভুল TTL ২৪ ঘণ্টা ধরে আপনাকে আটকে রাখতে পারে। তাই প্রয়োগের আগে যাচাই জরুরি।
| AI-এর ভুল | ঝুঁকি | যাচাই |
|---|---|---|
| Apex-এ CNAME লিখে দেওয়া | প্রয়োগ ব্যর্থ, বা mail ভেঙে যাওয়া | Zone audit আর provider-এর docs |
| Migration-এর দিনই TTL কমাতে বলা | পুরোনো cache ১ দিন টিকে থাকে | আগের TTL দেখে সময় হিসাব |
| “TTL 0 দিন, সমস্যা নেই” | Query, খরচ আর provider-নির্ভরতা বাড়ে | খরচের হিসাব, budget alert |
route53:*-এর মতো * অনুমতি | ভুল key-তে পুরো domain ঝুঁকিতে | নির্দিষ্ট zone আর action |
Resolver endpoint-এ 0.0.0.0/0 খোলা | Open resolver, অপব্যবহার | শুধু অফিসের CIDR |
| Private IP public zone-এ রাখা | ভেতরের নকশা প্রকাশ | Private zone ব্যবহার |
| TXT-এ token বা secret রাখা | সবাই পড়তে পারে | Secret manager (পর্ব ৩৩) |
Resource আগে মুছতে বলা, terraform destroy সাবধানতা ছাড়া | Dangling record বা পুরো zone হারানো | terraform plan পড়া |
| নেই এমন flag বা resource argument লেখা | প্রয়োগ ব্যর্থ, বা ভুল আচরণ | Official docs, পরীক্ষার zone |
AI-কে কাজ দেওয়ার সময় বর্তমান অবস্থা, সীমা আর ফেরার পথ বলে দিন। Secret, আসল account id বা key prompt-এ দেবেন না।
প্রয়োগের আগে যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১DNS এত নির্ভরযোগ্য হলে বড় বড় outage-এর গল্পে এটি বারবার আসে কেন?
কারণ DNS একসাথে তিনটি জিনিস: খুব কম ব্যর্থ হয়, খুব বেশি কিছু এর ওপর নির্ভর করে, আর এর ব্যর্থতা ঘুরে ঘুরে ফিরে আসে। ফলে ঘটনা কম, কিন্তু প্রতিটির প্রভাব বিশাল।
২০১৬ সালের Dyn ঘটনায় দেখা গেল, server সচল থাকলেও নাম না মিললে সেবা নেই। বহু প্রতিষ্ঠান তখন বুঝল, তাদের সব ডিম একটি DNS provider-এর ঝুড়িতে। এরপর দুই provider ব্যবহারের চল বাড়ে।
২০২১ সালের Facebook ঘটনা আরেকটি দিক দেখায়। প্রতিষ্ঠানটির প্রকাশিত বর্ণনা অনুযায়ী, backbone বিচ্ছিন্ন হওয়ায় DNS server-গুলো নিজেকে অসুস্থ ধরে ঘোষণা সরিয়ে নেয়। নিয়মটি ভালো উদ্দেশ্যেই ছিল। কিন্তু সব জায়গায় একসাথে এটি ঘটায় পুরো ব্যবস্থা অন্ধকার হলো, আর ভেতরের সরঞ্জাম দুর্বল হওয়ায় মেরামতও ধীর হলো।
২০২৫ সালের AWS ঘটনার প্রকাশিত সারাংশে automation-এর একটি race condition-এর কথা আছে, যা একটি endpoint-এর record খালি করে দেয়। এখানে প্রশ্নটি এসে দাঁড়ায়: আপনার নিজের সেবার ভেতরের নির্ভরতার গাছে DNS কোথায় কোথায় আছে?
একটি ব্যবহারিক অনুশীলনও করা যায়। পরীক্ষার পরিবেশে একটি নাম ইচ্ছা করে ভাঙুন, আর দেখুন কোন সেবা কতক্ষণ টেকে, কোন alert বাজে, আর দল কীভাবে টের পায়। অনেক দল এই পরীক্ষায় এমন নির্ভরতা খুঁজে পায়, যা কোনো নকশার ছবিতে ছিল না।
নকশার দিক থেকে কয়েকটি প্রশ্ন করুন। DNS না থাকলে আমার monitoring চলবে? Bastion-এ পৌঁছাতে পারব? Deploy-এর পথ কি একই নামের ওপর? Cache-এর জন্য কতটুকু সময় পাব? এসব প্রশ্নের উত্তর আগে থেকে না জানলে সমস্যার দিনে জানতে হবে।
মূল উপলব্ধি: DNS-এর ঝুঁকি মাপা হয় তার ব্যর্থতার হার দিয়ে নয়, ব্যর্থ হলে কতটুকু একসাথে পড়ে তা দিয়ে। তাই একে সাধারণ config নয়, critical dependency হিসেবে নকশা করুন।
প্র ০২দ্রুত failover-ই লক্ষ্য হলে সব record-এ TTL 1 s রাখলে সমস্যা কী?
TTL একটি দামি বোতাম। এটি কমালে প্রতিক্রিয়া দ্রুত হয়, কিন্তু তিন জায়গায় দাম দিতে হয়।
- ভার ও খরচ: TTL 3600 থেকে 60 করলে সর্বোচ্চ query ৬০ গুণ হতে পারে। 1 s করলে ৩৬০০ গুণ। প্রতি query-র দাম কম হলেও জমতে থাকে। ব্যবহারকারীর দিকেও প্রতি lookup-এ একটু দেরি যোগ হয়।
- নির্ভরতা: Cache ছিল আড়াল। Authoritative সমস্যায় পড়লে দীর্ঘ TTL-এর কপি কিছুক্ষণ চলতে থাকে। TTL 1 s হলে এক সেকেন্ডেই সেই আড়াল শেষ। Dyn-এর মতো ঘটনায় এই পার্থক্য চোখে পড়ার মতো।
- কাজে না আসা: কিছু resolver আর client ছোট TTL মানে না। ফলে দাম দিয়েও পুরো সুবিধা মেলে না। আগের সিমুলেটরে দেখেছেন, app-এর ৩০০ s cache সব অর্জন খেয়ে ফেলে।
এই টানাপোড়েন কমাতে RFC 8767 (২০২০) “serve-stale” প্রস্তাব করে: authoritative পৌঁছানো না গেলে resolver মেয়াদোত্তীর্ণ কপি কিছুক্ষণ দিতে পারে। Authoritative-এর সাময়িক সমস্যায় এটি কাজে লাগে, তবে সব resolver-এ একরকম নয়। আবার এটি failover-এর পক্ষে সবসময় ভালোও নয়, কারণ পুরোনো উত্তর আরও টিকে থাকতে পারে।
একটি ছোট হিসাবও দেখুন। আগের অংশের উদাহরণে TTL 60-এ মাসে সর্বোচ্চ ৪৩.২ কোটি query ছিল। TTL 1 s হলে একই ধারণায় তা হতো ২,৫৯২ কোটি, আর ধরে নেওয়া দামে প্রায় $১২,৯৬০। সংখ্যাটি সর্বোচ্চ সীমা, তবু দেখায় কেন শুধু “কম মানেই ভালো” ভাবা বিপজ্জনক।
ভালো পথ হলো record-ভেদে সিদ্ধান্ত। স্থির record (MX, NS, যাচাইয়ের TXT) দীর্ঘ TTL-এ থাক। সচল ঠিকানা মাঝারি TTL-এ, আর failover-record ছোট TTL-এ। সেকেন্ডের মধ্যে সরতে চাইলে DNS নয়, সামনে থাকা load balancer বা anycast ব্যবহার করুন।
মূল উপলব্ধি: TTL হলো দ্রুততা বনাম স্থিতিশীলতার দর-কষাকষি। সূত্রের সবচেয়ে বড় পদটি কমানোই লক্ষ্য, সবচেয়ে ছোট সংখ্যা বসানো নয়।
প্র ০৩DNS failover না anycast বা global load balancer — কখন কোনটি বেছে নেবেন?
মূল পার্থক্য সিদ্ধান্তের জায়গায়। DNS failover সিদ্ধান্ত নেয় নাম খোঁজার সময়, আর সেই সিদ্ধান্ত client-এর cache-এ আটকে থাকে। Global load balancer সিদ্ধান্ত নেয় প্রতিটি অনুরোধে বা সংযোগে, আর client একটিই IP দেখে।
- Anycast IP: একই ঠিকানা অনেক জায়গা থেকে ঘোষণা হয়, তাই client-এর ঠিকানা বদলাতে হয় না। Network routing বদলালেই পথ বদলায়, সাধারণত DNS cache-এর চেয়ে অনেক দ্রুত। Google Cloud-এর global Application Load Balancer বা AWS Global Accelerator এই ধরনের উদাহরণ। Azure Front Door-ও global L7 সেবা।
- দাম: এসব সেবার নিজস্ব খরচ আর নির্ভরতা আছে। সাধারণত একটি provider-এর ভেতরে সবচেয়ে ভালো কাজ করে।
- DNS failover কোথায় ভালো: দুই আলাদা cloud-এর মধ্যে, cloud আর অফিসের মধ্যে, কম খরচের DR-এ, যেখানে কয়েক মিনিটের RTO মানা যায়। HTTP ছাড়া অন্য protocol-এও এটি সহজে চলে, কারণ সিদ্ধান্ত নেওয়ার আগে সে protocol দেখেই না।
আরেকটি জায়গায় DNS failover চোখে না পড়েই কাজ করে: managed database-এর endpoint. পর্ব ২২-এ দেখেছেন, failover-এ অনেক সেবা একই নামকে নতুন primary-তে দেখায়। তখন app-এর connection pool পুনরায় সংযোগ করে কি না, runtime-এর DNS cache কেমন, সেটিই আসল প্রশ্ন।
ব্যর্থতার ধরনও ভাবুন। DNS failover শুধু নতুন সংযোগকে সরায়। আগের সংযোগ, আর ভেতরের state-এর দায় আপনারই থেকে যায়। Region-স্তরের failover-এ ডেটা কতটা মিলেছে, সেটিও আলাদা প্রশ্ন, যা failover পরিকল্পনায় আগে থেকে ঠিক করতে হয়। Traffic সরানো সহজ অংশ; ডেটা নিয়ে সিদ্ধান্ত কঠিন অংশ।
দুটি একসাথেও চলে। ব্যবহারকারীর দিকে anycast global LB, তার পেছনে region-ভিত্তিক সিদ্ধান্ত, আর শেষ ভরসা হিসেবে DNS-এ দ্বিতীয় পথ।
মূল উপলব্ধি: নিজেকে জিজ্ঞেস করুন, আপনার RTO কত সেকেন্ড, আর সিদ্ধান্ত যে স্তরে হচ্ছে সেটি client-এর cache-এর সামনে না পেছনে।
প্র ০৪Alias বা CNAME flattening apex-এর সমস্যা মেটায়। তাহলে এর বিনিময়ে কী হারাতে হয়?
১৯৮৭ সালের নিয়মটি লেখা হয়েছিল তখনকার দুনিয়ার জন্য। তখন target-কে নাম দিয়ে ডাকার দরকার apex-এ পড়েনি। Cloud আর CDN আসার পর ঠিকানা স্থির রইল না, আর “naked domain” চালানো কঠিন হলো। অনেকে apex-কে www-এ redirect করে কাজ চালাতেন।
এরপর DNS provider-রা নিজস্ব সমাধান আনল। Cloudflare ২০১৪ সালে CNAME flattening ঘোষণা করে; AWS-এর alias, আর অন্যদের ALIAS বা ANAME-ও একই গোত্রের। সবার মূল কৌশল এক: authoritative নিজে target খুঁজে A উত্তর দেয়।
কিন্তু দাম আছে।
- Portability: Alias standard record নয়। Zone export করলে বা অন্য provider-এ সরালে হুবহু যায় না। দুই provider-এ DNS রাখলে এটি বড় বাধা।
- অবস্থানের তথ্য: Target-কে খুঁজছে authoritative, ব্যবহারকারীর resolver নয়। CDN-এর মতো অবস্থান-নির্ভর target হলে উত্তর ভুল অঞ্চলের হতে পারে, যদি না provider এটি আলাদা করে সামলায়।
- দৃশ্যমানতা:
dig-এ শুধু A দেখা যায়, তাই পেছনে কী আছে তা বাইরে থেকে বোঝা যায় না। Audit-এ provider-এর API লাগে। - নির্ভরতা: Target-এর ঠিকানা বের করার দায় provider-এর, আর TTL-এর আচরণও তার।
বিকল্প হিসেবে অনেক দল এখনো apex থেকে www-এ HTTP redirect রাখে, আর আসল সেবা চালায় www-এ। এই পুরোনো কৌশলে সাধারণ CNAME-ই চলে, তাই provider বদলানো সহজ থাকে। তবে redirect-এর জন্যও apex-এ কোনো ঠিকানা লাগে, আর একটি বাড়তি ধাপ যোগ হয়।
Standard পথটি ধীরে এগোচ্ছে। ANAME-এর খসড়া RFC হয়নি। RFC 9460 (২০২৩)-এর HTTPS record apex-এ AliasMode দেয়, তবে সেটি ব্যবহারে client-এর সমর্থন লাগে, আর পুরোনো client-এর জন্য A/AAAA-ও রাখতে হয়।
মূল উপলব্ধি: Provider-এর সুবিধা প্রায়ই পুরোনো standard-এর ফাঁক ভরায়, আর বিনিময়ে একটু lock-in দেয়। সেটি সচেতনভাবে নিন।
প্র ০৫Subdomain takeover বারবার ঘটে কেন, আর একটি দল এটি কীভাবে স্থায়ীভাবে কমাবে?
এর শিকড় সাংগঠনিক। Resource-এর মালিক এক দল, DNS-এর মালিক অন্য দল। Resource মোছা সহজ, কিন্তু record মোছার কথা কারও মনে থাকে না। Cloud-এ resource-এর আয়ু ছোট, আর DNS-এর আয়ু লম্বা। এই ফাঁকেই ঝুঁকি জন্মায়।
Detectify-র ২০১৪ সালের লেখার পর থেকে নিরাপত্তা-গবেষকরা বহু বড় প্রতিষ্ঠানের ক্ষেত্রে এই সমস্যার কথা জানিয়েছেন। ঝুঁকিটি শুধু একটি ভাঙা পাতা নয়। আপনার নামের নিচে পাতা থাকলে ব্যবহারকারী তাকে বিশ্বাস করেন। Parent domain-এ cookie থাকলে তারও ঝুঁকি বাড়ে, আর domain-যাচাই-ভিত্তিক certificate পাওয়াও সম্ভব হতে পারে।
স্থায়ীভাবে কমাতে একক সতর্কতা নয়, ব্যবস্থা লাগে।
- একসাথে জীবন: IaC-তে record আর resource এক module-এ রাখুন, যাতে একটি মুছলে অন্যটিও মোছে।
- নিয়মিত audit: সব CNAME আর A মিলিয়ে দেখুন, target আপনার resource তালিকায় আছে কি না। অনুশীলন ৪-এর ছোট script এর সরল রূপ।
- Provider-এর সুবিধা: Azure-এর alias record আর custom domain যাচাই, এবং GitHub Pages-এর মতো platform-এ verified domain এই ঝুঁকি কমায়।
- IP-এর ক্ষেত্রেও: Public IP ছেড়ে দিলে সেটি অন্যের হতে পারে। Record না মুছে IP ছাড়বেন না। পর্ব ৩০-এ যে CDN দেখবেন, তার origin-ও একবার মিলিয়ে নিন।
- পর্যবেক্ষণ: Certificate Transparency log-এ আপনার নামে নতুন certificate দেখলে alert রাখুন।
সংস্কৃতিও এখানে কাজ করে। “বন্ধ করা” কাজকে “চালু করা”-র মতোই একটি ধাপের তালিকা হিসেবে লিখে রাখুন। Campaign বা পরীক্ষার পরিবেশ শেষ হলে কে কোন record সরাবেন, তা আগেই ঠিক থাকলে ভুল অনেক কমে। Tag দিয়ে মালিক চিহ্নিত করলে পুরোনো নামের দায়ও খুঁজে পাওয়া যায়।
ধরা পড়লে আগে record মুছুন বা মালিকানা ফিরিয়ে আনুন, তারপর log দেখে বুঝুন কিছু ঘটেছিল কি না।
মূল উপলব্ধি: নিরাপত্তার অনেক ফাঁক আসলে জীবনচক্রের ফাঁক। যা একসাথে তৈরি হয়, তা একসাথে মোছার ব্যবস্থা করুন।
অনুশীলন
কোনো cloud account লাগবে না। হিসাব, পড়া আর ভাবাই আসল কাজ। কেউ চাইলে আসল provider-এ পরীক্ষা করতে পারেন, তবে তাতে খরচ হতে পারে, আর শেষে zone আর record মুছে ফেলতে হবে।
-
সময়ের হিসাব: Interval 10 s, threshold 3, TTL 60 s, আর app-এর নিজের cache 30 s. (ক) সবচেয়ে খারাপ failover সময় কত? (খ) Detection আগের মতো রেখে, app-এর cache শূন্য করে, সবচেয়ে খারাপ সময় 60 s-এ নামাতে TTL কত হতে হবে?
(ক) 10 × 3 + 60 + 30 = 120 s.
(খ) Detection 30 s. বাকি 60 − 30 = 30 s, তাই TTL সর্বোচ্চ 30 s. কিন্তু TTL 60 থেকে 30 করলে সর্বোচ্চ query দ্বিগুণ হয়। Provider-এর পরামর্শও মিলিয়ে নিন।
-
পরিকল্পনা সমালোচনা: একজন লিখলেন, “শুক্রবার সন্ধ্যা ৬টায়
www-এর A record নতুন IP-তে বদলাব (TTL এখন 86400). সাথে সাথে পুরোনো server মুছে দেব, বিল কমবে।” এই পরিকল্পনার ভুলগুলো ধরুন, আর একটি ভালো রূপ লিখুন।ভুল: TTL না কমানোয় ১ দিন পর্যন্ত অনেকে পুরোনো ঠিকানায় থাকবেন। পুরোনো server মুছলে তাঁরা সরাসরি ব্যর্থ হবেন। Rollback কয়েক ঘণ্টায়ও সম্ভব নয়। শুক্রবার সন্ধ্যা বেছে নিলে সপ্তাহান্তে সহায়তা কম থাকতে পারে।
ভালো রূপ: T-25h-এ TTL 60 করা। কম ব্যস্ত সময়ে T নির্ধারণ। আগে নতুন server-এ
Hostবা--resolveদিয়ে পরীক্ষা। T-তে record বদল। পুরোনো server চালু রেখে log দেখা। Log শান্ত হলে পুরোনো server বন্ধ, তারপর TTL 3600. Rollback মানে T-এর আগের record ফিরিয়ে আনা, যা এক TTL-এই কাজ করে। -
ফল অনুমান করুন:
www-এর A record: 198.51.100.10, TTL 300. একটি resolver-এর cache খালি। 10:00:00-তে একজন খুঁজলেন। 10:02:00-তে record বদলে হলো 203.0.113.50, TTL 60. এরপর সেই resolver-এ 10:03:00 আর 10:05:30-এ প্রশ্ন এলো। প্রতিবার কী উত্তর আসবে, আর সাথে কত TTL?10:03:00: এখনো 198.51.100.10, বাকি TTL 120 s. Cache-এর কপি 10:05:00 পর্যন্ত বৈধ, আর authoritative-এর বদল তাকে ছোঁয় না।
10:05:30: কপি শেষ, তাই resolver আবার জিজ্ঞেস করে পেল 203.0.113.50, TTL 60 s. শিক্ষা: 10:02:00-তে TTL কমানোর কোনো প্রভাব আগের কপিতে পড়েনি।
-
ছোট audit:
example.zoneফাইলে সব লাইনে TTL লেখা আছে, আরinventory.txt-এ আপনার সচল target-এর নাম প্রতি লাইনে একটি করে আছে। একটি pipeline লিখুন, যা এমন সব CNAME target দেখাবে, যা তালিকায় নেই।awk '$4 == "CNAME" { print $5 }' example.zone \ | sort -u \ | grep -vxF -f inventory.txtawkশুধু CNAME-এর target তোলে,sort -uএকই নাম একবার রাখে।grep -vxFপুরো লাইন হুবহু মেলায়, আর মিলে যাওয়া লাইন বাদ দেয়। যা বাকি থাকে, তা-ই সম্ভাব্য dangling. এটি একটি সূচনা; আসল ব্যবস্থায় তালিকা আসা উচিত provider-এর API বা IaC state থেকে, আর A record-ও মেলানো দরকার।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমTTL 86400-এর একটি site নিরাপদে সরানোর ধাপগুলো সাজান (▲▼ চেপে সরান)
- TTL কমিয়ে 60 করা
- পুরোনো TTL-এর সমান সময় অপেক্ষা করা
- Record-এ নতুন ঠিকানা বসানো
- পুরোনো server চালু রেখে log দেখা
- পুরোনো server বন্ধ করে TTL আবার বাড়ানো
DNS-এ “propagation” বলতে আসলে কী বোঝায়?
- Authoritative server নতুন record সব resolver-এ পাঠিয়ে দেয়
- বিভিন্ন resolver-এর cache-এ থাকা পুরোনো উত্তরের TTL একে একে শেষ হওয়া
- Registrar প্রতিটি record নতুন করে অনুমোদন করে
- Root server-গুলো নতুন record মুখস্থ করে নেয়
example.com-এ CNAME বসানো যায় না কেন?
- Domain-এর নাম খুব ছোট বলে
- শুধু কিছু cloud provider এটি সমর্থন করে না
- CNAME থাকলে সেই নামে অন্য record চলে না, অথচ সেখানে SOA আর NS থাকতেই হয়
- CNAME-এ IP লিখতে হয়, আর apex-এর IP থাকে না
Interval 30 s, failure threshold 3, TTL 60 s. Client-এর নিজের কোনো cache নেই। সবচেয়ে খারাপ ক্ষেত্রে failover কত সময় নেবে?
- 60 s
- 90 s
- 120 s
- 150 s
ওজন blue 95, green 5 দেওয়া weighted DNS-এ একটি বড় resolver অনেক ব্যবহারকারীর সেবা দেয়, আর 60 s উত্তর cache করে। কী ঘটতে পারে?
- কিছু সময় ধরে সেই resolver-এর সব ব্যবহারকারী একই version-এ যান, তাই আসল ভাগ ৫%-এ স্থির থাকে না
- প্রতি ব্যবহারকারী ঠিক ৫% সম্ভাবনায় আলাদা উত্তর পান
- Weighted উত্তর কখনো cache হয় না
- Green কখনোই কোনো উত্তরে আসে না
একটি VPC-তে example.com নামে private zone যুক্ত, আর তাতে শুধু api আছে। ভেতরের VM থেকে www.example.com খুঁজলে সাধারণত কী হবে, যদি fallback চালু না থাকে?
- Public zone থেকে সঠিক উত্তর আসবে
- পাশের VM-এর cache থেকে উত্তর আসবে
- NXDOMAIN আসবে
- VM নিজের ঠিকানা উত্তর পাবে
পুরোনো একটি resource মুছে ফেলার সময় subdomain takeover এড়ানোর সবচেয়ে ভালো অভ্যাস কোনটি?
- Record-এর TTL বাড়িয়ে দেওয়া
- আগে DNS record মুছে তারপর resource মোছা, আর দুটি একই IaC-তে রাখা
- শুধু DNSSEC চালু করা
- Record রেখে দেওয়া, কারণ কেউ জানে না নামটি
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Hosted zone আপনার record-এর খাতা; public-এর NS registrar-এ বসাতে হয়, private zone শুধু VPC-র ভেতরে।
- Apex-এ CNAME চলে না; alias authoritative-এর দিক থেকে ঠিকানা এনে সাধারণ A উত্তর দেয়।
- Propagation মানে cache expiry. Cutover-এর এক পুরোনো TTL আগে TTL কমান, আর পুরোনো server log শান্ত হলে তবেই বন্ধ করুন।
- Failover-এর সবচেয়ে খারাপ সময় I × F + TTL + A. Weighted-এর ভাগ resolver-এর ভাগ, মানুষের নয়।
- DNS-কে critical dependency ভাবুন: registrar lock, সরু IAM, আর আগে record মুছে তারপর resource মোছা।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৩০ · CDN, WAF আর DDoS সুরক্ষা — certificate আর edge-এর কাজপরবর্তী পর্বDNS-এর পরের ধাপ: ব্যবহারকারীর কাছের edge.
- ক্লাউড কম্পিউটিং ও DevOps · কোর্স হোম৮১টি পর্বপুরো কোর্সের রোডম্যাপ।
- Computer Networks · DNSগভীরে যাননামের গাছ, resolver-এর কাজ আর DNS বার্তার ভেতরটা।
- System Design · Disaster recoveryপাশের ট্র্যাকFailover, multi-region আর global traffic routing-এর নকশা।
- পর্ব ২৪ · Backup আর disaster recoveryআগের পর্বRPO, RTO আর চারটি DR কৌশল, যেখানে DNS failover কাজে লাগে।