টানেলের মধ্য দিয়ে একটি ডিফল্ট রুট যোগ করুন, আর টানেলের নিজের প্যাকেটগুলোও সেটি অনুসরণ করবে। তখন টেবিলে এমন একটি নিয়ম থাকে যা নিজেকেই পরাজিত করে। সার্ভারের সঙ্গে এনক্রিপ্টেড সংযোগটি যে সংযোগটি প্রতিষ্ঠা করতে চাইছে তার ভেতর দিয়েই যেতে চায়।

দুটি প্রক্রিয়া ওই লুপ প্রতিরোধ করে। একটি রাউটিং টেবিলে দৃশ্যমান, অন্যটি অ্যাপ্লিকেশনের ভেতরে বাস করে।

ভেতরের ও বাইরের ট্রাফিক আলাদা সিদ্ধান্ত

একটি অ্যাপ্লিকেশন প্যাকেট ভার্চুয়াল ইন্টারফেসে ঢোকে এবং এনক্যাপসুলেট হয়। ফলাফল সার্ভারের পাবলিক ঠিকানায় ঠিকানা-যুক্ত একটি নতুন প্যাকেট। ওই প্যাকেটের ফিজিক্যাল নেটওয়ার্কে একটি রুট দরকার, কারণ এর কোনও অংশই টানেলে ঢুকতে পারে না।

দুটোই রাউটিং সিদ্ধান্ত, এবং কেবল প্রথমটি টানেলের অন্তর্গত। যখন ক্লায়েন্ট এমন একটি ডিফল্ট রুট ইনস্টল করে যা সার্ভারকেও ঢেকে রাখে, তখন বাইরের প্যাকেটও ধরা পড়ে।

উপসর্গগুলো তাৎক্ষণিক ও সম্পূর্ণ। হ্যান্ডশেক শেষ হয় এবং তারপর কিছুই প্রবাহিত হয় না, অথবা রুট ইনস্টল হওয়ার মুহূর্তেই সংযোগ কেটে যায়। দুই ক্ষেত্রেই keepalive আর বেরোতে পারে না।

প্রথম বিকল্প: এন্ডপয়েন্টের জন্য হোস্ট রুট

সরাসরি পদ্ধতিটি মূল গেটওয়ে দিয়ে সার্ভারের ঠিকানার জন্য একটি রুট যোগ করে। এটি এক লাইন নেয়। টেবিল পড়ে যে কেউ এটি দেখতে পায়। পরিবর্তন রেকর্ডে ব্যাখ্যা করাও সহজ।

এর দুর্বলতা দেখা যায় যখন অন্তর্নিহিত পথ বদলে যায়. সংরক্ষিত রুটটি পুরনো নেটওয়ার্কের একটি গেটওয়ে ও একটি ইন্টারফেসের নাম দেয়। Wi-Fi বদলের পর ওই গেটওয়ে নাও থাকতে পারে, আর রুটটি থেকে যায়, সঠিক দেখায় এবং কিছুই করে না।

# before the tunnel: which path reaches the endpoint?
ip route get 198.51.100.7

# pin it through the current gateway
ip route add 198.51.100.7/32 via 192.168.1.1 dev wlan0

# after the tunnel is up, confirm the pin survived
ip route get 198.51.100.7

হোস্টনেম এটি আরও কঠিন করে তোলে। এন্ডপয়েন্ট যদি এমন নাম হয় যা কয়েকটি ঠিকানায় রিজলভ হয়, ব্যতিক্রমটিকে প্রকৃতপক্ষে ব্যবহৃত ঠিকানাটি ঢাকতে হবে। পরবর্তী লুকআপ এমন কিছু ফেরত দিতে পারে যা রুট কখনও ঢাকেনি।

দ্বিতীয় বিকল্প: সকেট সুরক্ষিত করা

অন্য পদ্ধতিটি রাউটিং টেবিলকে কখনও স্পর্শ করে না। ক্লায়েন্ট টানেল বহনকারী সকেটটিকে চিহ্নিত বা সুরক্ষিত করে, ফলে অপারেটিং সিস্টেম নীতি অনুযায়ী ওই সকেটের ট্রাফিক টানেলের বাইরে পাঠায়। Android সরাসরি VPN অ্যাপ্লিকেশনগুলোকে এই প্রক্রিয়া দেয়। ডেস্কটপ ক্লায়েন্টগুলো ফায়ারওয়াল মার্ক বা ডিভাইসে-বাইন্ড কল দিয়ে সমতুল্য ব্যবস্থা বাস্তবায়ন করে।

সুবিধা হলো ব্যতিক্রমটি সংরক্ষিত গেটওয়ের বদলে সংযোগকে অনুসরণ করে। নেটওয়ার্ক পরিবর্তন অন্তর্নিহিত পথ পুনর্লিখন করে, আর সুরক্ষিত সকেটটি তার সঙ্গে সরে যায় কারণ এটি কখনও ঠিকানায় পিন করা হয়নি। রাউট টেবিল পরিষ্কার থাকে।

খরচ হলো দৃশ্যমানতা। রাউটিং টেবিলে কিছুই ব্যতিক্রমটি দেখায় না, তাই হোস্ট রুট খোঁজা পর্যালোচক কিছুই পান না এবং নকশাটিকে অনিরাপদ মনে করতে পারেন। সুরক্ষাটি ক্লায়েন্টের কোডে এবং ওই কোড যে নীতিনিয়ম ইনস্টল করে তাতে বাস করে।

এদের মধ্যে বেছে নেওয়া

ক্লায়েন্ট সমর্থন করলে সকেট-স্তরের প্রক্রিয়াটি বেছে নিন, কারণ এটি সেই নেটওয়ার্ক পরিবর্তনগুলো সহ্য করে যা পিন করা রুট ভেঙে দেয়। ব্যতিক্রমটি অন্য টুলের কাছে দৃশ্যমান হতে হলে, বা ক্লায়েন্ট আর কিছু না দিলে হোস্ট রুট বেছে নিন।

কোনও প্রক্রিয়াই সার্ভারের ঠিকানাটি আদৌ পৌঁছানোযোগ্য হওয়ার প্রয়োজন মেটায় না। একটি প্রাইভেট গেটওয়ের একটি পাবলিক লিসেনার ঠিকানা থাকে, এবং সেই ঠিকানাই টানেলের বাইরে থাকতে হবে। এর পেছনের অভ্যন্তরীণ নেটওয়ার্কগুলো কেবল টানেল তৈরি হওয়ার পরেই পৌঁছানোযোগ্য হয়।

যেটিই বেছে নিন, টানেলের মালিক যে উপাদান তার কাছেই রাখুন। হাতে যোগ করা একটি এলোমেলো হোস্ট রুট পরবর্তী নেটওয়ার্ক পর্যন্ত কাজ করে, তারপর সেটি কালকের রহস্যময় বিভ্রাটে পরিণত হয়।

সম্পর্কিত নিবন্ধ