এক মুহূর্তে ল্যাপটপ অফিসের Wi-Fi-তে, পরের মুহূর্তে ফোনে টেথার করা, আর উইন্ডো বদলানো শেষ করার আগেই টানেলের সূচক আবার সবুজ। সবুজ বাতি শুধু জানায় টানেল আবার যুক্ত হয়েছে; ওই ফাঁকে রাউটিং ও ব্লকিং নীতি কী করেছে, সেটা আলাদা প্রশ্ন। ওই নীতি হলো মিলকরণের শর্তগুলোর একটি সেট, যা শেষবার ইনস্টল করার সময় সংকলিত হয়েছিল, আর তাতে একটা ইন্টারফেস, একটা ঠিকানা আর একটা ঠিকানা-পরিবারের নাম আছে যা হ্যান্ডওভার এইমাত্র সরিয়ে দিয়েছে। তাই একই সুইচ তিনটি ফল দেয় যা দেখতে এক: ব্লকিং চলতে থাকে, নীতি নিজের পুনরুদ্ধারকেই ব্লক করে, বা এমন পথ খোলে যা কিছুই ঢাকে না।

পর্দায় ওই তিনটি অবস্থার কোনো পার্থক্য নেই, তাই সূচকের রং কী দেখায় তা না ভেবে জিজ্ঞাসা করুন নিয়মগুলো কোন শনাক্তকারীতে পিন করা ছিল। Linux-এ একটি নিয়ম একটি ইন্টারফেসের নাম বলতে পারে, বা একটি ইন্টারফেস থেকে ভরা ipset-এর নাম বলতে পারে; Android-এ VpnService-কে setUnderlyingNetworks দিয়ে বলা যায় কোন অন্তর্নিহিত নেটওয়ার্কগুলো অনুসরণ করতে হবে। প্রতিটি বাঁধন এমন একটি লিংকের দিকে ইশারা করে যা বদলে যেতে চলেছে, আর প্রতিটিকেই পরে আবার মূল্যায়ন করতে হয়।

হ্যান্ডওভার আসলে কী আবার লেখে

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

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

গর্ত না করে বাইরের টানেল আবার গড়া

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

ক্লায়েন্টরা এখানে ভিন্ন, আর ডায়াগনোসিসের সময় সেটি গুরুত্বপূর্ণ। কেউ আগে রিজলভ করে পরে নিয়ম বসায়, তাই হ্যান্ডওভারে একটি দৃশ্যমান বিভ্রাট হয় আর পরে নিজে থেকেই সেরে যায়; কেউ ব্লক চালু রাখে আর বেঁচে থাকা টানেলের ওপর ভরসা করে লুকআপ বহন করতে, যা লিংকের সঙ্গে টানেল মরে গেলে পুরোপুরি ব্যর্থ হয়। সংযোগ ফেরাতে একটি চওড়া সরাসরি ডিফল্ট যোগ করলে পরীক্ষাটি সবসময় পাস হয় আর আপনি যে ফাঁস ঠেকাচ্ছিলেন সেটি সবসময় রয়ে যায়।

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

ip route get 1.1.1.1
ip -6 route get 2606:4700:4700::1111

নতুন লিংক IPv6 আনলে আর নিয়মগুলো না আনলে

সেলুলার ও গেস্ট নেটওয়ার্ক প্রায়ই একটি গ্লোবাল IPv6 প্রিফিক্স দেয়, যদিও অফিসের তারযুক্ত LAN কখনো দেয়নি। কেবল IPv4 নিয়ম হিসেবে লেখা নীতি, অর্থাৎ বেশিরভাগ হাতে-গড়া iptables ও nftables রেসিপির ডিফল্ট আকার, এর কিছুই ঢাকে না। টানেল যুক্ত থাকে, IPv6 পৌঁছানোযোগ্যতা আছে এমন অ্যাপ্লিকেশনগুলো তার বাইরে বেরিয়ে যায়, আর সূচক পার্থক্যটি দেখাতে পারে না কারণ টানেল সত্যিই চালু। উল্টো কেসটিও সমান সাধারণ: কেবল IPv6-এর নিয়মের সেট এমন নেটওয়ার্কে কিছুই করে না যেখানে v6 নেই।

হ্যান্ডওভারের দুই পাশেই লিংক যা দেয় আর নীতি যা উল্লেখ করে তা মিলিয়ে দেখুন। এগুলো সেই একই তথ্য ছাপে যা নিয়ে ক্লায়েন্ট কাজ করছে:

ip -4 route show default
ip -6 route show default
sudo nft list ruleset | grep -c 'ip6 '

যদি দ্বিতীয় কমান্ড একটি ডিফল্ট রুট ছাপে আর তৃতীয়টি শূন্য ফেরত দেয়, তবে নতুন লিংক মেশিনটিকে IPv6 দিয়ে বাইরে নিয়ে যেতে পারে, কোনো নিয়ম তা দেখছে না। সুইচের পরে তিনটিই আবার চালান, কারণ আকর্ষণীয় সংখ্যা হলো দুই চালনার পার্থক্য। যদি দ্বিতীয়টি কিছু না ছাপে, উল্টো কেসটি প্রযোজ্য, আর যেকোনো v6-ভারী নীতি সেখানে কেবল সাজসজ্জা।

রিজলভার সেশনের মাঝখানে হাত বদলায়

আধুনিক সিস্টেমে রিজলভারগুলো লিংকের সঙ্গে যুক্ত থাকে, তাই নতুন লিংক আসে নতুন রিজলভার সেট নিয়ে এবং সম্ভবত ভিন্ন split-DNS দৃশ্য নিয়ে। systemd-resolved প্রতি লিংকে একটি scope রাখে আর রুট অনুযায়ী তাদের মধ্যে বেছে নেয়, অন্যদিকে macOS ডাইনামিক স্টোর থেকে scoped রিজলভার পড়ে এবং ইন্টারফেসের ক্রম মানে। যে ক্লায়েন্ট নিজের রিজলভার বসায় সে লিংকের রিজলভারের সঙ্গে প্রতিযোগিতা করে, আর কেউ না-দেখা অগ্রাধিকার নিয়মগুলোই বিজয়ী ঠিক করে। তখন নাম রিজলিউশন ভেঙে যেতে পারে, অথচ প্যাকেট ফিল্টারিং ঠিক তাই করছে যেটার জন্য তাকে লেখা হয়েছিল।

কনফিগার করা রিজলভার নয়, সক্রিয় রিজলভারটাই পড়ুন। systemd হোস্টে status সাবকমান্ড দেখায় কোন scope কোন লিংক থেকে এসেছে আর কোনো private-DNS নাম চালু আছে কি না:

resolvectl status --no-pager
resolvectl query intranet.example.com

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

হ্যান্ডওভার অভ্যাস করুন আর রেকর্ড রাখুন

ইচ্ছে করেই পরিবর্তনটি পুনরুৎপাদন করুন, তার জন্য অপেক্ষা নয়। প্রথম লিংকে টানেল তুলুন, একটি দীর্ঘস্থায়ী ট্রান্সফার আর বারবার লুকআপ শুরু করুন, তারপর লিংক বদলে দেখুন কোনটি টিকে থাকে। পুরনো লিংক হারানোর আর টানেলের যুক্ত হওয়ার রিপোর্টের মধ্যের ব্যবধানটি লিখে রাখুন, কারণ ওই জানালাতেই নীতিটি টিকেছিল কি টিকেনি। ক্রমটি উল্টো দিকেও চালান, যাতে ফল একপাক্ষিক না হয়।

ব্যতিক্রমগুলোর জন্য আলাদা পাস দরকার, কারণ পুরনো নেটওয়ার্কে ন্যায্য একটি বাইপাস নতুনটিতে স্বয়ংক্রিয়ভাবে ন্যায্য নয়। বাড়ির LAN-এ একটি প্রিন্টার, একটি NAS বা একটি ক্যাপটিভ পোর্টালের সেলুলারে কোনো সমতুল্য নেই, আর যে ব্যতিক্রম সেখানে পৌঁছাত সেটিও সমতুল্যহীন নিয়ম হয়ে যায়।

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

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