OpenVPN-ის PHP კავი: trusted_ip და ifconfig_pool_remote_ip
ორი მისამართი ორი განსხვავებული მნიშვნელობით, რომლებსაც კითხულობს პროცესი, რომელიც თქვენ არ გაგისტარტავთ. რა არის კავის ცვლადები და რატომ ცარიელი $_ENV არაფერს ამტკიცებს.
ცარიელი $_ENV მასივი კავის სკრიპტში ჰგავს მტკიცებას, რომ OpenVPN არაფერი გადასცა. ჩვეულებრივ ეს სულ სხვა რამის მტკიცებაა: PHP ისე იყო კონფიგურირებული, რომ ის სუპერგლობალი არ შეევსო, და მნიშვნელობები მთელი დრო პროცესის გარემოში იჯდა. მეორე მცდარი დასკვნა უფრო დახვეწილია, რადგან კავშირის კავში ორი მისამართის ცვლადი სხვადასხვა რამეს ნიშნავს და ერთმანეთის ნაცვლად გამოიყენება. ორივე შეცდომა ნახევარ დღეს ჭამს, თუ არასწორით დაიწყებთ.
ორი მისამართი, ორი განსხვავებული მტკიცება
გარე ბოლო წერტილი არის ის, რაც სერვერმა დააკვირდა კლიენტის მიერთებისას, ხელმისაწვდომი როგორც trusted_ip IPv4-ისთვის და trusted_ip6 IPv6-ისთვის. ვირტუალური მისამართი არის ის, რაც პულმა ამ სესიას გამოუყო, ხელმისაწვდომი როგორც 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 ცარიელი დარჩება, რაც არ უნდა იყოს გარემოში. კოდი, რომელიც მას ინდექსირებს, მაშინ იტყობინება დაკარგულ ცვლადზე, რომელიც სინამდვილეში არსებობს, და გამოძიება OpenVPN-ისკენ მიემართება, მაშინ როცა პასუხი php.ini-შია. შეამოწმეთ ინსტრუქცია კონკრეტულად CLI კონფიგურაციისთვის, და არა ვებ სერვერის.
getenv-ით წაკითხვა გვერდს უვლის ამ არევის მთელ კლასს, და ინტერპრეტატორის გამოძახებამდე გარემოს გამწმენდი გარსი სკრიპტი მას სხვა ფორმით აბრუნებს.
შეინახეთ კავშირი და არა სტრიქონის განახლება
გადაწყვიტეთ, რა მნიშვნელობა სჭირდება ჩანაწერს, სანამ დაწერთ. თუ მიზანია აღნიშნოთ საიდან მოვიდა სესია, შეინახეთ გარე ბოლო წერტილი და მონიშნეთ დაკვირვებად. თუ მიზანია სესია გვირაბის მისამართზე მიაბათ კავშირის ხანგრძლივობით, შეინახეთ პულის მისამართი და დაუკავშირეთ სესიას.
განაახლეთ ავთენტიფიცირებული იდენტობისა და მიმდინარე სესიის მიხედვით და არა გვირაბის მისამართის მქონე ყოველი სტრიქონის მიხედვით, რადგან პულის მისამართები ხელახლა გამოიყენება და დაგვიანებულმა გათიშვის მოვლენამ შეიძლება გადაწეროს უფრო ახალი კავშირის მონაცემები. მართეთ IPv6 ცხადად, ნაცვლად იმისა, რომ ჩუმად მხოლოდ IPv4 მნიშვნელობა დაწეროთ. სტრიქონი NULL გარე მისამართით უკეთესია, ვიდრე არასწორი მისამართის მქონე, რადგან პირველი თვალსაჩინოდ არასრულია.
მიაბით ჩანაწერი OpenVPN-ის მიერ მოწოდებულ სესიის იდენტიფიკატორს, რათა ხელახალი მიერთება ახალ ჩანაწერს ქმნიდეს და არა ძველს არედაქტირებდეს. გამოიყენეთ პარამეტრიზებული განცხადებები და ანგარიში მხოლოდ იმ უფლებებით, რაც ოპერაციას სჭირდება. კავი დემონის უფლებამოსილებით მუშაობს, ამიტომ უყურადღებო მოთხოვნა უფრო ფართო პრობლემაა, ვიდრე არასწორი ჟურნალის სტრიქონი.
დიაგნოსტიკა გარემოს დაცლის გარეშე
ჩაწერეთ რომელი სახელები იყო, რომელი ეტაპი გაეშვა და რომელი ინტერპრეტატორი გამოიყენეს. არ დაბეჭდოთ მთელი გარემო, რადგან კავის პროცესმა შეიძლება მემკვიდრეობით მიიღოს უკავშირო მნიშვნელობები, რომლებიც ჟურნალის ფაილში არ უნდა მოხვდეს.
გადაამოწმეთ ერთი კავშირი თავიდან ბოლომდე: წაიკითხეთ გარე ბოლო წერტილი, წაიკითხეთ გამოყოფილი მისამართი და დაადასტურეთ ორივე სერვერის საკუთარი ხედვის წინააღმდეგ ამ სესიაზე. როცა წყვილი ერთი კლიენტისთვის დადასტურდა, კავშირის ნდობა სხვაგანაც შეიძლება.