একটি হুক স্ক্রিপ্ট টানেলের অপর প্রান্তে পৌঁছাতে পারে কি না তা তিনটি শর্তের উপর নির্ভর করে: এটি কোন ইভেন্টের সাথে যুক্ত, স্ক্রিপ্ট চলার সময় OpenVPN এখনও তার স্টার্টআপ ক্রমের ভেতরে আছে কি না, এবং কাজটি সেই ক্রম থেকে আলাদা করা হয়েছে কি না। বেশিরভাগ স্ক্রিপ্ট তৃতীয়টিতে ব্যর্থ হয়। একটি স্লিপ যোগ করা জীবনচক্রের সমস্যাকে সময়ের সমস্যা হিসেবে দেখে, আর এটি ঠিক ততটাই কাজ করে যতটা বিভ্রান্ত করার জন্য যথেষ্ট।

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

কেন হুক এমন টানেলের জন্য অপেক্ষা করে যা তার জন্য অপেক্ষা করছে

OpenVPN তার হুকগুলোকে সিঙ্ক্রোনাসভাবে ডাকে, যে প্রসেসটি প্যাকেট সরায় তারই ভেতরে। tun বা tap ডিভাইস তৈরি হওয়ার পর কিন্তু কোনো রুট যোগ হওয়ার আগে up চালু হয়, আর রুটের পরে চালু হয় route-up; এই দুই মুহূর্তের কোনোটিই প্রতিপক্ষ উত্তর দেবে বলে প্রতিশ্রুতি দেয় না। যেকোনো হুকের স্ক্রিপ্ট যখন চলছে, ডেমন তখন ফরওয়ার্ড করছে না, তাই যে কমান্ড টানেলের মধ্য দিয়ে ট্রাফিক যাওয়ার আশা করে সে এমন টানেলের জন্য অপেক্ষা করে যা ওই কমান্ডের জন্য অপেক্ষা করছে। এই চক্রাকার অপেক্ষাই হাতে চালালে সফল হওয়া আর হুকে সময় শেষ হওয়ার কারণ।

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

সুবিধা নয়, ইভেন্ট অনুযায়ী হুক বাছুন

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

হুক কমান্ড ডেমন সরাসরিই চালায়, মাঝখানে কোনো শেল ছাড়া, তাই up লাইনে ifconfig_remote আক্ষরিক লেখা হিসেবে আসে। কমান্ডটি স্পষ্ট শেলে মুড়ে দিন, অথবা লজিকটি এমন স্ক্রিপ্টে রাখুন যা পরিবেশ পড়ে। ipchange এমন এক নির্দেশ যা নিজের আর্গুমেন্ট যোগ করে: এটি কমান্ডকে ঠিকানা ও পোর্ট দেয়, তাই কোনোটির জন্য না লেখা স্ক্রিপ্ট দুটি অপ্রত্যাশিত আর্গুমেন্ট দেখে।

কাজ আলাদা করার তিনটি উপায়

প্রথম বিকল্প হুকের ভেতর থেকেই হেল্পারকে ব্যাকগ্রাউন্ডে পাঠানো: setsid বা systemd-run --scope দিয়ে শুরু করুন, উত্তরাধিকারসূত্রে পাওয়া ডেসক্রিপ্টরগুলো বন্ধ করুন এবং সঙ্গে সঙ্গে শূন্য দিয়ে প্রস্থান করুন। দ্বিতীয়টি হল হুক একটি ছোট স্টেট ফাইল লেখে আর systemd টাইমার বা পাথ ইউনিট তার উপর কাজ করে, যা হুককে তুচ্ছ রাখে এবং পুনঃচেষ্টার নীতি লগ আছে এমন জায়গায় রাখে। তৃতীয়টি হল হুক পুরোপুরি বাদ দিয়ে কাজটি VPN পরিষেবার পরে সাজানো ইউনিটে সরানো, যা সঠিক উত্তর যখন কাজটি আদৌ প্রতি-সংযোগের নয়। তিনটিই একটি নিয়ম ভাগ করে: হুকের টানেল দরকার হওয়ার আগেই তাকে ফিরতে হবে।

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

স্যান্ডবক্স ব্যর্থতাকে জীবনচক্র ব্যর্থতা থেকে আলাদা করুন

যখন একটি স্ক্রিপ্ট root প্রম্পট থেকে চলে আর পরিষেবা হিসেবে ব্যর্থ হয়, কারণ সাধারণত নেটওয়ার্ক নয়, স্যান্ডবক্স। সীমিত ProtectHome, শুধু-পাঠযোগ্য ProtectSystem, বা এমন কাজের ডিরেক্টরি যা নেই স্ক্রিপ্ট বা তার ডেটা অপ্রাপ্য করে দিতে পারে, আর SELinux হোস্টে ফাইলটির চালনা অনুমোদনকারী কনটেক্সটও দরকার। systemctl cat openvpn-server@server দিয়ে ইউনিট পড়ুন এবং journalctl -u openvpn-server@server -n 80 দিয়ে জার্নাল, তারপর সংযোগ টাইমআউট নয়, অনুমতি বা কনটেক্সট ত্রুটি খুঁজুন। স্যান্ডবক্স নিষ্ক্রিয় করা প্রথম নয়, শেষ পদক্ষেপ হওয়া উচিত।

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

তিনটি ক্ষেত্র পরের রিপোর্টকে কাজে লাগায়: কোন হুক চলেছিল, কোন অ্যাকাউন্ট ব্যবহার করেছিল, আর কোথায় থেমেছিল। এগুলো ছাড়া প্রতিটি পরবর্তী তদন্ত আবার শুরু থেকে হয়।

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