OpenVPN PHP হুক: trusted_ip বনাম ifconfig_pool_remote_ip
দুটি ভিন্ন অর্থবাহী ঠিকানা, পড়া হচ্ছে এমন একটি প্রক্রিয়া দ্বারা যা আপনি চালু করেননি। হুক ভেরিয়েবলগুলো কী, আর কেন খালি $_ENV কিছুই প্রমাণ করে না।
হুক স্ক্রিপ্টে খালি $_ENV অ্যারে মনে হয় প্রমাণ যে OpenVPN কিছুই পাঠায়নি। সাধারণত এটি সম্পূর্ণ ভিন্ন কিছুর প্রমাণ: PHP কে সাজানো হয়েছিল যেন সেই সুপারগ্লোবালটি পূরণ না হয়, আর মানগুলো পুরো সময় প্রক্রিয়ার এনভায়রনমেন্টেই ছিল। দ্বিতীয় ভুল সিদ্ধান্তটি আরও সূক্ষ্ম, কারণ সংযোগ হুকের দুটি ঠিকানা ভেরিয়েবল ভিন্ন জিনিস বোঝায় এবং পরস্পরের বদলে ব্যবহৃত হয়। দুই ভুলই একটি দুপুর নষ্ট করে, যদি ভুলটি থেকে শুরু করেন।
দুটি ঠিকানা, দুটি ভিন্ন দাবি
বাইরের প্রান্তবিন্দু হলো ক্লায়েন্ট সংযুক্ত হওয়ার সময় সার্ভার যা পর্যবেক্ষণ করেছে, IPv4-এর জন্য trusted_ip এবং IPv6-এর জন্য trusted_ip6 হিসেবে পাওয়া যায়। ভার্চুয়াল ঠিকানা হলো এই সেশনের জন্য পুল যা বরাদ্দ করেছে, ifconfig_pool_remote_ip হিসেবে পাওয়া যায়।
এগুলো ভিন্ন প্রশ্নের উত্তর দেয়, আর একটি রেকর্ডের সাধারণত দুটির বদলে একটিই দরকার। প্রথমটি হলো সংযোগ কোথা থেকে এসেছে, যা শত শত মানুষের ব্যবহৃত শেয়ার করা NAT ঠিকানা হতে পারে। দ্বিতীয়টি হলো এই সেশন টানেলের ভেতরে কোথায় থাকে, এবং পরে এটি অন্য সেশনে পুনর্বিন্যস্ত হতে পারে। দুটিকে গুলিয়ে ফেললে এমন রেকর্ড তৈরি হয় যা বিশ্বাসযোগ্য দেখায় এবং ভুল।
সর্বনিম্ন পাঠ এমন দেখায়।
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;দুটির কোনোটিই কোনো ব্যক্তিকে চিহ্নিত করে না। একটি নেটওয়ার্ক পর্যবেক্ষণ, অন্যটি একটি ইজারা, আর যে রেকর্ড যেকোনোটিকে স্থায়ী ডিভাইস শনাক্তকারী হিসেবে গণ্য করে, সেটি প্রথমবারই ভুল হবে যখন কোনো ক্লায়েন্ট ভিন্ন নেটওয়ার্ক থেকে পুনঃসংযুক্ত হয় বা ভিন্ন পুল ঠিকানা পায়। রেকর্ডটি যে প্রশ্নের উত্তর দিতে হবে সেই অনুযায়ী ক্ষেত্রটি বাছুন, তারপর কলামের পাশে সেই প্রশ্নটি লিখুন।
PHP কীভাবে চালু হয়েছে তা যাচাই করুন, আপনার শেল নয়
হুক ভিপিএন ডেমনের সন্তান হিসেবে চলে, এমন একটি এনভায়রনমেন্ট নিয়ে যা ডেমন তৈরি করে। আপনার ইন্টারঅ্যাকটিভ শেলের এনভায়রনমেন্ট আলাদা, আর স্ক্রিপ্ট হাতে চালালে হুকের নয় বরং শেলের এনভায়রনমেন্ট পরীক্ষা হয়।
প্রথমে নিশ্চিত করুন যে হুক সত্যিই আপনার প্রত্যাশিত পর্যায়ে চালু হয়েছিল। ভুল পর্যায়ে যুক্ত স্ক্রিপ্ট, বা যে কখনো চলে নি কারণ নির্দেশিকাটি অন্য পথে ইশারা করে, তা ঠিক একই উপসর্গ দেয় যেটি অনুপস্থিত ভেরিয়েবল দেয়। স্ক্রিপ্টের শীর্ষে একটি ইচ্ছাকৃত মার্কার লাইন যোগ করুন এবং অন্য কিছু দেখার আগেই তা উপস্থিত হয়েছে কিনা নিশ্চিত করুন। লগে একটি টাইমস্ট্যাম্পযুক্ত লাইন «কখনো চলে নি» থেকে «মান ছাড়া চলে ছিল» আলাদা করে।
তারপর নিশ্চিত করুন সেই আহ্বান কোন ইন্টারপ্রেটার ও কোন কনফিগারেশন ফাইল ব্যবহার করে। ওয়েব সার্ভারের জন্য PHP কনফিগারেশন সম্পাদনা করলে OpenVPN চালু করা CLI প্রক্রিয়ায় কিছুই বদলায় না, আর দুটি সম্পূর্ণ ভিন্ন php.ini ফাইল লোড করতে পারে।
কেন খালি $_ENV কিছুই প্রমাণ করে না
PHP-এর getenv রেফারেন্স প্রক্রিয়ার এনভায়রনমেন্ট সরাসরি পড়ার কথা বর্ণনা করে, যা নাম অনুপস্থিত থাকলে false ফেরত দেয়। $_ENV সুপারগ্লোবালটি পৃথকভাবে পূরণ হয়, আর variables_order নির্দেশিকা ঠিক করে কোন সুপারগ্লোবালগুলো পূরণ হবে।
সেই নির্দেশিকায় E বাদ থাকলে, এনভায়রনমেন্টে যা-ই থাকুক $_ENV খালি থাকে। এটি ইনডেক্স করা কোড তখন এমন অনুপস্থিত ভেরিয়েবলের কথা জানায় যা আসলে উপস্থিত, আর তদন্ত OpenVPN-এর দিকে যায় অথচ উত্তর php.ini-এ। নির্দেশিকাটি বিশেষভাবে CLI কনফিগারেশনের জন্য যাচাই করুন, ওয়েব সার্ভারের জন্য নয়।
getenv দিয়ে পড়া পুরো এই বিভ্রান্তির শ্রেণি এড়ায়, আর ইন্টারপ্রেটার আহ্বানের আগে এনভায়রনমেন্ট পরিষ্কার করা র্যাপার স্ক্রিপ্ট তা ভিন্ন রূপে ফিরিয়ে আনে।
একটি সংযোগ সংরক্ষণ করুন, সারি হালনাগাদ নয়
লেখার আগে ঠিক করুন রেকর্ডের কোন মান দরকার। লক্ষ্য যদি হয় সেশন কোথা থেকে এসেছে তা টুকে রাখা, তবে বাইরের প্রান্তবিন্দু সংরক্ষণ করুন এবং এটি পর্যবেক্ষণ হিসেবে চিহ্নিত করুন। লক্ষ্য যদি হয় সংযোগের সময়কালে সেশনকে টানেল ঠিকানার সঙ্গে মেলানো, তবে পুল ঠিকানা সংরক্ষণ করুন এবং এটি সেশনের সঙ্গে যুক্ত করুন।
প্রতিটি সারি যে টানেল ঠিকানা শেয়ার করে তার ভিত্তিতে নয়, বরং প্রমাণিত পরিচয় ও চলতি সেশনের ভিত্তিতে হালনাগাদ করুন, কারণ পুল ঠিকানাগুলো পুনর্ব্যবহৃত হয় এবং দেরিতে আসা বিচ্ছিন্নতা ঘটনা অন্যথায় নতুনতর সংযোগের তথ্য মুছে দিতে পারে। শুধু IPv4 মান নীরবে লেখার বদলে IPv6 স্পষ্টভাবে সামলান। NULL বাইরের ঠিকানাযুক্ত সারি ভুল ঠিকানাযুক্ত সারির চেয়ে ভালো, কারণ প্রথমটি দৃশ্যতই অসম্পূর্ণ।
লেখাটি OpenVPN প্রদত্ত সেশন শনাক্তকারীর সঙ্গে যুক্ত করুন যাতে পুনঃসংযোগ পুরোনোটি সম্পাদনার বদলে নতুন রেকর্ড তৈরি করে। প্যারামিটারাইজড স্টেটমেন্ট এবং কেবল অপারেশনের প্রয়োজনীয় অনুমতিসম্পন্ন অ্যাকাউন্ট ব্যবহার করুন। হুক ডেমনের ক্ষমতায় চলে, তাই অসতর্ক কোয়েরি ভুল লগ লাইনের চেয়ে বড় সমস্যা।
এনভায়রনমেন্ট ডাম্প না করেই নির্ণয় করুন
কোন নামগুলো উপস্থিত ছিল, কোন পর্যায় চলেছিল এবং কোন ইন্টারপ্রেটার ব্যবহৃত হয়েছিল তা লগ করুন। পুরো এনভায়রনমেন্ট প্রিন্ট করবেন না, কারণ হুক প্রক্রিয়া অপ্রাসঙ্গিক মান উত্তরাধিকারে পেতে পারে যা লগ ফাইলে থাকা উচিত নয়।
একটি সংযোগ শুরু থেকে শেষ পর্যন্ত যাচাই করুন: বাইরের প্রান্তবিন্দু পড়ুন, বরাদ্দকৃত ঠিকানা পড়ুন, এবং দুটিই সেই সেশন সম্পর্কে সার্ভারের নিজস্ব দৃষ্টিভঙ্গির সঙ্গে মিলিয়ে নিশ্চিত করুন। এক ক্লায়েন্টের জন্য জোড়াটি নিশ্চিত হলে, সংযোগটি অন্যত্রও বিশ্বাস করা যায়।