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 کیسے شروع ہوا، اپنا شیل نہیں
ہک VPN ڈیمون کے بچے کے طور پر، ڈیمون کے بنائے ماحول میں چلتا ہے۔ آپ کے متعامل شیل کا ماحول مختلف ہے، اور اسکرپٹ کو ہاتھ سے چلانا ہک کا نہیں، شیل کا ماحول جانچتا ہے۔
پہلے تصدیق کریں کہ ہک واقعی اسی مرحلے پر چلا جس کی توقع تھی۔ غلط مرحلے سے جڑا اسکرپٹ، یا ایسا جو کبھی نہ چلا کیونکہ ہدایت کسی اور راستے کی طرف اشارہ کرتی ہے، گمشدہ متغیر جیسی ہی علامات پیدا کرتا ہے۔ اسکرپٹ کے اوپر جان بوجھ کر ایک نشان لکیر شامل کریں اور کسی اور چیز کی جانچ سے پہلے تصدیق کریں کہ وہ نظر آتی ہے۔ لاگ میں وقت کے نشان والی ایک لکیر «کبھی نہ چلا» کو «قدر کے بغیر چلا» سے الگ کرتی ہے۔
پھر تصدیق کریں کہ وہ کال کون سا مترجم اور کون سی ترتیب فائل استعمال کرتی ہے۔ ویب سرور کے لیے PHP ترتیب بدلنے سے OpenVPN کے شروع کردہ CLI عمل پر کچھ فرق نہیں پڑتا، اور دونوں بالکل مختلف php.ini فائلیں لوڈ کر سکتے ہیں۔
خالی $_ENV کچھ کیوں ثابت نہیں کرتا
PHP getenv حوالہ عمل کے ماحول کی براہ راست پڑھائی بیان کرتا ہے، جو نام نہ ہونے پر false واپس کرتا ہے۔ $_ENV سپر گلوبل الگ سے بھرا جاتا ہے، اور variables_order ہدایت طے کرتی ہے کہ کون سے سپر گلوبل بھرے جائیں گے۔
اگر وہ ہدایت E چھوڑ دے، تو ماحول میں کچھ بھی ہو $_ENV خالی رہتا ہے۔ اسے اشاریہ کرنے والا کوڈ پھر ایسے متغیر کی گمشدگی کی اطلاع دیتا ہے جو دراصل موجود ہے، اور جب جواب php.ini میں ہوتا ہے تو تحقیق OpenVPN کی طرف مڑ جاتی ہے۔ ہدایت کو خاص طور پر CLI ترتیب کے لیے جانچیں، ویب سرور کے لیے نہیں۔
getenv کے ساتھ پڑھنا اس پوری الجھن سے بچاتا ہے، اور مترجم کو بلانے سے پہلے ماحول صاف کرنے والا لپیٹ اسکرپٹ اسے کسی اور شکل میں واپس لاتا ہے۔
قطار کی تازہ کاری نہیں، تعلق محفوظ کریں
لکھنے سے پہلے طے کریں کہ ریکارڈ کو کون سی قدر درکار ہے۔ اگر مقصد یہ درج کرنا ہے کہ سیشن کہاں سے آیا، تو بیرونی سرا محفوظ کریں اور اسے مشاہدہ کا نام دیں۔ اگر مقصد کنکشن کی مدت کے لیے سیشن کو سرنگ کے پتے سے جوڑنا ہے، تو پول کا پتہ محفوظ کریں اور اسے سیشن سے جوڑیں۔
ایک ہی سرنگ پتہ رکھنے والی ہر قطار کے بجائے تصدیق شدہ شناخت اور موجودہ سیشن کے مطابق تازہ کریں، کیونکہ پول کے پتے دوبارہ استعمال ہوتے ہیں اور دیر سے آیا ہوا منقطع ہونے کا واقعہ نئے کنکشن کا ڈیٹا مٹا سکتا ہے۔ IPv6 کو واضح طور پر سنبھالیں، خاموشی سے صرف IPv4 قدر نہ لکھیں۔ NULL بیرونی پتہ والی قطار غلط پتہ والی قطار سے بہتر ہے، کیونکہ پہلی واضح طور پر نامکمل ہے۔
لکھائی کو OpenVPN کے فراہم کردہ سیشن شناخت کنندہ سے جوڑیں تاکہ دوبارہ جڑنے پر پرانا ریکارڈ ترمیم کرنے کے بجائے نیا ریکارڈ بنے۔ پیرامیٹر والے بیانات اور صرف وہی اجازتیں رکھنے والا اکاؤنٹ استعمال کریں جو عمل کو درکار ہیں۔ ہک ڈیمون کے اختیار سے چلتا ہے، اس لیے لاپرواہ استفسار غلط لاگ لکیر سے بڑا مسئلہ ہے۔
ماحول بہائے بغیر تشخیص کریں
لاگ کریں کہ کون سے نام موجود تھے، کون سا مرحلہ چلا اور کون سا مترجم استعمال ہوا۔ پورا ماحول نہ چھاپیں، کیونکہ ہک عمل ایسی غیر متعلق اقدار ورثے میں لے سکتا ہے جنہیں لاگ فائل میں نہیں آنا چاہیے۔
ایک کنکشن شروع سے آخر تک جانچیں: بیرونی سرا پڑھیں، دیا گیا پتہ پڑھیں، اور دونوں کو اس سیشن کے بارے میں سرور کے اپنے نظریے سے ملائیں۔ ایک کلائنٹ کے لیے جوڑی کی تصدیق کے بعد، تعلق پر دوسری جگہ بھی بھروسہ کیا جا سکتا ہے۔