Apa yang sebenarnya diberitahu REMOTE_ADDR PHP di belakang VPN
Ini nilai yang dibekalkan pelayan web anda, bukan pertanyaan ke dalam terowong. Jejaki laluan permintaan, semak siapa yang boleh menulis semula, dan simpan identiti dalam aplikasi.
Seseorang bertanya mengapa pengguna VPN muncul dalam log aplikasi dengan alamat milik gerbang, atau dengan alamat yang berubah selepas makan tengah hari. Jawapannya bermula dengan apa nilai itu: entri yang diletakkan pelayan web dalam persekitaran permintaan. Ia bukan pertanyaan ke dalam terowong, bukan identiti sijil, dan bukan janji bahawa nombor itu milik satu orang. Membacanya sebagai salah satu daripada tiga perkara itu menghasilkan jawapan yakin yang salah dengan cara berbeza.
Nilai datang dari pelayan, bukan dari terowong
PHP menerima persekitaran permintaan daripada apa yang menjalankan skrip. Rujukan pemboleh ubah pelayan PHP menerangkan entri ini sebagai dicipta oleh pelayan web, dengan ketersediaan bergantung pada bagaimana permintaan tiba.
Skrip yang dijalankan sebagai cangkuk baris arahan VPN ialah konteks pelaksanaan yang sama sekali berbeza. Ia tiada permintaan web, soket klien dan REMOTE_ADDR, sebab itulah kod web yang disalin ke cangkuk menghasilkan nilai kosong dan bukannya salah. Cangkuk mempunyai persekitarannya sendiri yang diisi daemon, dan didokumenkan secara berasingan. Meraih REMOTE_ADDR di situ bermakna meraih pemboleh ubah yang tidak pernah ditetapkan.
Ingat perbezaan itu sebelum membandingkan dua log. Mungkin anda membandingkan permintaan halaman dengan cangkuk, dan itu bukan perbandingan sama sekali. Semak konteks pelaksanaan dahulu, alamat kemudian.
Jejaki laluan permintaan sebelum mempercayai nombornya
Alamat yang dilaporkan ialah rakan sejawat sambungan yang dilihat pelayan web. Sisipkan apa-apa antara klien dan pelayan itu dan rakan sejawat berubah. Terjemahan, penamatan dan pengimbangan beban masing-masing mengalihkan pemerhatian satu lompatan lebih jauh daripada pengguna.
Empat laluan biasa menghasilkan empat pemerhatian berbeza.
| Path to the listener | What can be reported |
|---|---|
| Client routed straight to the private listener, no translation | The client's tunnel address |
| Gateway translates the source before forwarding | The gateway's translated address |
| Reverse proxy terminates the client and opens its own backend connection | The proxy's backend address |
| Load balancer in front of two proxies | Whichever hop the server treats as its peer |
Tuliskan laluan itu dengan nama destinasi, keluarga alamat dan setiap titik terjemahan. Tanpa peta itu, nilai betul dan nilai salah kelihatan serupa dalam satu baris log. Dua baris rajah menjimatkan sebelah petang perdebatan.
Penggantian hanya berlaku di tempat yang dikonfigurasikan
Pelayan atau rangka kerja boleh menggantikan alamat klien dengan sengaja. Modul remote-IP Apache dan modul real-IP NGINX kedua-duanya berbuat demikian, dan nilai yang diterima PHP bergantung pada konfigurasi itu serta parameter yang dihantar kepada pengendali skrip.
Jadi REMOTE_ADDR bukan selalu rakan sejawat TCP yang tidak disentuh. Ia ialah rakan sejawat seperti yang pelayan pilih untuk laporkan selepas menggunakan dasarnya sendiri. Perbezaan itu menentukan sama ada nilai itu bukti atau hiasan.
Tanya pemilik pelayan medan mana yang berwibawa dalam penggunaan ini dan bagaimana rakan sejawat asal dikekalkan apabila penggantian berlaku. Jika tiada siapa boleh menjawab, log itu belum membuktikan apa-apa.
Jangan baca pengepala penghantaran dengan percaya
Pemanggil boleh menghantar pengepala penghantaran sendiri. Menganggap entri pertama yang dipisahkan koma sebagai alamat pengguna yang disahkan bermaksud memutuskan untuk mempercayai sesiapa yang bersambung, iaitu bertentangan dengan tujuan pengepala itu. Pengepala menerangkan satu rantaian, dan hanya lapisan yang dipercayai boleh menjamin rantaian itu.
Gunakan sokongan proksi dipercayai pelayan atau rangka kerja dengan rantaian proksi sebenar dikonfigurasikan, dan biarkan ia membuang nilai daripada sumber di luar rantaian itu. Penghuraian yang ditulis tangan ialah tempat kebanyakan kegagalan menarik tinggal.
Alamat yang dilaporkan proksi juga tidak mengubah sumber paket yang dilihat tembok api di hulu. Simpan metadata HTTP dan penapisan rangkaian sebagai pemerhatian berasingan, kerana kedua-duanya menjawab soalan berbeza.
Gunakan identiti aplikasi untuk keputusan
Untuk akses kepada rekod pengguna, bergantung pada prinsipal yang disahkan dan peraturan kebenaran aplikasi. Alamat dalaman boleh diperuntukkan semula, dan satu alamat yang diterjemah boleh mewakili ratusan pengguna serentak. Tiada satu pun sifat ini boleh dibaiki oleh pemeriksaan alamat.
Jika operasi perlu mengaitkan permintaan dengan sesi VPN, gabungkan alamat yang diperhatikan dan cap masa dengan rekod sesi berwibawa menurut model terjemahan yang anda dokumenkan. Itu menghasilkan kaitan yang boleh anda pertahankan; alamat sahaja tidak.
Untuk diagnosis, catat beberapa medan yang diperlukan dan bukannya seluruh tatasusunan pelayan, yang boleh membawa pengepala dan bahan pengesahan. Kesimpulan yang berguna menyatakan apa maksud nilai ini dalam penggunaan ini, bukan nilai mana yang paling menyerupai klien.