NAT ও ICMP
এই পাঠে যা শিখবেন
- NAT কীভাবে একাধিক প্রাইভেট ডিভাইসকে একটি পাবলিক IP-এর মাধ্যমে ইন্টারনেট অ্যাক্সেস দেয়
- NAT ট্রান্সলেশন টেবিল কীভাবে outbound ও inbound ট্রাফিক সঠিকভাবে মেলায়
- ICMP-এর ভূমিকা — ping ও traceroute কীভাবে এটি ব্যবহার করে
- Python দিয়ে NAT ট্রান্সলেশন ও TTL-ভিত্তিক traceroute-এর একটি সত্যিকারের সিমুলেশন
১ · NAT (Network Address Translation) — কেন দরকার
L14-এ আমরা দেখেছি 10.0.0.0/8, 172.16.0.0/12, ও 192.168.0.0/16 —
এই তিনটি রেঞ্জ প্রাইভেট নেটওয়ার্কের জন্য সংরক্ষিত, সরাসরি পাবলিক ইন্টারনেটে রাউট করা যায় না।
কিন্তু আপনার বাসার প্রতিটি ডিভাইস (ফোন, ল্যাপটপ, স্মার্ট TV) — সবগুলোরই তো ইন্টারনেটে পৌঁছানো দরকার। এখানেই
NATNetwork Address Translationএকটি কৌশল যা অনেকগুলো প্রাইভেট-নেটওয়ার্ক ডিভাইসকে একটি মাত্র পাবলিক IP অ্যাড্রেস শেয়ার করে ইন্টারনেটে পৌঁছাতে দেয়, সোর্স IP/পোর্ট রিরাইট করে ও একটি ট্রান্সলেশন টেবিলে মনে রেখে।
কাজে আসে — আপনার বাসার রাউটার আউটগোয়িং প্যাকেটের সোর্স IP/পোর্ট নিজের পাবলিক IP ও একটি অনন্য পোর্ট দিয়ে
পুনর্লিখন করে, এবং এই ম্যাপিং একটি ট্রান্সলেশন টেবিলে মনে রাখে — যাতে ফেরত আসা ট্রাফিক সঠিক
মূল প্রাইভেট ডিভাইসে ফেরত পাঠানো যায়।
NAT ঐতিহাসিকভাবে গুরুত্বপূর্ণ ছিল ঠিক এই কারণেই — এটি ছাড়া প্রতিটি ডিভাইসের নিজস্ব, দুষ্প্রাপ্য পাবলিক IPv4 ঠিকানা দরকার হতো। L16-এ আমরা দেখেছি IPv6 (১২৮ বিট, বিশাল ঠিকানা স্থান) নীতিগতভাবে NAT-এর প্রয়োজনীয়তা দূর করে — যদিও ব্যবহারিকভাবে অন্য কারণে (যেমন নিরাপত্তা স্তর, নেটওয়ার্ক ম্যানেজমেন্ট) আজও প্রায়ই ব্যবহৃত হয়।
# NAT ট্রান্সলেশন টেবিল — outbound রিরাইট ও inbound রিভার্স লুকআপের সিমুলেশন
nat_table = {} # (private_ip, private_port) -> public_port
reverse_table = {} # public_port -> (private_ip, private_port)
next_public_port = [40001] # তালিকায় রাখা হয়েছে যাতে ফাংশনের ভেতর থেকে বাড়ানো যায়
PUBLIC_IP = "203.0.113.5" # ডকুমেন্টেশন-রিজার্ভড TEST-NET-3 ঠিকানা (RFC 5737), বাস্তব IP নয়
def nat_translate_outbound(private_ip, private_port):
"""প্রাইভেট ডিভাইস থেকে আউটগোয়িং প্যাকেটের জন্য একটি পাবলিক পোর্ট বরাদ্দ (বা পুনঃব্যবহার) করে।"""
key = (private_ip, private_port)
if key in nat_table:
return nat_table[key] # আগে থেকেই ম্যাপিং আছে, পুনঃব্যবহার
assigned_port = next_public_port[0]
nat_table[key] = assigned_port
reverse_table[assigned_port] = key
next_public_port[0] += 1
return assigned_port
def nat_translate_inbound(public_port):
"""ফেরত আসা ট্রাফিক কোন প্রাইভেট ডিভাইসের, তা রিভার্স লুকআপ দিয়ে বের করে।"""
return reverse_table.get(public_port)
# দুটি ভিন্ন প্রাইভেট ডিভাইস একই সময়ে ইন্টারনেটে সংযোগ করছে
device_a = ("192.168.1.10", 5000)
device_b = ("192.168.1.11", 5001)
port_a = nat_translate_outbound(*device_a)
port_b = nat_translate_outbound(*device_b)
print(f"ডিভাইস A ({device_a[0]}:{device_a[1]}) -> পাবলিক {PUBLIC_IP}:{port_a}")
print(f"ডিভাইস B ({device_b[0]}:{device_b[1]}) -> পাবলিক {PUBLIC_IP}:{port_b}")
# একই ডিভাইস A আবার প্যাকেট পাঠালে — একই ম্যাপিং পুনঃব্যবহার হওয়া উচিত
port_a_again = nat_translate_outbound(*device_a)
# ফেরত আসা ট্রাফিক সঠিক ডিভাইসে ফিরে যাওয়া নিশ্চিত করা
returned_to_a = nat_translate_inbound(port_a)
returned_to_b = nat_translate_inbound(port_b)
print(f"\nপাবলিক পোর্ট {port_a}-এ ফেরত আসা প্যাকেট -> {returned_to_a}")
print(f"পাবলিক পোর্ট {port_b}-এ ফেরত আসা প্যাকেট -> {returned_to_b}")
# --- স্ব-যাচাই ---
assert port_a != port_b, "দুটি ভিন্ন ডিভাইস আলাদা পাবলিক পোর্ট পাওয়ার কথা ছিল!"
assert port_a_again == port_a, "একই ডিভাইসের পুনরায় সংযোগে আগের ম্যাপিংই পুনঃব্যবহার হওয়ার কথা ছিল!"
assert returned_to_a == device_a, "ফেরত ট্রাফিক ভুল ডিভাইসে যাচ্ছে!"
assert returned_to_b == device_b, "ফেরত ট্রাফিক ভুল ডিভাইসে যাচ্ছে!"
print("\nসব assertion পাস — প্রতিটি ডিভাইস স্বতন্ত্র পাবলিক পোর্ট পেয়েছে ও ফেরত ট্রাফিক সঠিকভাবে রুট হয়েছে।")
২ · ICMP (Internet Control Message Protocol)
ICMP একটি নেটওয়ার্ক-লেয়ার প্রোটোকল, কিন্তু এটি অ্যাপ্লিকেশন ডেটা বহন করে না — এটি শুধু নিয়ন্ত্রণ ও ডায়াগনস্টিক বার্তার জন্য। দুটি সবচেয়ে পরিচিত ব্যবহার —
ICMP Echo Request পাঠায়, Echo Reply ফেরত এলে reachability ও round-trip time মাপে।
ইচ্ছাকৃতভাবে কম TTL (১,২,৩...) দিয়ে প্যাকেট পাঠায় — প্রতিটি TTL যে রাউটারে expire হয়, সেটি একটি ICMP Time Exceeded বার্তা ফেরত পাঠিয়ে নিজেকে প্রকাশ করে।
# traceroute-এর TTL-ভিত্তিক পথ-আবিষ্কারের সিমুলেশন
network_path = ["R1 (গেটওয়ে)", "R2 (ISP কোর)", "R3 (ব্যাকবোন)", "গন্তব্য সার্ভার"]
def simulate_traceroute(path):
"""প্রতিটি TTL মান দিয়ে একটি প্যাকেট পাঠানো হয়; TTL=N-তম হপে expire হয়,
আর সেই হপ একটি ICMP Time Exceeded বার্তা দিয়ে নিজেকে প্রকাশ করে।"""
hops = []
for ttl in range(1, len(path) + 1):
responding_hop = path[ttl - 1]
hops.append((ttl, responding_hop))
return hops
print("traceroute সিমুলেশন — প্রতিটি TTL মানে কোন হপ সাড়া দেয় —\n")
for ttl, hop in simulate_traceroute(network_path):
is_last = (hop == network_path[-1])
message = "ICMP Echo Reply (গন্তব্যে পৌঁছেছে)" if is_last else "ICMP Time Exceeded"
print(f" TTL={ttl}: {hop:20s} -> {message}")
# --- স্ব-যাচাই: TTL=১ প্রথম হপে expire করা উচিত, শেষ TTL গন্তব্যে পৌঁছানো উচিত ---
hops = simulate_traceroute(network_path)
assert hops[0] == (1, "R1 (গেটওয়ে)"), "TTL=1 প্রথম হপেই expire করার কথা ছিল!"
assert hops[-1][1] == network_path[-1], "সর্বশেষ TTL গন্তব্যে পৌঁছানোর কথা ছিল!"
print("\nস্ব-যাচাই পাস — TTL বাড়ার সাথে সাথে ধাপে ধাপে পুরো পথের প্রতিটি রাউটার আবিষ্কৃত হয়েছে।")
NAT ও ICMP — দুটোই M4 (নেটওয়ার্ক লেয়ার)-এর ব্যবহারিক হাতিয়ার। NAT ঠিকানা দুষ্প্রাপ্যতার সমস্যা সমাধান করে, আর ICMP নেটওয়ার্কের স্বাস্থ্য পরীক্ষা ও পথ নির্ণয়ের সরঞ্জাম দেয়। এখানেই M4 (নেটওয়ার্ক লেয়ার) সম্পূর্ণ হলো — L01-এর "প্যাকেট কীভাবে সঠিক গন্তব্যে পৌঁছায়" প্রশ্নের সম্পূর্ণ উত্তর এখন আমাদের হাতে। M5-এ আমরা এক ধাপ উপরে উঠব — ট্রান্সপোর্ট লেয়ার, যেখানে প্যাকেট শুধু সঠিক হোস্টে নয়, সঠিক প্রক্রিয়ায় পৌঁছাতে হবে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ NAT-এর ট্রান্সলেশন টেবিল না থাকলে কী সমস্যা হতো?
টেবিল ছাড়া NAT রাউটার জানত না ফেরত আসা কোন প্যাকেট মূলত কোন প্রাইভেট ডিভাইসের জন্য উদ্দিষ্ট ছিল — সব ফেরত ট্রাফিক একই পাবলিক IP-তে আসে, তাই শুধু পাবলিক IP দেখে প্রাইভেট ডিভাইস আলাদা করা যায় না। ট্রান্সলেশন টেবিলই একমাত্র উপায় যা মনে রাখে কোন (প্রাইভেট IP, প্রাইভেট পোর্ট) কোন (পাবলিক পোর্ট)-এর সাথে যুক্ত।
প্র ০২ ping কেন ICMP ব্যবহার করে, TCP বা UDP নয়?
ping-এর উদ্দেশ্য অ্যাপ্লিকেশন ডেটা পাঠানো নয় — শুধু "তুমি কি পৌঁছানো যায়, আর কতক্ষণে?" পরীক্ষা করা। ICMP বিশেষভাবে এই ধরনের নেটওয়ার্ক-স্তরের নিয়ন্ত্রণ/ডায়াগনস্টিক বার্তার জন্য ডিজাইন করা — TCP-এর সংযোগ স্থাপনের ওভারহেড বা UDP-এর অ্যাপ্লিকেশন-ডেটা মডেলের কোনোটাই এখানে দরকার নেই, তাই একটি হালকা, উদ্দেশ্য-নির্দিষ্ট প্রোটোকলই সঠিক পছন্দ।
প্র ০৩ traceroute-এ TTL=৩ যে রাউটারে expire করে, সেই রাউটার কি জানে এটি একটি traceroute অনুরোধ, নাকি একটি সাধারণ প্যাকেট?
না — রাউটারটি "জানে না" এটি traceroute না অন্য কিছু। এটি শুধু তার নিয়মিত নিয়ম মেনে চলে — যেকোনো প্যাকেটের TTL শূন্যে নেমে গেলে সেটি বাতিল করা হয় এবং একটি ICMP Time Exceeded বার্তা পাঠানো হয় (এটি রাউটিং লুপ প্রতিরোধ করার জন্য একটি সাধারণ নিয়ম)। traceroute শুধু এই সাধারণ, সর্বজনীন নিয়মটি চতুরভাবে ব্যবহার করে — ইচ্ছাকৃতভাবে TTL কম রেখে — নিজের পথ আবিষ্কার করে।
অনুশীলন
-
চিন্তা করুন: যদি একই প্রাইভেট ডিভাইস (একই IP, একই পোর্ট) দুটি ভিন্ন বহিরাগত সার্ভারের সাথে একই সময়ে সংযোগ করে, NAT কি একই পাবলিক পোর্ট দুটোর জন্যই ব্যবহার করবে?
এই সরলীকৃত মডেলে হ্যাঁ (যেহেতু আমরা শুধু private_ip ও private_port দিয়ে key বানিয়েছি) — কিন্তু বাস্তব NAT বাস্তবায়নে সাধারণত সম্পূর্ণ ৫-টাপল (সোর্স IP/পোর্ট, ডেস্টিনেশন IP/পোর্ট, প্রোটোকল, M5/L22-এ বিস্তারিত) দিয়ে আলাদা সংযোগ ট্র্যাক করা হয়, যাতে একই পাবলিক পোর্ট একাধিক ভিন্ন দূরবর্তী সার্ভারের সাথে যুক্ত একাধিক সংযোগে ব্যবহৃত হতে পারে, বিভ্রান্তি ছাড়াই।
-
পরীক্ষা করুন: উপরের NAT কোডে একটি তৃতীয় ডিভাইস
("192.168.1.12", 5002)যোগ করুন এবং Run চেপে নিশ্চিত করুন এটি তৃতীয় একটি ভিন্ন পাবলিক পোর্ট (৪০০০৩) পায়।হ্যাঁ — যেহেতু
next_public_portপ্রতিটি নতুন (private_ip, private_port) জোড়ার জন্য একটি নতুন, অব্যবহৃত পোর্ট বরাদ্দ করে এবং প্রতিবার বাড়িয়ে দেয়, তৃতীয় ডিভাইসটি স্বয়ংক্রিয়ভাবে পোর্ট ৪০০০৩ পাবে — আগের দুটি ডিভাইসের ম্যাপিং অক্ষত থাকা অবস্থাতেই।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ পরবর্তী পাঠ — ট্রান্সপোর্ট লেয়ার পরিচিতি — M5 শুরু হবে পোর্ট নম্বর ও মাল্টিপ্লেক্সিং দিয়ে।
- Cloud Computing & DevOps কোর্স সঙ্গী কোর্স ক্লাউডে NAT গেটওয়ে ও পাবলিক/প্রাইভেট সাবনেট কীভাবে ব্যবহারিকভাবে কনফিগার করা হয় তা শিখতে দেখুন।
- Cybersecurity & Ethical Hacking কোর্স সঙ্গী কোর্স ICMP-ভিত্তিক আক্রমণ (যেমন ping flood) ও ফায়ারওয়ালে ICMP ফিল্টারিং কৌশল শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps ও Computer Networks — সব এক জায়গায়।