DHCP — wifi join করলেই address কোথা থেকে আসে
DHCP: Dynamic Host Configuration Protocol
নতুন ডিভাইসে IP নেই, তাই সে কারো ঠিকানাও জানে না — DHCP এই paradox সমাধান করে link-layer broadcast-এর উপর DORA নাটক চালিয়ে, তারপর lease দিয়ে ঠিকানাটা ভাড়া দেয়।
আগে এটা বুঝি
আপনার বন্ধুর বাসায় গেলেন, wifi password চাইলেন, phone connect করলেন — আর কয়েক সেকেন্ডে internet চলছে। মাঝখানে একটা প্রশ্ন কেউ জিজ্ঞেস করে না: আপনার phone-এর IP address এলো কোথা থেকে?
সহজ উত্তর: রাউটার দিয়েছে। কিন্তু সেই উত্তরের ভেতরে লুকিয়ে আছে networking-এর অন্যতম সুন্দর chicken-and-egg সমস্যা —
IP address ছাড়া আপনি কারো সাথে communicate করতে পারেন না। কিন্তু communicate না করে IP address চাওয়ার উপায় কী?
আপনার phone তখনো network-এ নতুন — কোন server-এর address, subnet mask, gateway কিছুই জানে না। মানুষ যেন নতুন শহরে এসে দেখল: খাবার অর্ডার করতে ফোন লাগবে, কিন্তু SIM চালু করতেই লাগবে ঠিকানা। এই deadlock ভাঙার প্রোটোকলই DHCP (RFC 2131)।
আজ দেখব সে কীভাবে ভাঙে — hint: উত্তরটা আপনার ঠিক নিচের স্তরে, link layer-এ — তারপর ঠিকানা আসলে দেওয়া হয় না, ভাড়া দেওয়া হয়, আর সেই ভাড়ার ঘড়িগুলো কীভাবে চলে। শেষে দেখব এই protocol কীভাবে অস্ত্র হতে পারে আর defender-রা কী করে।
মূল ধারণা
Bootstrapping paradox আর broadcast-এর ছুরি-মারা
Client-এর হাতে আছে শুধু: তার MAC address (factory-burned), আর একটা IP-হীন interface। UDP packet-এ source address লাগে — নেই; destination — কাকে জানে না। কিন্তু Ethernet-এ আছে জাদুকরী ঠিকানা FF:FF:FF:FF:FF:FF (broadcast MAC): এই ঠিকানায় পাঠালে segment-এর প্রতিটা ডিভাইস পায়। IP level-ও একই রকম: 255.255.255.255। Client-এর প্রথম packet-এর ঠিকানা দাঁড়ায়:
| Field | মান | কেন |
|---|---|---|
| Source IP | 0.0.0.0 | ‘অজানা’-র symbol — আমার IP নেই |
| Destination IP | 255.255.255.255 | কাকে জানি না, সবাই শোনো |
| Ports | 68 → 67 | DHCP client → server-এর fixed পোর্ট |
| Transport | UDP | প্রশ্ন-উত্তর একবারই; reliability দরকার নেই |
DORA — চার ধাপের নাটক
Exchange-টার নাম তার চার ধাপের আদ্যক্ষরে DORA:
Client Server(s)
│── DISCOVER (broadcast) ───────────────▶│ 'কেউ আছো? IP দাও'
│◀───────────────── OFFER ───────────────│ 'এই নাও: 192.168.1.105'
│── REQUEST (broadcast!) ───────────────▶│ 'alpha-রটা চাই'
│◀──────────────────────────────── ACK ──│ 'নিশ্চিত, lease ১ ঘণ্টা'প্রতিটা message আসলে option 53-এ type-নম্বর বহন করে: DISCOVER=1,
OFFER=2, REQUEST=3, ACK=5।
Lease — ঠিকানা না, ভাড়া
Server ঠিকানা দেয় না — নির্দিষ্ট সময়ের ভাড়া দেয় (option 51, lease time)। মেয়াদের সাথে দুইটা alarm:
| মাইলফলক | কখন | Client-এর কাজ |
|---|---|---|
| T1 renewal | lease-এর ৫০% | যে server দিয়েছিল তাকেই unicast REQUEST; ACK এলে মেয়াদ বাড়ল |
| T2 rebinding | lease-এর ৮৭.৫% | old server নীরব হলে broadcast REQUEST — যে-কোনো server উত্তর দিতে পারে |
| Expiry | ১০০% | ঠিকানা surrender — সব traffic বন্ধ, fresh DISCOVER |
Graceful degradation-এর পাঠ: প্রথমে সবচেয়ে সস্তা রাস্তা (unicast), তারপর ব্যাপক (broadcast), শেষে reset — client কখনো চুপচাপ ঠিকানা হারায় না, প্রতি ধাপে জোরে চেষ্টা করে।
Options — ACK-এর pocket থেকে যা বেরোয়
Packet-এর শেষাংশে variable-length TLV options — IP ছাড়াও পুরো configuration-kit:
| Option | নম্বর | দেয় কী |
|---|---|---|
| Subnet Mask | 1 | 255.255.255.0 |
| Router | 3 | 192.168.1.1 — default gateway |
| DNS Servers | 6 | 1.1.1.1, 8.8.8.8 |
| Lease Time | 51 | 3600 সেকেন্ড |
| Message Type | 53 | DORA-র কোন ধাপ |
Client নিজেও DISCOVER-এ Parameter Request List (option 55) পাঠিয়ে চাইতে পারে: ‘আমাকে 1, 3, 6, 15, 28 দাও’।
ভেতরে কী ঘটছে
Packet-এর ভেতরে — একটা আসল DISCOVER খোলস করা
Ethernet frame
┌──────────────────────────────────────────────────────────────┐
│ dst: ff ff ff ff ff ff ← broadcast MAC │
│ src: a4 83 e7 1c 4d 92 ← client-এর নিজের MAC │
│ type: 08 00 ← ভেতরে IPv4 │
└──────────────────────────────────────────────────────────────┘
IPv4 header (20 byte)
┌──────────────────────────────────────────────────────────────┐
│ proto=11(hex)=17 → UDP │
│ src: 00 00 00 00 ← 0.0.0.0 │
│ dst: ff ff ff ff ff ← 255.255.255.255 │
└──────────────────────────────────────────────────────────────┘
UDP header: src port 00 44 (=68) dst port 00 43 (=67)
BOOTP/DHCP payload
┌──────────────────────────────────────────────────────────────┐
│ op=01(request) htype=01(Ethernet) hlen=06 hops=00 │
│ xid: 3a 1f b2 07 ← transaction id │
│ flags=80 00 ← broadcast flag সেট! │
│ ciaddr/yiaddr/siaddr/giaddr = সব 0.0.0.0 │
│ chaddr: a4 83 e7 1c 4d 92 (+10 byte zero padding) │
│ sname (64B) + file (128B) zero │
│ magic cookie: 63 82 53 63 ← 'এরপর options' │
│ option 53 len 1: 01 ← DHCPDISCOVER │
│ option 61 len 7: 01 a4 83 e7 1c 4d 92 ← client identifier │
│ option 55 len 4: 01 03 06 0f ← চাই: mask, router, DNS… │
│ option 255 ← END │
└──────────────────────────────────────────────────────────────┘তিনটা জিনিস: এক, flags=80 00 — client বলছে ‘উত্তর-ও broadcast
করো’, কারণ unicast গ্রহণের ব্যবস্থা এখনো নেই। দুই, chaddr-এ
MAC-ই পরিচয় — IP তো সে-ই চাইছে। তিন, magic cookie 63 82 53 63
— BOOTP legacy-র fingerprint; DHCP আসলে BOOTP-র সম্প্রসারণ, options
field-টাই নতুন।
Reservation, pool আর relay agent
Server-side allocation দুই মোড: dynamic pool — range (.100–.200)
প্রথম-আসা-প্রথম-পাওয়া, MAC মনে রেখে একই IP ফেরত দেওয়ার চেষ্টা কিন্তু
guarantee নেই। Static reservation — নির্দিষ্ট MAC-এর জন্য নির্দিষ্ট
IP pre-booked; printer/NAS/server-এর জন্য আদর্শ।
Subnet-এর বাইরে server থাকলে? Broadcast router পার হয় না — broadcast domain-এর সীমা। সমাধান: প্রতি subnet-এ relay agent (সাধারণত router-এই)। Agent broadcast শুনে unicast করে আসল server- এ পাঠায়, আর giaddr field-এ বসায় নিজের subnet-facing IP:
Subnet A (10.4.0.0/24) Data center
client ──broadcast──▶ relay(giaddr=10.4.0.1) ──unicast──▶ DHCP server
│
giaddr দেখে: 'এই client 10.4.x.x ◀┘
pool থেকে পাবে'
server ──unicast-to-giaddr──▶ relay ──▶ clientgiaddr-ই server-এর একমাত্র location-clue — এক central server এভাবে শত subnet serve করে। (X-Forwarded-For header-এর সাথে তুলনা করুন: proxy-এর পেছনে context preserve করার একই pattern।)
উদাহরণ
পূর্ণ DORA trace — দুই server, এক client
Network-এ দুই server: alpha (pool .100–.199) আর beta
(.150–.249) — overlap intentional, বাস্তব misconfiguration-এর মতো:
t=0.000 client DISCOVER xid=0x3a1fb207 (0.0.0.0:68 → 255.255.255.255:67)
t=0.001 alpha OFFER yiaddr=192.168.1.101 lease=3600
t=0.002 beta OFFER yiaddr=192.168.1.152 lease=7200 ← দুটোই!
t=0.005 client REQUEST siaddr=alpha, req-ip=192.168.1.101 (broadcast)
t=0.006 alpha ACK yiaddr=192.168.1.101, opts=(mask, router, dns, lease)
t=0.007 beta (siaddr নিজের না — নীরব, লকিত IP মুক্ত করল)Decision-point: দুই OFFER-এর মধ্যে client সাধারণত প্রথমটা নেয় —
simplicity over cleverness। এরপর gratuitous ARP (‘এই IP আগে কেউ
নিয়েছে?’) শেষ-মুহূর্তের verification, তারপর 192.168.1.101/24-এ
বসে যাওয়া, gateway-DNS পকেটে। Conflict হলে (দুই server ACK করে
ভিন্ন IP দিলে) ARP-ই ধরে — client আবার DISCOVER দেয়। প্রতিটা ধাপে
verification-এর সুতো; protocol কোথাও perfection assume করে না।
ছবিতে
Lease lifecycle state machine — জন্ম থেকে মৃত্যু
power-on / link-up
│
▼
┌───────────┐ DISCOVER (broadcast)
│ INIT │ ─────────────────▶ OFFER অপেক্ষা
└───────────┘ │
│ SELECTING ▼
│ ┌────────────┐
▼ │ REQUESTING│
┌───────────┐ ACK └─────┬──────┘
│ BOUND │ ◀────────────────────────┘
│ ip,T1,T2 │
└─────┬─────┘
T1 (50%) │ T2 (87.5%)
▼ ▼
┌───────────┐ unicast REQ ┌───────────┐
│ RENEWING │ ──▶ old srv │ REBINDING │ broadcast REQ
└─────┬─────┘ └─────┬─────┘
│ ACK │ ACK
└────▶ BOUND ◀──ACK────────┘
│
কোথাও সাড়া নেই, lease শেষ
▼
INIT (নতুন DISCOVER)Shutdown-এ ভদ্র client RELEASE (type 7) unicast করে যায় —
pool-এ সঙ্গে-সঙ্গে ফেরত। কিন্তু RELEASE optional: laptop sleep হলে
কেউ জানায় না — মেয়াদ ফুরোলে server নিজেই IP মুক্ত করে; lease-ই
একমাত্র সত্য।
নিজে চালিয়ে দেখুন
নিজের lease খুঁজে বের করুন, renew করুন
⚠️ SSH session-এ release নয় — সংযোগ নিজেই মরবে। Local machine, নিজের network।
ধাপ ১ — বর্তমান lease পড়া:
# macOS:
ipconfig getpacket en0
# yiaddr = 192.168.1.101 siaddr = 192.168.1.1 (server)
# DHCP router: 192.168.1.1 domain_name_server: 1.1.1.1, 8.8.8.8
# lease_time (uint32_value): 0xe10 ← hex! = 3600 সেকেন্ড
ls /var/db/dhcpclient/leases/ && cat /var/db/dhcpclient/leases/*
# LeaseIPAddress, LeaseStartDate, LeaseDuration — ফাইলে লেখা
# Linux:
cat /var/lib/dhcp/dhclient.enp3s0.leases
# প্রতিটা block-এ renew/rebind/expire timestamp — T1/T2 চোখের সামনেধাপ ২ — release + renew (DORA live):
# Linux:
sudo dhclient -r -v enp3s0 # RELEASE — 'ভাড়া ফেরত'
sudo dhclient -v enp3s0 # পুরো DORA stdout-এ
# macOS:
sudo ipconfig set en0 BOOTP && sudo ipconfig set en0 DHCP
# Windows (admin cmd):
ipconfig /release && ipconfig /renewdhclient -v output-এ খোঁজুন: DISCOVER, OFFER from ...,
REQUEST, ACK from ... — diagram-এর হুবহু চার লাইন। আর lease
মাঝপথে (dhclient -v আবার) চালালে দেখবেন শুধু unicast REQUEST+ACK —
DISCOVER নেই: T1-পথের live প্রমাণ।
ধাপ ৩: আপনার lease_time ÷ ২ — T1 কত সেকেন্ডে আঘাত হানবে?
আপনার device-এর ঠিকানা আসলেই সময়-সীমিত lease — server, মেয়াদ, options সব পড়া যায়, আর renew/release কমান্ডে DORA live ঘটে।
নিজে বানান
Toy DHCP — দুই server, এক client, আসল UDP multicast segment-এ DORA
- UDP multicast group = broadcast segment simulation — সব peer group join করে
- Server class: pool manager (range allocation, MAC→IP leases dict)
- Client state machine: DISCOVER → প্রথম OFFER → REQUEST broadcast → ACK-এ BOUND
- দুই server instance — client যে OFFER প্রথম পায় তার siaddr REQUEST-এ জানায়
- Timeline print-এ DORA-র প্রতিটা ধাপ চোখে
import json, socket, threading, time
GROUP, PORT = '239.255.0.67', 6767 # simulation segment
def tx(msg):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF,
socket.inet_aton('127.0.0.1'))
s.sendto(json.dumps(msg).encode(), (GROUP, PORT)); s.close()
class Peer(threading.Thread):
def __init__(self, name):
super().__init__(daemon=True)
self.name = name
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
self.s.bind(('', PORT))
self.s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(GROUP) + socket.inet_aton('127.0.0.1'))
def log(self, text):
print(f'[{time.strftime("%H:%M:%S")}] {self.name:<7} {text}')
class Server(Peer):
def __init__(self, name):
super().__init__(name)
self.pool_next, self.leases = 101, {} # 192.168.1.101 … .199
self.opts = {'mask': '255.255.255.0', 'router': '192.168.1.1',
'dns': ['1.1.1.1'], 'lease': 3600}
threading.Thread(target=self.loop, daemon=True).start()
def loop(self):
while True:
msg = json.loads(self.s.recvfrom(4096)[0])
if msg['type'] == 'DISCOVER':
ip = self.allocate(msg['chaddr'])
self.log(f"OFFER {ip} → {msg['chaddr']}")
tx({'type': 'OFFER', 'siaddr': self.name, 'yiaddr': ip,
'xid': msg['xid'], 'opts': self.opts})
elif msg['type'] == 'REQUEST':
if msg['siaddr'] != self.name:
continue # client অন্য server নিয়েছে
self.leases[msg['chaddr']] = msg['yiaddr']
self.log(f"ACK {msg['yiaddr']} → {msg['chaddr']}")
tx({'type': 'ACK', 'yiaddr': msg['yiaddr'], 'xid': msg['xid'],
'opts': self.opts})
def allocate(self, mac):
if mac in self.leases: return self.leases[mac]
used = set(self.leases.values())
while f'192.168.1.{self.pool_next}' in used: self.pool_next += 1
return f'192.168.1.{self.pool_next}'
class Client(Peer):
def __init__(self, mac):
super().__init__('client'); self.mac = mac
def recv_matching(self, typ, xid):
while True:
m = json.loads(self.s.recvfrom(4096)[0])
if m['type'] == typ and m['xid'] == xid: return m
def dora(self):
xid = '3a1fb207'
self.log("DISCOVER 0.0.0.0:68 → 255.255.255.255:67")
tx({'type': 'DISCOVER', 'chaddr': self.mac, 'xid': xid})
o = self.recv_matching('OFFER', xid)
self.log(f"OFFER {o['yiaddr']} ({o['siaddr']}) — REQUEST broadcast")
tx({'type': 'REQUEST', 'chaddr': self.mac, 'xid': xid,
'siaddr': o['siaddr'], 'yiaddr': o['yiaddr']})
a = self.recv_matching('ACK', xid)
self.log(f"BOUND {a['yiaddr']}/24 router={a['opts']['router']} "
f"dns={a['opts']['dns']} lease={a['opts']['lease']}s")
if __name__ == '__main__':
Server('alpha'); Server('beta')
time.sleep(0.3)
Client('aa:bb:cc:dd:ee:01').dora()
time.sleep(0.3)Output (server-race ভেদে alpha/beta বদলাতে পারে — বাস্তবের মতো):
[client] DISCOVER 0.0.0.0:68 → 255.255.255.255:67
[alpha] OFFER 192.168.1.101 → aa:bb:cc:dd:ee:01
[beta] OFFER 192.168.1.101 → aa:bb:cc:dd:ee:01
[client] OFFER 192.168.1.101 (alpha) — REQUEST broadcast
[alpha] ACK 192.168.1.101 → aa:bb:cc:dd:ee:01
[client] BOUND 192.168.1.101/24 router=192.168.1.1 ...নিজে বাড়ান: (১) rogue-server (ভিন্ন gateway offer) যোগ করে দেখুন siaddr-match logic-ই একমাত্র রক্ষা; (২) T1 renewal — half-lease-এ ‘unicast’ simulation; (৩) pool-exhaustion handling — ৯৯ client নামান।
বাস্তব সিস্টেমে
DHCP যেখানে প্রতিদিন চুপচাপ চলে
Home routers। OpenWrt-এ dnsmasq, pfSense-এ dhcpd — বাসার রাউটারেই পূর্ণ DHCP server, reservation UI-সহ। ISP-রা CGNAT deployment-এও subscriber-কে private IP DHCP দিয়েই।
Enterprise। Microsoft DHCP, Infoblox, Cisco ip helper-address
(relay agent!) — campus-এ এক central server, প্রতি floor-এ relay।
VoIP phones option 66/150 দিয়ে call-server-এর address পায় — options
না থাকলে desk-phone বুঝতই না কাকে ফোন দেবে। PXE boot (option 66/67)
diskless machine-কে boot-image-এর ঠিকানাও দেয়।
Rogue DHCP incident — defensive lens। Conference/hotel network-এ attacker-laptop দ্রুত OFFER পাঠিয়ে gateway-DNS নিজের দিকে টেনে নেয়; victim-রা bank-site mirror-এ যায়। Defender-দের পাল্টা অস্ত্র DHCP snooping: switch port trusted/untrusted ভাগ করে untrusted-port-এর OFFER/ACK drop:
ip dhcp snooping
ip dhcp snooping vlan 10
interface gi0/1
ip dhcp snooping trust ← শুধু আসল server-এর portIPv6-র RA Guard একই family — bootstrap protocol যত, spoofing-door তত।
Cloud। AWS VPC-র 169.254.169.254 metadata-service-ও DHCP-ই
advertise করে। Bootstrap-protocol datacenter-এও একই কাজ: নতুন মেশিন,
নতুন ঠিকানা, শূন্য hand-written config।
যে ভুলগুলো সবাই করে
“DHCP server আমার IP assign করে দেয় — permanent মালিকানা।”
না — lease, সময়-সীমিত ভাড়া; মেয়াদ শেষে ব্যবহারের অধিকার নেই, server IP অন্যকে দিতে পারে। কারণটা scarcity: বাসার রাউটারে ২৫৪ ঠিকানা, মাসে ৫০ ডিভাইস আসা-যাওয়া — permanent assignment হলে pool শেষ। আপনার phone বারবার একই IP পায় server-এর courtesy-তে (একই MAC → পুরনো lease মনে করে), অধিকার হিসেবে নয়।
“DORA-র প্রতিটা ধাপই broadcast হয়।”
প্রথম দুই ধাপ অনিবার্যভাবে broadcast (client-এর কোনো IP-ই নেই)। কিন্তু RENEWING-phase-এর REQUEST আর ACK unicast — দুই পক্ষেরই তখন বৈধ ঠিকানা। Broadcast কেবল zero-config মুহূর্তে, বা T2-তে old-server হারালে। Capture-তে তাই join-এ broadcast-ঝড়, পরে ঘণ্টায় দুইটা নিঃশব্দ unicast।
“DHCP শুধু IP দেয়।”
IP তো ছোট অংশ — নামের ‘Configuration’-ই আসল: mask, gateway, DNS, domain suffix, NTP, MTU, PXE boot-image, VoIP config — সব options-ই। Enterprise admin-রা DHCP-কে দেখেন options-distribution-system হিসেবে; IP দেওয়া by-product।
“WiFi connect মানেই সব ঠিক — DHCP fail বলে আলাদা কিছু নেই।”
উল্টো প্রায়ই সত্যি: WiFi association (link layer) সফল, DHCP fail —
ফলে সেই বিখ্যাত APIPA/self-assigned অবস্থা (169.254.x.x): client
অপেক্ষায় থাকতে থাকতে link-local ঠিকানা নিজেই নেয়, যা router পার করতে
পারে না — ‘connected, no internet’ icon-এর জন্ম। Symptom দেখলে প্রথম
সন্দেহ DHCP server (সাধারণত রাউটার)।
বুঝেছেন কি না দেখুন
1Protocol-designer-রা যদি বাধ্য করতেন ‘আগে link-local temporary IP নাও,
তারপর DHCP-তে যোগাযোগ করো’ — কোন সমস্যা সমাধান হতো, কোনটা নতুন জন্ম
নিত?
যুক্তি
সমাধান: unicast-এর সব সুবিধা — reply সরাসরি আসে, broadcast-flag লাগে না। নতুন সমস্যা: temporary IP collision-free বেছে নিতে হয় — অর্থাৎ একটা mini-negotiation তো লাগবেই (APIPA ঠিক এটাই করে, fallback হিসেবে)। আর complexity: bootstrap-protocol-এর সৌন্দর্য তার minimal-assumption — শুধু MAC + broadcast দিয়েই পুরোটা চলে। Design lesson: weakest moment-এ (zero config) protocol ততটুকুই assume করতে পারে।
2Lease ৮ ঘণ্টার network-এ T1 আর T2 কোন মুহূর্তে? T1-এ old server সাড়া
না দিলে T2-এর আগে client কী করে — ঠিকানা ব্যবহার চালিয়ে যায়, নাকি থামে?
প্রয়োগ
T1 = ৪ ঘণ্টা, T2 = ৭ ঘণ্টা। T1-fail-এ client backoff-এ old-server-কেই retry করতে থাকে — কিন্তু ঠিকানা ব্যবহার চালু থাকে, lease তো বৈধ। T2-তে কৌশল switch: broadcast REQUEST, যে-কোনো server eligible। ৮ ঘণ্টা পূর্ণে ACK না এলে surrender → ব্যবহার বন্ধ → fresh DISCOVER। Graceful-degradation-এর তিন ধাপ।
3Relay agent ছাড়া server কেন multi-subnet enterprise serve করতে পারে
না? giaddr না থাকলে server ঠিক কোন তথ্যের অভাবে অসহায়?
যুক্তি
Broadcast router-পার হয় না — server শুধু নিজের subnet শোনে; মানে শতাধিক subnet = শতাধিক server। giaddr ছাড়া server জানত না client কোন subnet-এ: packet relay-র মাধ্যমে এসেছে, source-address = relay-এর — physical-location clue শূন্য। giaddr-ই proxy-of-location: ‘যে interface, সেই subnet-pool’। General pattern: intermediary-র পেছনে original-context preserve করতে explicit field (X-Forwarded-For-এর echo!)।
4Cafe wifi hardening করছেন। Rogue-DHCP-র বিরুদ্ধে তিন স্তরের defense —
switch feature, monitoring, client-side — সীমাবদ্ধতাসহ propose করুন।
(Defensive framing: নিজের authorized network.)
ডিজাইন
Switch: DHCP snooping — untrusted access-port-এর OFFER/ACK drop; সীমা: cheap hardware-এ feature-ই নেই, misconfig-এ আসল server-ও blocked। Monitoring: spoof/starve detection — same-chaddr-হাজার-DISCOVER বা gateway-siaddr-change alert; সীমা: reactive — প্রথম victim-এর আগে না। Client: 802.1X (network-entry-র আগে credential) বা VPN-over-untrusted; সীমা: infra-cost, throughput। Defense-in-depth-ই উত্তর: একটাও perfect নয়, তিনটা মিলে খুব কঠিন target।
5DORA-র চার ধাপ: sender কে, option 53 value কত?
স্মরণ
Discover (client→broadcast, 1) — server খোঁজা। Offer
(server→client, 2) — proposed IP+options। Request (client→
broadcast, 3) — ‘এই server-এরটা নিলাম’ (বাকি-server notification সহ)।
Ack (server→client, 5) — confirmed lease + full option-set।
Sūtra: জিজ্ঞেস, প্রস্তাব, সম্মতি, সিলমোহর।
এরপর কী
এরপর কী
Network-এ পা রাখলেন — ঠিকানা, gateway, DNS সব পকেটে। এখন browser-এ
https:// লেখা মাত্র padlock-এর পিছনে crypto-নাটক শুরু হয়: TLS
handshake — certificate-chain যাচাই, key-exchange, সব এক round-trip-
এ। পরের লেসনে প্রতিটা দৃশ্য packet-level-এ খুলব, আর দেখব TLS 1.3
কীভাবে দুই round-trip-কে একটায় নামাল।
আরও পড়ুন
- RFC 2131 — Dynamic Host Configuration Protocol — R. Droms · DHCP-র মূল specification — DORA exchange, lease timer (T1/T2), relay agent behavior সব এখানেই
- RFC 2132 — DHCP Options and BOOTP Vendor Extensions — S. Alexander, R. Droms · Options field-এর পূর্ণ তালিকা — router, DNS, lease-time, MTU option নম্বরগুলো এখান থেকে
- TCP/IP Illustrated, Volume 1 (2nd Edition), Chapter 6 — DHCP — Kevin R. Fall, Richard W. Stevens · Packet-level trace আর timing diagram-এর প্রামাণ্য উৎস