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

বক্স নয়, রুটের দিকে তাকান

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

সংযোগের ঠিক মুহূর্তে যে SSH সেশন ছিঁড়ে যায় তা প্রত্যাশিত আচরণ। ক্লায়েন্ট অ্যাডাপ্টর পুনর্ব্যবহার করে ও রুট ইনস্টল করে, তাই সংযোগ কয়েক সেকেন্ডের জন্য মরে। ত্রুটি হলো সেই সংযোগ যা কখনও ফেরে না, পলক পড়া সংযোগটি নয়।

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

ip -4 route get 192.168.56.10
ip -brief addr show
ip route show table main | head -20

সংযোগের আগে ও পরে হোস্টের টেবিল পড়ুন

লিনাক্সে ওভারল্যাপিং রুটের মধ্যে অগ্রাধিকার আসে প্রিফিক্স দৈর্ঘ্য ও মেট্রিক থেকে, তাই আরও নির্দিষ্ট VPN রুট ভুল হলেও জেতে। উইন্ডোজে ইন্টারফেস মেট্রিক সমতা নির্ধারণ করে, এবং টানেল অ্যাডাপ্টর সাধারণত ভার্চুয়ালটির চেয়ে কম মেট্রিকে আসে। দুই ক্ষেত্রেই দৃশ্যমান লক্ষণ একই: প্যাকেট টানেল অ্যাডাপ্টর দিয়ে বেরিয়ে হারিয়ে যায়।

গেস্ট প্রিফিক্সের রুটের পাশে অ্যাডাপ্টর ও তাদের মেট্রিক ছাপুন। ওই দুই আউটপুট এক নজরেই মালিকানার প্রশ্নের উত্তর দেয়।

Get-NetAdapter | Select-Object Name, InterfaceIndex, InterfaceMetric
Get-NetRoute -DestinationPrefix 192.168.56.0/24
route print -4 | Select-String '192.168.56'

রুট বদলালে কিন্তু অ্যাডাপ্টর মেট্রিক না বদলালে, ক্লায়েন্ট একটি প্রতিদ্বন্দ্বী রুট ইনস্টল করেছে। মেট্রিক বদলালে, ক্লায়েন্ট অ্যাডাপ্টরগুলো পুনর্বিন্যাস করেছে। দুটোই ঠিক করা যায়, আর দুটোই আলাদা জায়গায় ঠিক হয়।

যখন গেস্টের NAT রেঞ্জই সংঘর্ষ

VirtualBox NAT ডিফল্টভাবে 10.0.2.0/24 ব্যবহার করে, আর যে টানেল একই রেঞ্জ চাপায় সে গেস্টকে সেই ট্রাফিক আসল গন্তব্যের বদলে তার NAT গেটওয়েতে পাঠায়। প্যাকেট কখনও হোস্ট ছাড়ে না, তাই ওপাশের কোনো ফায়ারওয়াল লগ তা দেখাবে না। Docker Machine-এর শুধু-হোস্ট প্ল্যানে একই শ্রেণির সংঘাত আছে, আর সেই প্ল্যান বদলালে মেশিনটি তার সার্টিফিকেটসহ নতুন করে তৈরি করতে হতে পারে।

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

মেশিন তৈরির সময়ই নতুন রেঞ্জ নির্ধারণ করুন, অথবা তা বদলে পুনরায় লোড করুন, তারপর গেস্ট থেকে আবার ব্যর্থ সংযোগটি পরীক্ষা করুন। গেস্টের নিজের টেবিলই সেই দৃশ্য যা গুরুত্বপূর্ণ।

VBoxManage modifyvm devbox --natnet1 10.77.0.0/24
vagrant reload devbox --provision
vagrant ssh devbox -c 'ip route get 10.20.0.15'

ক্লায়েন্টের সঙ্গে লড়াই না করে পথটি ফিরিয়ে আনুন

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

বুটে অন্ধভাবে পুনঃসংযোগের বদলে চেকটি স্ক্রিপ্ট করুন। প্রতিটি সংযোগের পর গেস্ট প্রিফিক্সের রুট ছাপানো ছোট একটি স্ক্রিপ্ট রহস্যকে লগের এক লাইনে বদলে দেয়।

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

উভয় পাশে সমাধানটি যাচাই করুন

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

যে ইন্টারফেস, মেট্রিক ও রুট বদলেছে তা সময়ের সঙ্গে লিখে রাখুন, যাতে পরেরবার পুনর্নির্মাণ নয়, খোঁজ করেই পাওয়া যায়। ওই নোট লম্বা টিকিট থ্রেডের চেয়ে বেশি মূল্যবান।

ip -4 route get 192.168.56.10
traceroute -n -m 4 10.20.0.15
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com

হোস্ট আবার গেস্টে পৌঁছালে এবং গেস্ট LAN-এ পৌঁছালে, আপনি যে পথ দিয়ে শুরু করেছিলেন তা ফিরে পেয়েছেন। এর একটিমাত্র কাজ করলে অবশিষ্ট ত্রুটি অন্য মালিকের এলাকায়, আর পার্থক্যই বলে দেয় কোন এলাকা সেটি।

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