Bir kanca betiğindeki boş $_ENV dizisi, OpenVPN hiçbir şey geçirmediğinin kanıtı gibi görünür. Genellikle tamamen başka bir şeyi kanıtlar: PHP o süper küresel değişkeni doldurmamak üzere yapılandırılmıştı ve değerler baştan sona süreç ortamındaydı. İkinci yanlış sonuç daha incedir, çünkü bir bağlantı kancasındaki iki adres değişkeni farklı şeyler ifade eder ve birbirlerinin yerine kullanılır. Yanlış olanla başlarsanız iki hata da yarım güne mal olur.

İki adres, iki farklı iddia

Dış uç nokta, istemci bağlandığında sunucunun gözlemlediği şeydir; IPv4 için trusted_ip ve IPv6 için trusted_ip6 olarak kullanılabilir. Sanal adres, havuzun bu oturum için atadığı şeydir ve ifconfig_pool_remote_ip olarak kullanılabilir.

Farklı soruları yanıtlarlar ve bir kayıt genellikle ikisini değil, birini gerektirir. İlki bağlantının nereden geldiğidir; bu, yüzlerce kişinin kullandığı paylaşılan bir NAT adresi olabilir. İkincisi bu oturumun tünelin içinde nerede yaşadığıdır ve daha sonra başka bir oturuma atanabilir. İkisini karıştırmak, akla yatkın görünen ama yanlış kayıtlar üretir.

Asgari bir okuma şöyle görünür.

$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner  = getenv('ifconfig_pool_remote_ip');
$outer  = $outer4 !== false ? $outer4 : $outer6;

Hiçbir değer bir kişiyi tanımlamaz. Biri ağ gözlemi, diğeri kiralamadır ve ikisinden birini kalıcı cihaz tanımlayıcısı olarak gören bir kayıt, bir istemci başka bir ağdan yeniden bağlandığında veya başka bir havuz adresi aldığında ilk seferde yanlış olur. Alanı kaydın yanıtlaması gereken soruya göre seçin, sonra o soruyu sütunun yanına yazın.

PHP'nin nasıl başlatıldığını kontrol edin, kabuğunuzu değil

Kanca, VPN arka plan sürecinin bir çocuğu olarak, o sürecin oluşturduğu ortamla çalışır. Etkileşimli kabuğunuzun ortamı farklıdır ve betiği elle çalıştırmak kancanın değil, kabuğun ortamını test eder.

Önce kancanın gerçekten beklediğiniz aşamada tetiklendiğini doğrulayın. Yanlış aşamaya bağlanmış bir betik veya yönerge başka bir yolu gösterdiği için hiç çalışmamış bir betik, eksik bir değişkenle tamamen aynı belirtiyi verir. Betiğin başına kasıtlı bir işaret satırı ekleyin ve başka bir şeyi incelemeden önce göründüğünü doğrulayın. Günlükteki zaman damgalı tek bir satır, «hiç çalışmadı» ile «değer olmadan çalıştı» arasındaki farkı ayırır.

Ardından o çağrının hangi yorumlayıcıyı ve hangi yapılandırma dosyasını kullandığını doğrulayın. Bir web sunucusu için PHP yapılandırmasını düzenlemek, OpenVPN'in başlattığı bir CLI sürecinde hiçbir şeyi değiştirmez ve ikisi tamamen farklı php.ini dosyaları yükleyebilir.

Boş bir $_ENV neden hiçbir şeyi kanıtlamaz

PHP getenv başvurusu süreç ortamının doğrudan okunmasını belgeler; ad yoksa false döndürür. $_ENV süper küreseli ayrı olarak doldurulur ve variables_order yönergesi hangi süper küresellerin doldurulacağına karar verir.

O yönerge E öğesini atlarsa, ortam ne içerirse içersin $_ENV boş kalır. Onu dizinleyen kod o zaman gerçekte var olan bir değişkeni eksik olarak bildirir ve yanıt php.ini içindeyken soruşturma OpenVPN'e yönelir. Yönergeyi özellikle CLI yapılandırması için kontrol edin, web sunucusu için değil.

getenv ile okumak tüm bu karışıklığı önler ve yorumlayıcıyı çağırmadan önce ortamı temizleyen bir sarmalayıcı betik, onu başka bir biçimde geri getirir.

Satır güncellemesi değil, ilişki saklayın

Yazmadan önce kaydın hangi değere ihtiyacı olduğuna karar verin. Amaç bir oturumun nereden geldiğini not etmekse dış uç noktayı saklayın ve gözlem olarak etiketleyin. Amaç bir oturumu bağlantı süresi boyunca bir tünel adresine eşlemekse havuz adresini saklayın ve oturuma bağlayın.

Aynı tünel adresini paylaşan her satır yerine kimliği doğrulanmış kimliğe ve geçerli oturuma göre güncelleyin, çünkü havuz adresleri yeniden kullanılır ve geç gelen bir bağlantı kesilme olayı yoksa daha yeni bir bağlantının verilerinin üzerine yazabilir. IPv6'yı açıkça ele alın, sessizce yalnızca IPv4 değerini yazmayın. NULL dış adresli bir satır yanlış adresli bir satırdan daha iyidir, çünkü ilki görünür biçimde eksiktir.

Yazmayı OpenVPN'in sağladığı oturum tanımlayıcısına bağlayın ki yeniden bağlanma eski kaydı düzenlemek yerine yeni bir kayıt oluştursun. Parametreli ifadeler ve operasyonun gerektirdiği izinlere sahip bir hesap kullanın. Kanca arka plan sürecinin yetkisiyle çalışır, bu yüzden dikkatsiz bir sorgu yanlış bir günlük satırından daha geniş bir sorundur.

Ortamı dökmeden teşhis edin

Hangi adların bulunduğunu, hangi aşamanın çalıştığını ve hangi yorumlayıcının kullanıldığını günlüğe yazın. Tüm ortamı yazdırmayın, çünkü bir kanca süreci günlük dosyasına girmemesi gereken ilgisiz değerleri miras alabilir.

Bir bağlantıyı baştan sona doğrulayın: dış uç noktayı okuyun, atanan adresi okuyun ve ikisini de sunucunun o oturuma ilişkin kendi görüşüyle karşılaştırın. Çift bir istemci için doğrulandığında ilişkiye başka yerlerde de güvenilebilir.

İlgili makaleler