যেকোনো প্ল্যাটফর্মে কোড থেকে সক্রিয় VPN টানেল শনাক্ত করার উপায়
টানেলটি আছে কি, এই গন্তব্যটি কি তার মধ্য দিয়ে যায়, নাকি দূর প্রান্ত উত্তর দেয়? এগুলো তিনটি আলাদা পরীক্ষা এবং তিনটি আলাদা সংকেত।
“VPN চালু আছে কি?” আসলে এক বাক্যে তিনটি প্রশ্ন। আপনার কোডের কোনটি দরকার সেটাই প্রথম সিদ্ধান্ত, এবং বেশিরভাগ বাস্তবায়ন ঠিক এটিই এড়িয়ে যায়। এই ডিভাইসে কোনো টানেল আছে কি, এই গন্তব্যের ট্র্যাফিক কি তার মধ্য দিয়ে বেরোয়, নাকি দূর প্রান্ত আপনার প্রত্যাশিত পরিচয় দিয়ে উত্তর দেয়। বৈশিষ্ট্যটি বেছে নিন, তারপর যে সংকেত সেটি মাপে তা বেছে নিন, তারপর লগে লিখুন আপনি আসলে কোনটি মেপেছেন।
তিনটি বৈশিষ্ট্য, তিনটি সংকেত
প্রতিটিকে এক লাইনে সংকুচিত করলে তিনটি প্রশ্নের তিনটি আলাদা উত্তর আছে। নিচের সারণিটি সিদ্ধান্তটাই, তার সারাংশ নয়।
| Property | Signal that answers it | What it still leaves open |
|---|---|---|
| Existence | The platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOS | Tunnels of a type the platform does not manage, which includes most third-party clients |
| Path | A route lookup for the one destination, or a scoped proxy or interface key that names the tunnel | Whether the far end is the peer you trust |
| Identity | An authenticated response from the far end, or a source-address policy applied on the server | Which local interface carried the packets |
শেষ সারিটি ধীরে পড়ুন। যে ব্যক্তিগত হোস্ট উত্তর দেয় তা প্রমাণ করে কিছু একটা উত্তর দিয়েছে, এটা নয় যে উত্তরটি টানেলের মধ্য দিয়ে এসেছে, এবং অন্যপ্রান্তে কে আছে সে সম্পর্কে এটি কিছুই বলে না। আপনার দরকারি বৈশিষ্ট্যটি যদি পথ হয়, তবে পথটাই মাপুন।
অস্তিত্ব: প্ল্যাটফর্মের নিজস্ব অবস্থা
Windows নেটিভ প্রোফাইলের জন্য এটি Remote Access Service API-এর মাধ্যমে উত্তর দেয়। RasEnumConnections কোনটি সংযুক্ত তার তালিকা দেয়, RasGetConnectStatus একটি এন্ট্রির অবস্থা জানায়, আর RasGetLinkStatistics গতি, বাইট কাউন্টার ও সংযোগের বয়স যোগ করে। সীমাবদ্ধতাগুলোই মূল কথা: OpenVPN, WireGuard ও ভেন্ডর ক্লায়েন্টরা কখনো RAS সংযোগ নিবন্ধন করে না, তাই এই ধরনের সুস্থ টানেল খালি তালিকা দেখায় এবং সরল কোড এটিকে বন্ধ বলে রিপোর্ট করে।
Linux ডেস্কটপ একই বৈশিষ্ট্য D-Bus-এর উপর NetworkManager দিয়ে প্রকাশ করে, যেখানে VPN সংযোগ বস্তুর উপর PropertiesChanged পরীক্ষাটিকে ঘটনায় পরিণত করে এবং State বৈশিষ্ট্যটি জানায় কখন লিংক সংযুক্ত অবস্থায় পৌঁছায়। শেল থেকে nmcli connection show --active একই তথ্য পড়ে, ডিবাগিংয়ের সময় ঠিক এটাই দরকার। macOS সেই তালিকা System Configuration ফ্রেমওয়ার্কে রাখে, আর scutil তার কমান্ড-লাইন রূপ। তিনটিই প্ল্যাটফর্মের পরিচালিত একটি সংযোগ বর্ণনা করে, এবং তিনটিই এমন টানেল সম্পর্কে চুপ থাকে যা সে পরিচালনা করে না।
পথ: প্যাকেটটি আসলে কোথায় যায়
নাম মেলানোই সেই শর্টকাট যেখানে সবাই আগে হাত দেয়: ইন্টারফেসগুলো তালিকাভুক্ত করুন, স্ট্রিংটি tun, tap, ppp বা ipsec-এর সাথে মিলিয়ে দেখুন, আর মিলকে প্রমাণ ধরুন। এটি একটি হিউরিস্টিক, এবং ইন্টারফেসের সেট একই দেখাতে পারে তার মধ্য দিয়ে কিছু চলুক বা না চলুক। পুরোনো iOS বিল্ড এভাবে উত্তর দিত আর পরেরগুলো থেমে গেল, কারণ দৃশ্যমান ইন্টারফেস আর দুটি অবস্থাকে আলাদা করত না।
সেখানে এর জায়গা নিয়েছে সিস্টেম প্রক্সি অভিধান। VPN সংযুক্ত থাকাকালে প্রক্সি সেটিংসের কল টানেল-সম্পর্কিত ইন্টারফেসে আবদ্ধ কী ফেরত দেয়, আর কিছুই সংযুক্ত না থাকলে অভিধানটি খালি ফিরে আসে। এটি শোনার চেয়ে দুর্বল একটি বিবৃতি, কারণ এটি টানেল আছে বলে সিস্টেমের বিশ্বাস লিপিবদ্ধ করে, কোন গন্তব্য এটি ব্যবহার করে তা নয়।
Android-এরও এই ফাঁদের নিজস্ব সংস্করণ আছে: vpn.connectivity সম্প্রচার কিছু বিল্ডে ম্যানিফেস্টে ঘোষিত রিসিভার পর্যন্ত পৌঁছায় আর অন্যগুলোতে রানটাইমে নিবন্ধিত রিসিভার পর্যন্ত। এটিকে সর্বোচ্চ প্রচেষ্টা হিসেবে ধরুন, আর এর পিছনে একটি সরাসরি প্রোব রাখুন।
যখন গন্তব্যই মূল বিষয়, তখন অ্যাডাপ্টার তালিকার বদলে রাউটিং টেবিলকে জিজ্ঞাসা করুন। ডিফল্ট-গেটওয়ে হিউরিস্টিক বহু-নেটওয়ার্ক মেশিনে এবং নিজের গেটওয়ে ইনস্টল করা টানেলে ভেঙে পড়ে।
পরিচয়: দূর প্রান্ত অনুসন্ধান করুন
প্রতি কয়েক সেকেন্ডে দূর প্রান্তে ICMP প্রতিধ্বনি পাঠানো লুপ এই ধরনের সবচেয়ে সস্তা পরীক্ষা, এবং এটি উপকারী দিকেই ব্যর্থ হয়। এটি এমন ঠিকানায় লক্ষ্য করুন যা কেবল ব্যক্তিগত নেটওয়ার্কের ভিতরেই আছে, কারণ প্রকাশ্য ঠিকানা যেকোনো কাজ করা আপলিংকের উপর দিয়েই উত্তর দেয় এবং কিছুই প্রমাণ করে না। যেখানে ICMP ফিল্টার করা হয়, সেখানে সেবা পোর্টে সংক্ষিপ্ত TCP সংযোগ একই কাজ করে।
সার্ভার-সাইড পরীক্ষার হাতে ঠিক একটি সংকেতই আছে: সংযোগের উৎস ঠিকানা। রেঞ্জের তালিকা রক্ষণাবেক্ষণ করা একটি রক্ষণাবেক্ষণের কাজ, এবং এটি একই ব্লক ব্যবহার করা অন্য যেকোনো নেটওয়ার্ক থেকে টানেলকে আলাদা করতে পারে না।
মোটা নীতি এর সাথে চলে যেতে পারে। পরিচয় পারে না, তাই এর প্যাকেটগুলো যেখান থেকে আসছে মনে হয় সেখানে বিশ্বাস না করে ক্লায়েন্টকে প্রমাণিত করুন।
বিভাগটি লগ করুন, রায় নয়
ব্যর্থতার বিভাগগুলো লগে আলাদা রাখুন: কোনো ইন্টারফেসই নেই, ইন্টারফেস আছে কিন্তু গন্তব্য পৌঁছানোর বাইরে, গন্তব্যে পৌঁছানো যায় কিন্তু প্রমাণীকরণ প্রত্যাখ্যাত। এরা তিনজন আলাদা মালিক, এবং প্রত্যেকে আলাদা তদন্ত শুরু করে।
এগুলোকে এক “VPN ডাউন”-এ মিলিয়ে দিলে রিপোর্টটি এমন দলে যায় যা এটি ঠিক করতে পারে না। বিভাগটিই কাজের ফল; রায়টিই এটিকে ভুল করে।