OpenVPN PHP cangkuk: trusted_ip lawan ifconfig_pool_remote_ip
Dua alamat dengan dua makna berbeza, dibaca oleh proses yang anda tidak lancarkan. Apakah pemboleh ubah cangkuk, dan mengapa $_ENV kosong tidak membuktikan apa-apa.
Tatasusunan $_ENV yang kosong dalam skrip cangkuk terasa seperti bukti bahawa OpenVPN tidak menghantar apa-apa. Biasanya ia membuktikan sesuatu yang lain sama sekali: PHP dikonfigurasikan supaya tidak mengisi superglobal itu, dan nilainya berada dalam persekitaran proses sepanjang masa. Kesimpulan palsu kedua lebih halus, kerana dua pemboleh ubah alamat dalam cangkuk sambungan bermaksud perkara berbeza dan digunakan secara bertukar ganti. Kedua-dua kesilapan memakan masa satu petang jika anda bermula dengan yang salah.
Dua alamat, dua dakwaan berbeza
Titik hujung luar ialah apa yang pelayan perhatikan apabila klien bersambung, tersedia sebagai trusted_ip untuk IPv4 dan trusted_ip6 untuk IPv6. Alamat maya ialah apa yang kolam berikan untuk sesi ini, tersedia sebagai ifconfig_pool_remote_ip.
Kedua-duanya menjawab soalan berbeza, dan rekod biasanya memerlukan salah satu daripadanya, bukan kedua-duanya. Yang pertama ialah dari mana sambungan datang, yang mungkin alamat NAT dikongsi oleh ratusan orang. Yang kedua ialah di mana sesi ini berada di dalam terowong, dan ia boleh diberikan kepada sesi lain kemudian. Mengelirukan kedua-duanya menghasilkan rekod yang kelihatan munasabah tetapi salah.
Bacaan minimum kelihatan seperti ini.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Tiada nilai mengenal pasti seseorang. Satu ialah pemerhatian rangkaian, satu lagi pajakan, dan rekod yang menganggap mana-mana satu sebagai pengecam peranti yang stabil akan salah pada kali pertama klien bersambung semula dari rangkaian lain atau menerima alamat kolam yang lain. Pilih medan mengikut soalan yang perlu dijawab oleh rekod, kemudian tulis soalan itu di sebelah lajur.
Semak bagaimana PHP dilancarkan, bukan shell anda
Cangkuk berjalan sebagai anak daemon VPN dengan persekitaran yang daemon bina. Shell interaktif anda mempunyai persekitaran berbeza, dan menjalankan skrip secara manual menguji persekitaran shell, bukan persekitaran cangkuk.
Mula dengan mengesahkan cangkuk benar-benar tercetus pada peringkat yang anda jangkakan. Skrip yang dipasang pada peringkat salah, atau yang tidak pernah berjalan kerana arahan menunjuk ke laluan lain, menghasilkan gejala yang sama seperti pemboleh ubah yang hilang. Tambah baris penanda yang sengaja di bahagian atas skrip dan sahkan ia muncul sebelum anda memeriksa apa-apa lagi. Satu baris bertarikh masa dalam log memisahkan «tidak pernah berjalan» daripada «berjalan tanpa nilai».
Kemudian sahkan penterjemah dan fail konfigurasi mana yang digunakan oleh seruan itu. Mengedit konfigurasi PHP untuk pelayan web tidak mengubah apa-apa pada proses CLI yang dimulakan oleh OpenVPN, dan kedua-duanya boleh memuatkan fail php.ini yang sama sekali berbeza.
Mengapa $_ENV kosong tidak membuktikan apa-apa
PHP rujukan getenv mendokumenkan bacaan langsung persekitaran proses, yang mengembalikan false apabila nama tiada. Superglobal $_ENV diisi secara berasingan, dan arahan variables_order menentukan superglobal mana yang diisi.
Jika arahan itu meninggalkan E, $_ENV kekal kosong tidak kira apa yang terkandung dalam persekitaran. Kod yang mengindeksnya kemudian melaporkan pemboleh ubah hilang yang sebenarnya ada, dan penyiasatan menuju ke OpenVPN sedangkan jawapannya ada dalam php.ini. Semak arahan itu khusus untuk konfigurasi CLI, bukan untuk pelayan web.
Membaca dengan getenv mengelakkan seluruh kekeliruan ini, dan skrip pembalut yang membersihkan persekitaran sebelum memanggil penterjemah memperkenalkannya semula dalam bentuk lain.
Simpan persatuan, bukan kemas kini baris
Tentukan nilai mana yang diperlukan oleh rekod sebelum menulisnya. Jika tujuannya ialah mencatat dari mana sesi datang, simpan titik hujung luar dan labelkannya sebagai pemerhatian. Jika tujuannya ialah memetakan sesi kepada alamat terowong sepanjang sambungan, simpan alamat kolam dan kaitkan dengan sesi.
Kemas kini mengikut identiti yang disahkan dan sesi semasa, bukan mengikut setiap baris yang berkongsi alamat terowong, kerana alamat kolam digunakan semula dan peristiwa pemutusan yang lewat boleh menulis ganti data sambungan yang lebih baharu. Kendalikan IPv6 secara eksplisit dan jangan menulis nilai IPv4 sahaja secara senyap. Baris dengan alamat luar NULL lebih baik daripada baris dengan alamat yang salah, kerana yang pertama jelas tidak lengkap.
Kaitkan penulisan dengan pengecam sesi yang disediakan OpenVPN supaya sambungan semula mencipta rekod baharu dan bukan mengedit yang lama. Gunakan pernyataan berparameter dan akaun yang hanya mempunyai kebenaran yang diperlukan oleh operasi itu. Cangkuk berjalan dengan kuasa daemon, jadi pertanyaan yang cuai ialah masalah yang lebih luas daripada baris log yang salah.
Diagnosis tanpa membuang persekitaran
Log nama mana yang hadir, peringkat mana yang berjalan dan penterjemah mana yang digunakan. Jangan cetak seluruh persekitaran, kerana proses cangkuk boleh mewarisi nilai tidak berkaitan yang tidak sepatutnya masuk ke dalam fail log.
Sahkan satu sambungan dari hujung ke hujung: baca titik hujung luar, baca alamat yang diberikan, dan sahkan kedua-duanya terhadap pandangan pelayan sendiri tentang sesi itu. Setelah pasangan itu disahkan untuk satu klien, persatuan itu boleh dipercayai di tempat lain.