খুব আলাদা দুটি কাজ প্রোগ্রাম্যাটিক VPN নামের নিচে পড়ে, আর দুটির মধ্যে কেবল একটি দুটি মোবাইল প্ল্যাটফর্মের যেকোনোটিতে সাধারণ অ্যাপের জন্য পাওয়া যায়। প্রথমটি হলো ব্যবহারকারী আগেই সংরক্ষণ করা একটি প্রোফাইল চালু করা; দ্বিতীয়টি হলো নিজের প্রসেসের ভিতরে একটি টানেল তৈরি করা। Android দ্বিতীয়টি VpnService দিয়ে দেয়, আর iOS দ্বিতীয়টি Network Extension এনটাইটেলমেন্ট দিয়ে দেয়, যখন প্রথমটি সিস্টেম, ডিভাইসের মালিক বা একটি MDM সার্ভারের কাছে থাকে। আপনার আসলে কোনটি দরকার তা বের করা সাধারণত প্রকল্পটিকে ছোট করে দেয়।

একই নামে দুটি কাজ

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

কোনো মোবাইল প্ল্যাটফর্মই প্রথমটিকে SDK অ্যাপের সামনে খোলে না। ব্যবহারকারী কিছু না করেই যে সংযোগ হাজির হয়, তাকে ম্যালওয়্যার থেকে আলাদা করা যায় না, তাই দুই সিস্টেমই ট্রাফিক বহনকারী যেকোনো অ্যাপের সামনে সম্মতির দরজা রাখে।

Android: সম্মতির দরজা, আর কোনো প্রোফাইল API নেই

VpnService Android 4.0 থেকে আছে এবং অ্যাপকে একটি tun ইন্টারফেস তৈরি করতে, তারপর প্যাকেট পড়তে ও লিখতে দেয়। সার্ভিসটি BIND_VPN_SERVICE দিয়ে ঘোষণা করতে হয়, আর VpnService.prepare() সেই সিস্টেম ডায়ালগ তৈরি করে যা ব্যবহারকারীর অনুমতি চায়। প্ল্যাটফর্মের নমুনা ToyVpn হলো অভিপ্রেত আকারের সবচেয়ে স্পষ্ট বিবৃতি: আপনার কোডই ইন্টারফেস ও তার ভেতর দিয়ে যাওয়া সবকিছুর মালিক।

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

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

iOS: এনটাইটেলমেন্টই সীমা

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

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

বড় কোনো বিক্রেতার VPN ক্লায়েন্ট এটা প্রমাণ নয় যে আপনার অ্যাকাউন্টও একই জিনিস পাঠাতে পারে। ওই এনটাইটেলমেন্ট প্রতি ডেভেলপার অ্যাকাউন্টের জন্য চাওয়া হয় ও পর্যালোচনা করা হয়, তাই সময়সূচির ঝুঁকি আপনার স্প্রিন্ট প্ল্যানে নয়, Apple-এর কাছে।

ডেস্কটপ আরও দূরে পৌঁছায়, কিন্তু মালিকানা বদলায় না

Windows হলো অনুমতিপ্রবণ ক্ষেত্র। Add-VpnConnection উন্নীত PowerShell সেশন থেকে একটি ফোনবুক এন্ট্রি তৈরি করে, আর rasdial স্ক্রিপ্ট থেকে সেটি সংযোগ বা বিচ্ছিন্ন করে। অ্যাপ তার নথিভুক্ত কমান্ড লাইনের মাধ্যমেও একটি বিক্রেতা ক্লায়েন্ট চালাতে পারে। প্রোফাইল তৈরি করা তবুও প্রশাসনিক কাজ, কারণ এন্ট্রিটি মেশিন-ব্যাপী স্টোরে থাকে।

macOS ভিন্ন টুলে একইভাবে আচরণ করে। scutil --nc start আর stop আগেই বিদ্যমান সার্ভিসে কাজ করে, অথচ একটি নতুন সার্ভিস তৈরি করা সিস্টেম প্রশাসনের কাজ। ল্যাপটপে প্রসেসের মালিক হওয়া আপনাকে কনফিগারেশনের মালিক করে না।

পরিবর্তে কী তৈরি করবেন

যদি আসল দরকার হয় আপনার অ্যাপ একটি অভ্যন্তরীণ API-তে পৌঁছায়, ব্যবহারকারীর আগে থেকেই চালু টানেলই যথেষ্ট। সাধারণ HTTPS অনুরোধ করুন, পথটি সিস্টেমকে বেছে নিতে দিন, আর টানেল নিয়ন্ত্রণের চেষ্টা বন্ধ করুন। যদি দরকার হয় কেবল আপনার অ্যাপের ট্রাফিকই টানেল ব্যবহার করে, ব্যবস্থাপনা চ্যানেল দিয়ে প্রতি-অ্যাপ VPN চান, নয়তো অ্যাপের ভিতরে এমন সার্ভিসের বিপরীতে TLS শেষ করুন যা ছাড়াই পৌঁছানো যায়।

লুকানো API নেওয়ার মতো কোনো শর্টকাট নয়। এরা রিলিজের মধ্যে বদলায়, অ্যাপ পর্যালোচনায় ব্যর্থ হয়, আর যে ত্রুটি এরা তৈরি করে তা কোডের উত্তরাধিকারী কারও কাছে সাধারণ নেটওয়ার্ক ত্রুটি বলেই মনে হয়। তুলনাটি Android বনাম iOS নয়; এটি হলো টানেলের মালিক হওয়া বনাম প্ল্যাটফর্মকে ট্রাফিক রুট করতে বলা, আর কেবল প্রথমটিই আপনার তৈরি করার জিনিস।

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