পাঠ ৪৭ · ৫৭-এর মধ্যে · মডিউল ১০
Home / Courses / Computer Networks / VPN ও IPsec

VPN ও IPsec

VPN & IPsec
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • VPN কী এবং এটি কোন সমস্যার সমাধান করে
  • IPsec কেন নেটওয়ার্ক লেয়ারের প্রোটোকল, আর এর ফলে কী সুবিধা হয়
  • ট্রান্সপোর্ট মোড বনাম টানেল মোডের পার্থক্য ও প্রতিটির ব্যবহারক্ষেত্র
  • Python দিয়ে টানেল-মোড এনক্যাপসুলেশন/ডিক্যাপসুলেশনের একটি সত্যিকারের, নিজে-যাচাইকারী round-trip সিমুলেশন

১ · VPN কী ও কেন দরকার

ধরুন দুটি অফিস — একটি ঢাকায়, একটি চট্টগ্রামে — একে অপরের অভ্যন্তরীণ নেটওয়ার্কের সাথে নিরাপদে যোগাযোগ করতে চায়়, কিন্তু তাদের মধ্যে সরাসরি কোনো প্রাইভেট তার নেই — শুধু পাবলিক ইন্টারনেট আছে, যা মূলত অবিশ্বস্ত (যে কেউ পথে ট্রাফিক দেখতে বা বদলাতে পারে)। VPNVirtual Private Networkএকটি অবিশ্বস্ত পাবলিক নেটওয়ার্কের উপর দিয়ে দুটি এন্ডপয়েন্টের মধ্যে একটি এনক্রিপ্টেড, প্রমাণীকৃত টানেল তৈরি করে — যেন তারা একটি প্রাইভেট নেটওয়ার্কেই সরাসরি সংযুক্ত। ঠিক এই সমস্যা সমাধান করে — এটি পাবলিক ইন্টারনেটের উপর দিয়ে একটি এনক্রিপ্টেড টানেল তৈরি করে, যাতে ভেতরের ট্রাফিক বাইরের কেউ পড়তে বা বদলাতে না পারে। এই একই মূল ধারণা cloud-devops কোর্সের নেটওয়ার্কিং মডিউল ও cybersecurity কোর্সেও আছে — এখানে আমরা প্রোটোকল-মেকানিক্সের স্তরে এটি দেখব।

গোপনীয়তা
পথে থাকা কেউ (ISP, রাউটার) ট্রাফিকের আসল বিষয়বস্তু পড়তে পারে না — এনক্রিপশন এটি আড়াল করে।
ইন্টিগ্রিটি
পথে ডেটা বদলে ফেলা হলে (টেম্পারিং) তা ধরা পড়ে — প্রাপক প্রান্ত সেটি প্রত্যাখ্যান করে।
সাইট-টু-সাইট সংযোগ
দুটি অফিসের পুরো অভ্যন্তরীণ নেটওয়ার্ককে যেন একই প্রাইভেট নেটওয়ার্কের অংশ মনে হয়, তা সম্ভব করে।

২ · IPsec — নেটওয়ার্ক লেয়ারে VPN

IPsecIP Securityপ্রোটোকলের একটি স্যুইট যা VPN ফাংশনালিটি নেটওয়ার্ক লেয়ারে (M4) বাস্তবায়ন করে — IP প্যাকেট পর্যায়ে এনক্রিপশন ও প্রমাণীকরণ যোগ করে। হলো প্রোটোকলের একটি স্যুইট যা VPN ফাংশনালিটি সরাসরি নেটওয়ার্ক লেয়ারে (M4) বাস্তবায়ন করে। যেহেতু এটি IP প্যাকেট পর্যায়ে কাজ করে, তাই এর উপরের যেকোনো ট্রান্সপোর্ট প্রোটোকল (TCP, UDP) ও যেকোনো অ্যাপ্লিকেশন — কিছু না জেনেই — স্বয়ংক্রিয়ভাবে সুরক্ষিত হয়ে যায়। এটি L48-এর TLS-এর ঠিক বিপরীত ট্রেড-অফ — TLS উপরের স্তরে বসে বলে প্রতিটি অ্যাপ্লিকেশনকে আলাদাভাবে TLS ব্যবহার করতে "জেনেশুনে" ইন্টিগ্রেট করতে হয়, কিন্তু IPsec সম্পূর্ণ স্বচ্ছ — উপরের স্তরগুলো কোনো পরিবর্তন ছাড়াই কাজ করতে থাকে (L01-এর লেয়ারিং/মডুলারিটি নীতির আরেকটি বাস্তব প্রয়োগ)।

৩ · ট্রান্সপোর্ট মোড বনাম টানেল মোড

  • ট্রান্সপোর্ট মোড — শুধু IP payload এনক্রিপ্ট হয়, মূল IP হেডার অপরিবর্তিত/দৃশ্যমান থাকে। ব্যবহৃত হয় দুটি নির্দিষ্ট হোস্টের মধ্যে সরাসরি (end-to-end) সুরক্ষার জন্য।
  • টানেল মোড — পুরো মূল প্যাকেট (তার নিজের IP হেডারসহ) এনক্রিপ্ট করে একটি সম্পূর্ণ নতুন আউটার IP হেডারে মুড়ে দেওয়া হয়। ব্যবহৃত হয় site-to-site VPN-এ — দুটি পুরো নেটওয়ার্ককে সংযুক্ত করার জন্য, যেখানে ভেতরের প্রাইভেট অ্যাড্রেসিং ট্রানজিট নেটওয়ার্ক থেকে সম্পূর্ণ আলাদা/আড়াল রাখতে হয়।
কেন টানেল মোডে নতুন IP হেডার দরকার

মূল প্যাকেটের src/dst IP (যেমন 10.1.1.25, 10.2.2.40) প্রাইভেট ঠিকানা — এগুলো পাবলিক ইন্টারনেটে সরাসরি রাউট করা যায় না (L14-এর RFC 1918 প্রাইভেট রেঞ্জ মনে করুন)। তাই দুই অফিসের VPN গেটওয়ের পাবলিক IP দিয়ে একটি নতুন আউটার হেডার বসানো হয় — ইন্টারনেট শুধু এই আউটার হেডারটুকু দেখে প্যাকেট রাউট করে, ভেতরের আসল প্রাইভেট ঠিকানা এনক্রিপ্টেড অবস্থায় আড়ালে থাকে।

Python
# IPsec টানেল-মোড এনক্যাপসুলেশন/ডিক্যাপসুলেশনের একটি সত্যিকারের সিমুলেশন
# (in-memory ফেক ডেটা — কোনো প্রকৃত নেটওয়ার্ক সকেট/প্যাকেট নয়)

def tunnel_mode_encapsulate(original_packet, tunnel_src, tunnel_dst):
    """মূল প্যাকেট (তার নিজের IP হেডারসহ) একটি নতুন আউটার IP হেডারে মুড়ে দেয়।"""
    return {
        "outer_src": tunnel_src,
        "outer_dst": tunnel_dst,
        "protocol": "ESP",  # IPsec Encapsulating Security Payload
        "encrypted_payload": dict(original_packet),  # পুরো মূল প্যাকেট payload হিসেবে
    }

def tunnel_mode_decapsulate(esp_packet):
    """আউটার হেডার সরিয়ে হুবহু মূল প্যাকেট (তার নিজের IP হেডারসহ) ফেরত দেয়।"""
    return dict(esp_packet["encrypted_payload"])

# --- মূল প্যাকেট: অফিস-A-এর একটি অভ্যন্তরীণ ডিভাইস অফিস-B-এর একটি ডিভাইসকে ডেটা পাঠাচ্ছে ---
original_packet = {
    "src_ip": "10.1.1.25",    # অফিস-A-এর প্রাইভেট IP
    "dst_ip": "10.2.2.40",    # অফিস-B-এর প্রাইভেট IP
    "payload": "GET /reports/q3.pdf",
}

# --- দুই অফিসের VPN গেটওয়ের পাবলিক IP ---
tunnel_src = "203.0.113.10"    # অফিস-A গেটওয়ে (পাবলিক)
tunnel_dst = "198.51.100.20"   # অফিস-B গেটওয়ে (পাবলিক)

esp_packet = tunnel_mode_encapsulate(original_packet, tunnel_src, tunnel_dst)

print("মূল প্যাকেট (অভ্যন্তরীণ, প্রাইভেট IP):")
print(" ", original_packet)

print("\nটানেল করা প্যাকেট (পাবলিক ইন্টারনেটে যা দেখা যাবে):")
print(" outer_src:", esp_packet["outer_src"])
print(" outer_dst:", esp_packet["outer_dst"])
print(" protocol :", esp_packet["protocol"])
print(" (ভেতরে এনক্রিপ্টেড থাকে সম্পূর্ণ মূল প্যাকেট — src/dst IP-সহ)")

recovered_packet = tunnel_mode_decapsulate(esp_packet)

print("\nদূরের গেটওয়েতে ডিক্যাপসুলেশনের পর উদ্ধারকৃত প্যাকেট:")
print(" ", recovered_packet)

is_match = recovered_packet == original_packet
print("\nমূল প্যাকেটের সাথে হুবহু মিলছে?", is_match)
assert is_match, "ডিক্যাপসুলেশন মূল প্যাকেট হুবহু ফেরত দিতে ব্যর্থ হয়েছে!"
print("✓ যাচাই সম্পন্ন: tunnel_mode_decapsulate(tunnel_mode_encapsulate(original)) == original")

    
মূল প্যাকেট: src=10.1.1.25, dst=10.2.2.40, payload encrypted_payload = সম্পূর্ণ মূল প্যাকেট (IP হেডারসহ) নতুন আউটার হেডার: outer_src=203.0.113.10, outer_dst=198.51.100.20 পাবলিক ইন্টারনেট দিয়ে গমন (protocol=ESP)
দূরের VPN গেটওয়ে আউটার হেডার সরিয়ে (ডিক্যাপসুলেট করে) মূল প্যাকেট হুবহু উদ্ধার করে।
লক্ষ্য করুন — tunnel_mode_decapsulate ঠিক ততটুকুই সরায় যতটুকু tunnel_mode_encapsulate যোগ করেছিল, ফলে মূল প্যাকেট বিন্দুমাত্র পরিবর্তন ছাড়াই ফিরে আসে — বাস্তব IPsec-এ "encrypted_payload" প্রকৃতপক্ষে একটি এনক্রিপশন অ্যালগরিদম (যেমন AES) দিয়ে সত্যিকারের এনক্রিপ্ট করা বাইট হবে, কিন্তু গঠনগত নীতি — পুরো মূল প্যাকেট একটি নতুন হেডারে মোড়ানো — ঠিক এটাই।
মূল কথা · Key takeaway

IPsec টানেল মোড L01-এর এনক্যাপসুলেশন নীতিরই একটি বিশেষ প্রয়োগ — পার্থক্য শুধু এই যে এখানে পুরো একটি "নিচের স্তরের" প্যাকেট (তার হেডারসহ) সম্পূর্ণভাবে আরেকটি প্যাকেটের ভেতরে মোড়ানো হয়, যাতে দুটি ভিন্ন ঠিকানা-জগৎ (প্রাইভেট অভ্যন্তরীণ নেটওয়ার্ক বনাম পাবলিক ট্রানজিট নেটওয়ার্ক) সম্পূর্ণ আলাদা থাকতে পারে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ ট্রান্সপোর্ট মোডের বদলে টানেল মোড কেন site-to-site VPN-এর জন্য প্রয়োজনীয়?

site-to-site VPN-এ দুটি পুরো প্রাইভেট নেটওয়ার্ককে সংযুক্ত করতে হয়, যাদের ভেতরের ডিভাইসগুলোর প্রাইভেট IP (যেমন 10.x.x.x) পাবলিক ইন্টারনেটে রাউট করা যায় না ও একে অপরের কাছে দৃশ্যমান রাখাও নিরাপদ নয়। টানেল মোড পুরো মূল প্যাকেট (প্রাইভেট IP হেডারসহ) এনক্রিপ্ট করে একটি নতুন পাবলিক-IP হেডারে মুড়ে দেয়, তাই ইন্টারনেট শুধু গেটওয়ে-থেকে-গেটওয়ে পাবলিক ঠিকানা দেখে রাউট করে — ভেতরের প্রাইভেট ঠিকানা সম্পূর্ণ আড়ালে থাকে। ট্রান্সপোর্ট মোডে IP হেডার অক্ষত/দৃশ্যমান থাকে বলে এটি এই কাজের জন্য যথেষ্ট নয়।

প্র ০২ IPsec নেটওয়ার্ক লেয়ারে কাজ করে বলে এটি TLS-এর তুলনায় কী সুবিধা পায়?

যেহেতু IPsec নেটওয়ার্ক লেয়ারে (M4) কাজ করে, এটি সেই লেয়ারের উপরের সব ট্রান্সপোর্ট প্রোটোকল (TCP, UDP) ও তাদের উপরের সব অ্যাপ্লিকেশনকে — কোনো পরিবর্তন ছাড়াই, সম্পূর্ণ স্বচ্ছভাবে — সুরক্ষিত করে দেয়। TLS (L48) উপরের স্তরে বসে বলে প্রতিটি অ্যাপ্লিকেশনকে আলাদাভাবে TLS সাপোর্ট ইন্টিগ্রেট করতে হয় (যেমন HTTP-কে HTTPS বানাতে TLS লাইব্রেরি ব্যবহার করতে হয়) — IPsec-এ এই বাড়তি কাজের দরকার নেই।

প্র ০৩ উপরের কোড সেলে assert লাইনটি ঠিক কী প্রমাণ করছে, আর বাস্তব IPsec-এ এর গুরুত্ব কী?

assert recovered_packet == original_packet প্রমাণ করছে যে এনক্যাপসুলেশন-ডিক্যাপসুলেশন প্রক্রিয়াটি lossless — কোনো তথ্য হারায় না বা বদলে যায় না, ঠিক যেমন L01-এ দেখা এনক্যাপসুলেশন সিমুলেশনে হয়েছিল। বাস্তব IPsec-এ এই নিশ্চয়তা জরুরি — যদি ডিক্যাপসুলেশন প্রক্রিয়া মূল প্যাকেটের কোনো অংশ হারিয়ে ফেলত বা ভুলভাবে পুনর্গঠন করত, তাহলে VPN-এর ভেতরের অ্যাপ্লিকেশন ডেটা করাপ্ট হয়ে পৌঁছাত — এই round-trip নির্ভুলতাই টানেলের মূল নিরাপত্তা ও নির্ভরযোগ্যতা নিশ্চিত করে।

অনুশীলন

  1. চিন্তা করুন: ট্রান্সপোর্ট মোড ব্যবহার করে দুটি নির্দিষ্ট হোস্টের মধ্যে end-to-end সুরক্ষা দেওয়া কেন site-to-site VPN-এর বদলে ভিন্ন একটি ব্যবহারক্ষেত্র?

    ট্রান্সপোর্ট মোড দুটি নির্দিষ্ট হোস্টের মধ্যে সরাসরি সুরক্ষা দেয় — উভয় হোস্টের আসল IP ঠিকানাই ব্যবহৃত হয়, কোনো নতুন গেটওয়ে ঠিকানার প্রয়োজন নেই, কারণ এখানে কোনো "ভিন্ন প্রাইভেট নেটওয়ার্ককে আড়াল করার" প্রয়োজন নেই — উভয় প্রান্তই একে অপরের প্রকৃত ঠিকানা জেনেই সরাসরি কথা বলছে। এই কারণে এটি host-to-host সুরক্ষার জন্য উপযুক্ত, কিন্তু পুরো নেটওয়ার্ক সংযুক্ত করার জন্য নয়।

  2. পরীক্ষা করুন: উপরের কোড সেলে original_packet-এর payload মান পরিবর্তন করে অন্য কোনো টেক্সট বসান এবং Run চেপে দেখুন round-trip যাচাই এখনও সঠিকভাবে পাস করে কি না।

    যেকোনো payload বসালেও শেষে True এবং "যাচাই সম্পন্ন" বার্তা আসা উচিত — কারণ tunnel_mode_decapsulate শুধু encrypted_payload-এর একটি কপি ফেরত দেয়, যা এনক্যাপসুলেশনের সময় বসানো সম্পূর্ণ মূল প্যাকেটের হুবহু অনুলিপি। এই ডিজাইনটিই নিশ্চিত করে যে কোনো payload দিয়েই round-trip নির্ভুল থাকে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
L46 · ফায়ারওয়াল ও প্যাকেট ফিল্টারিং