iPhone কি VPN-এ আছে? একটি iOS অ্যাপ আসলে কী দেখতে পারে
iOS SDK-তে কোনো একক VPN ফ্ল্যাগ নেই। একটি অ্যাপ কেবল নিজের কনফিগারেশন, একটি স্ট্যাটাস নোটিফিকেশন আর সীমিত পরিসরের প্রক্সি স্ন্যাপশট দেখতে পারে, এর বেশি নয়।
একটি iOS অ্যাপকে জিজ্ঞাসা করুন ফোনটি VPN-এ আছে কি না, আর সৎ উত্তর হলো—আপনি যে অর্থে চাইছেন, সেভাবে এটি জানতে পারে না। «ডিভাইস টানেলের ভেতরে আছে»—এমন কোনো ফ্ল্যাগ SDK দেয় না, আর যে প্রাইভেট ইন্টারফেসগুলো এর কাছাকাছি যেতে পারত, সেগুলো প্রকাশিত অ্যাপের জন্য বন্ধ। আপনি আপনার অ্যাপের নিজের কনফিগারেশন, তার সঙ্গে যুক্ত অবস্থা, আর নেটওয়ার্ক স্ট্যাক থেকে এক-দুটি পরোক্ষ ইঙ্গিত দেখতে পারেন। প্রতিটি ভিন্ন প্রশ্নের উত্তর দেয়, আর বেশিরভাগ ভাঙা চেক আসে এদের একটিকে পুরো উত্তর ভেবে নেওয়া থেকে।
একক VPN ফ্ল্যাগের মিথ
ধারণাটি হলো, SDK-র কোথাও একটা প্রোপার্টি আছে যা জানায় ডিভাইস টানেলের ভেতরে কি না—যেভাবে রিচেবিলিটি ফ্ল্যাগ জানায় কোনো হোস্ট উত্তর দিচ্ছে কি না। এমন কোনো পাবলিক প্রোপার্টি নেই। থাকলেও, «একটি টানেল আছে» আর «আমার ট্রাফিক সেটি ব্যবহার করছে» ভিন্ন দাবি, আর বেশিরভাগ অ্যাপের কাছে গুরুত্বপূর্ণ কেবল দ্বিতীয়টি।
এই ফাঁকই সেই লাইব্রেরিগুলোর কারণ, যারা এক লাইনের VPN ডিটেক্টর বিজ্ঞাপন দেয়, তারা সাধারণত ভঙ্গুর কিছু পড়ে—ইন্টারফেসের নাম বা প্রক্সি কী—আর সেটিকে রায় হিসেবে উপস্থাপন করে।
nil-কে বিশ্বাস করার আগে প্রেফারেন্স লোড করুন
শেয়ার্ড ম্যানেজার ইনস্ট্যান্স আপনি চাওয়ামাত্রই থাকে, কিন্তু তার প্রোটোকল প্রোপার্টি লোড কলব্যাক শেষ হওয়ার আগ পর্যন্ত nil থাকে। তাই nil প্রোটোকল মানে «এখনো লোড হয়নি» অন্তত ততবার, যতবার তা মানে «ইনস্টল করা নেই»। পড়াটা কমপ্লিশন ব্লকের ভেতরে করুন, তারপরেই সিদ্ধান্ত নিন: যে প্রোটোকল অবজেক্ট আছে আর যার এনেবল ফ্ল্যাগ চালু, সেটাই «ইনস্টল করা» দেখতে যেমন হয় তেমন।
দ্বিতীয় সংকেত আছে কানেকশন অবজেক্টে: ইনভ্যালিড অবস্থা, যা সিস্টেম জানায় যখন এই অ্যাপের কোনো কনফিগারেশন ইনস্টল করা নেই। সম্পূর্ণ লোডের পর ইনভ্যালিড স্ট্যাটাস আর nil প্রোটোকল একসঙ্গে সত্যিকারের অনুপস্থিতি, টাইমিং রেস নয়।
কানেকশন পরিবর্তন নোটিফিকেশন হিসেবে আসে
load আর save-এ দেওয়া হ্যান্ডলার জানায় কনফিগারেশনের কী হয়েছে, টানেল কী করছে নয়। কানেক্টের সময় তাদের একটির ফায়ার হওয়ার অপেক্ষা এমন এক রেস যা কখনো মিটে না। বরং স্ট্যাটাস-পরিবর্তনের নোটিফিকেশন লক্ষ্য করুন, আর সেটি এলে কানেকশন অবজেক্টের বর্তমান মান পড়ুন।
কনফিগারেশন ইনস্টল হয়ে গেলে কানেকশন স্টেট একটি ছোট ক্রম পেরোয়: ডিসকানেক্টেড, কানেক্টিং, কানেক্টেড, রিঅ্যাসার্টিং, ডিসকানেক্টিং। কানেক্টেড টানেলকে বর্ণনা করে, তার পেছনের সার্ভারকে নয়, তাই এটি ট্রাফিক প্রবাহিত হওয়ার প্রমাণ নয়। On-demand অ্যাপ সাসপেন্ড থাকাকালীনও টানেল তুলতে পারে, আর তখন আপনার আপডেট করার কিছু থাকার আগেই নোটিফিকেশন এসে পড়ে।
সীমিত প্রক্সি স্ন্যাপশট একটি ইঙ্গিত, রায় নয়
CFNetwork অ্যাপকে সিস্টেমের বর্তমান প্রক্সি সেটিংস দিতে পারে, আর সেই ফলের ভেতরে ইন্টারফেসের নাম দিয়ে চাবিকৃত একটি সীমিত অভিধান থাকে। tun, utun, ppp, ipsec বা tap দিয়ে শুরু হওয়া নাম দেখা টানেল থাকার ইঙ্গিত। এটি এই অ্যাপ যা দেখতে পারে তার স্ন্যাপশটই থাকে, প্যাকেট কোথায় যায় তার বিবৃতি নয়।
প্রোভাইডাররা নামকরণ নিয়ে একমত নয়, তাই প্রিফিক্স না থাকা কিছুই প্রমাণ করে না, আর থাকা ইন্টারফেস কোনো ট্রাফিক না বহন করেও থাকতে পারে। রিচেবিলিটি আরও দুর্বল: একটি প্রাইভেট ঠিকানায় সফল অনুরোধ দেখায় সেই মুহূর্তে সেই অনুরোধের জন্য পথটি কাজ করেছে, VPN ইনস্টল আছে তা নয়।
সিমুলেটর Mac ধার করে, আর অন্য অ্যাপ অদৃশ্য থাকে
সিমুলেটরের নিজের কোনো নেটওয়ার্ক স্ট্যাক নেই; এটি যে সংযোগই করে, তা Mac-এর। তাই হোস্ট Mac-এ চলা VPN সিমুলেটেড অ্যাপের জন্য ইতিমধ্যেই কার্যকর, আর সিমুলেটরের নিজের সেটিংস কিছুই দেখায় না। সিমুলেটর চালু হওয়ার পর টানেল উঠলে অ্যাপ ডিবাগ করার চেয়ে সিমুলেটর পুনরায় চালু করা সাধারণত দ্রুততর। ননস্ট্যান্ডার্ড পোর্টে থাকা হোস্টের ক্ষেত্রে URL-এ সেই পোর্ট লাগে, বা socat TCP-LISTEN:12345,fork TCP:host:12345-এর মতো লোকাল ফরওয়ার্ড লাগে।
পাবলিক API অন্য অ্যাপ বা কনফিগারেশন প্রোফাইলের VPN প্রোফাইল তালিকাভুক্ত করবে না। একটি পরিচিত অ্যাপের জন্য canOpenURL দিয়ে URL স্কিম প্রোবই বহনযোগ্য কৌশল, আর iOS 9 থেকে জিজ্ঞাসিত স্কিমটি আপনার Info.plist-এ ঘোষণা করতে হয়; না দিলে কলটি false ফেরত দেয়। OpenVPN Connect openvpn://-এ সাড়া দেয়, যা ভালো উদাহরণ আর খারাপ সাধারণ ডিটেক্টর।
তিনটি পর্যবেক্ষণ মিলিয়ে বলুন তারা কী বোঝায়
বাস্তবে তিনটি ফল একত্রে রাখুন: একটি কনফিগারেশন যা লোড হয়েছে ও চালু আছে, একটি কানেকশন স্টেট যা ইনভ্যালিড নয়, আর এমন ঠিকানায় অনুরোধ যা কেবল টানেল দিয়েই পৌঁছায়। এদের যেকোনো একটি একা বিভ্রান্ত করে; একসঙ্গে তারা বলে অ্যাপ কী জানতে পারে, ব্যবহারকারী কী ধরে নেয় তা নয়।
ফলটি আপনার ডায়াগনস্টিকে এক boolean হিসেবে নয়, তিন লাইন হিসেবে লিখুন। ব্যবহারকারী যখন বলেন VPN বন্ধ, আর আপনার অ্যাপ একমত হয় না, তিন লাইন দেখায় কোন পর্যবেক্ষণটি আলাদা হয়েছে, আর এটাই এমন সাপোর্ট টিকিটের মধ্যে পার্থক্য যেখানে আপনি কিছু করতে পারেন আর যেটি «আমার কাছে কাজ করে» দিয়ে শেষ হয়।