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

মিথ: API কোনো সেটিংস সম্পাদক নয়

বিশ্বাসটি হলো, যেহেতু iOS IKEv1, IKEv2, L2TP এবং IPsec প্রোফাইল কনফিগার করতে পারে, একটি অ্যাপ প্রোগ্রামগতভাবে সেগুলোর যেকোনোটি তৈরি করতে পারে। পারে না। ফ্রেমওয়ার্ক কলকারী অ্যাপকে ঠিক একটি কনফিগারেশন স্লট দেয়, এবং সেই স্লট কেবল অল্প কিছু পাবলিক প্রোটোকল ক্লাস গ্রহণ করে। মানুষের প্রত্যাশিত বাকি সবকিছু, L2TP থেকে ডাউনলোড করা প্রোফাইল পর্যন্ত, সেই পৃষ্ঠের বাইরে থাকে বা Apple-এর ব্যক্তিগত।

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

তিনটি প্রোটোকল অবজেক্ট এবং যেগুলোর অস্তিত্ব নেই

আপনার বিকল্প হলো NEVPNProtocolIPSec-এর মাধ্যমে IKEv1, NEVPNProtocolIKEv2-এর মাধ্যমে IKEv2, এবং নিজের প্যাকেট টানেল এক্সটেনশন সরবরাহ করলে NETunnelProviderProtocol। NEVPNManager রেফারেন্স গৃহীত প্রোটোকল অবজেক্টগুলোর তালিকা দেয়। L2TP এবং PPTP কখনো সেই তালিকায় আসে না, কারণ Apple তাদের জন্য কোনো ক্লাস প্রকাশ করেনি। যেকোনোটি চেষ্টা করলে সংরক্ষণের সময় ত্রুটিতে শেষ হয়, বা আরও খারাপ, এমন কনফিগারেশনে যা সিস্টেম চুপচাপ ব্যবহার করতে অস্বীকার করে।

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

পাসওয়ার্ড নয়, কীচেইন রেফারেন্স দিন

কোনো IKE ক্লাসই পাসওয়ার্ডকে টেক্সট হিসেবে গ্রহণ করে না। দুটি প্রপার্টি passwordReference এবং sharedSecretReference একটি স্থায়ী কীচেইন রেফারেন্স চায়, যা আপনি SecItemCopyMatching থেকে kSecReturnPersistentRef চেয়ে পান। আইটেম ডেটা সরবরাহ করা বা জোর করে একটি স্ট্রিং ফিল্ডে ঢোকানো সংরক্ষণে ব্যর্থতা বা খালি ক্রেডেনশিয়ালসহ সংযোগ তৈরি করে। রেফারেন্সটি ততটাই টেকসই যতটা তার পেছনের কীচেইন আইটেম, তাই কনফিগারেশন একত্র করার আগে আইটেমটিকে থাকতেই হবে। সংরক্ষণের সঙ্গে একই ট্রানজ্যাকশনে এটি তৈরি করুন এবং ক্রমসংক্রান্ত ত্রুটির একটি সম্পূর্ণ শ্রেণি সরিয়ে ফেলুন।

সার্টিফিকেট প্রমাণীকরণ ভিন্ন পথ নেয়: PKCS#12 ব্লবের জন্য identityData এবং identityDataPassword। অ্যাপ বান্ডলের ভিতরে সেই ব্লব সরবরাহ করা নমুনা কোড থেকে আসা অভ্যাস, প্রকাশের সিদ্ধান্ত নয়, কারণ পাসওয়ার্ড তার সঙ্গে যায় এবং অ্যাপের প্রতিটি কপি একই পরিচয় বহন করে।

এনটাইটেলমেন্ট ও প্রাপ্যতা সবকিছু নির্ধারণ করে

ম্যানেজার একেবারেই না-ও থাকতে পারে, আর কারণ হলো প্রভিশনিং। আপনার অ্যাপ আইডেন্টিফায়ারের ব্যক্তিগত VPN এনটাইটেলমেন্টের সঙ্গে Network Extension সক্ষমতা দরকার, এবং বিল্ড সাইন করা প্রোফাইলকে দুটোই বহন করতে হবে।

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

লোড করুন, বদলান, সংরক্ষণ করুন, তারপর অন-ডিমান্ড ক্রম দেখুন

জীবনচক্রকে লোড, পরিবর্তন, সংরক্ষণ হিসেবে ধরুন এবং লোড কখনো বাদ দেবেন না। loadFromPreferences সম্পূর্ণ না হওয়া পর্যন্ত ম্যানেজার কিছুই ধরে রাখে না এবং প্রোটোকল অবজেক্ট পড়া বা বদলানো যায় না।

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

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

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