Setiap baris dalam log akses menunjukkan alamat loopback yang sama, sementara halaman itu sendiri dimuatkan dan sijil disahkan dengan betul. Tiada apa yang rosak dalam erti kata tidak dapat dicapai, dan itulah sebabnya keadaan ini bertahan berbulan-bulan. Yang rosak ialah atribusi: bahagian belakang web merekodkan alamat lompatan yang memajukan sambungan, dan setiap keputusan kemudian yang mempercayai log mewarisi jawapan salah yang sama.

Pemeriksaan di bawah bergerak dari kabel ke dalam. Berhenti pada yang pertama yang menerangkan nilai yang anda lihat, kerana setiap langkah kemudian menganggap yang sebelumnya sudah betul. Tiada satu pun memerlukan anda meneka konfigurasi bahagian hadapan.

Ikuti dua sambungan, bukan baris log

Port-Share memultipleks dua protokol pada satu pendengar TCP. OpenVPN memeriksa bait pertama sambungan masuk, menyimpannya apabila ia kelihatan seperti protokolnya sendiri, dan menyerahkan apa-apa lagi kepada destinasi kedua. Destinasi itu biasanya pelayan web pada hos yang sama, jadi soket yang diterima pelayan web mempunyai proses OpenVPN sebagai pasangannya.

ss -ltnp 'sport = :443'
ss -tnp 'dport = :8080'

Perintah pertama menunjukkan siapa memiliki pendengar awam. Yang kedua menunjukkan sambungan yang tiba di port bahagian belakang, dan alamat pasangannya ialah yang akan dicetak oleh log akses. Jika pasangan itu loopback, log itu tepat dan maklumat hilang satu lapisan lebih awal. Menamakan semula medan log atau mengaktifkan modul IP klien tidak akan memulihkan alamat yang tidak pernah dibawa oleh sambungan.

Inilah pemeriksaan yang menentukan segala-galanya. Jika pasangan bahagian belakang ialah alamat pelayar, perkongsian port bukan masalah anda dan format loglah masalahnya.

Pemajuan pengangkutan bukan penyuntikan pengepala

Pemaju memindahkan bait. Ia tidak menghuraikan HTTP, jadi ia tidak boleh menyisipkan pengepala ke dalam permintaan yang tidak pernah dibacanya sebagai permintaan, dan ia tidak boleh menambahkan apa-apa pada aliran TLS yang dilewatkannya tanpa disentuh. Modul yang mengharapkan pengepala proksi akan terus menunggu pengepala yang tidak dihasilkan oleh mana-mana komponen.

Dua mekanisme boleh membawa alamat asal, dan kedua-duanya memerlukan persetujuan di kedua-dua hujung. Protokol PROXY menambahkan pengepala kecil pada permulaan sambungan, dan bahagian belakang mesti dikonfigurasikan untuk menjangkakannya; bahagian belakang yang tidak menjangkakannya akan menganggap bait itu sebagai permulaan permintaan dan gagal dengan cara yang mengelirukan. Pengepala proksi yang dipercayai seperti X-Forwarded-For berfungsi apabila proksi yang memahami HTTP menetapkannya dan bahagian belakang diberitahu pasangan mana yang boleh menegaskannya.

Kedua-duanya tidak automatik, dan kedua-duanya tidak selamat secara lalai. Bahagian belakang yang mempercayai mana-mana pengepala yang dimajukan masuk membenarkan klien memilih alamatnya sendiri, yang mengubah ketidaktepatan log menjadi pengelakan kawalan akses. Jalankan demonstrasi sekali pada hos ujian sebelum anda mempercayai mana-mana pengepala pada laluan pengeluaran.

curl -sS -H 'X-Forwarded-For: 127.0.0.1' https://site.example.com/health
grep -F '127.0.0.1' /var/log/nginx/access.log | tail -n 3

Direktori pemetaan sumber pilihan

Perkongsian port mempunyai argumen direktori pilihan yang merekodkan pemetaan antara alamat sumber asal dan sambungan pemajuan, pada platform di mana ciri ini dilaksanakan. Bahagian web dijangka merujuk pemetaan itu; ia bukan pengepala, dan ia tidak disuntik ke dalam permintaan.

Reka bentuk itu wajar diketahui kerana ia menerangkan mengapa sesetengah penggunaan melaporkan alamat sebenar dan yang lain tidak, dengan konfigurasi bahagian hadapan yang kelihatan sama. Perbezaannya terletak di bahagian penerima, dan biasanya ia tinggal dalam modul atau tampalan yang kebanyakan pelayan web berbungkus tidak aktifkan secara lalai. Baca dokumentasi pelayan web anda untuk cangkuk tepat yang ditawarkannya, dan sahkan modul itu dimuatkan dan bukannya menganggapnya.

Jika anda mengikuti laluan ini, anggapnya sebagai integrasi dua bahagian: pemetaan yang ditulis oleh pemaju dan carian yang dilakukan oleh bahagian belakang. Sahkan kedua-duanya, dan pastikan direktori itu bertahan selepas permulaan semula dan tidak membesar tanpa had pada pendengar yang sibuk.

Tentukan komponen mana yang menjamin alamat itu

Sebelum menukar konfigurasi, namakan komponen yang dibenarkan menegaskan alamat klien dan komponen yang dibenarkan mempercayainya. Satu jawapan bertulis mencegah penyimpangan biasa, apabila tiga lapisan berbeza masing-masing mempercayai sumber yang berbeza.

Tiga reka bentuk meliputi kebanyakan keperluan. Asingkan pendengar awam dan pendengar web, supaya pelayan web melihat pasangan sebenar dan tiada masalah atribusi. Letakkan proksi songsang yang memahami HTTP di hadapan, tamatkan atau huraikan permintaan di situ, dan biarkan ia menetapkan pengepala yang dimajukan untuk bahagian belakang yang hanya mempercayai proksi itu. Atau kekalkan perkongsian port dan terima bahawa log menunjukkan lompatan, dengan peraturan akses ditulis terhadap identiti aplikasi dan bukan alamat.

Yang tidak berkesan ialah menganggap alamat loopback yang dimajukan sebagai bukti bahawa permintaan itu berasal dari mesin ini. Kesimpulan itu betul-betul terbalik: alamat itu hadir justeru kerana komponen tempatan membuat sambungan. Peraturan yang ditulis begitu menerima sesiapa sahaja yang boleh mencapai pendengar.

Uji peraturan, bukan halaman

Halaman yang dimuatkan membuktikan laluan pemajuan berfungsi dan tidak mengatakan apa-apa tentang atribusi. Uji pengguna alamat itu: peraturan akses, had kadar, entri audit, carian geografi.

curl -sS -o /dev/null -w '%{http_code}\n' https://site.example.com/
tail -n 5 /var/log/nginx/access.log
grep -c '' /var/log/nginx/access.log

Bandingkan permintaan luaran yang dibenarkan dengan rekod bahagian hadapan dan bahagian belakang, dan sahkan bahawa peraturan yang sepatutnya menolak masih menolak dan yang sepatutnya membenarkan masih membenarkan. Jika baris log betul tetapi peraturan masih berkelakuan seolah-olah semua orang tempatan, peraturan itu membaca medan yang berbeza daripada yang anda betulkan.

Akhiri dengan menulis rantaian atribusi dalam nota penggunaan: pendengar mana, pemaju mana, pengepala atau pemetaan mana, dan bahagian belakang mana yang dikonfigurasikan untuk mempercayainya. Orang seterusnya yang membaca baris log akan memerlukan keempat-empatnya, dan ketiadaan nota itu ialah sebab tiket yang sama dibuka semula setahun kemudian. Simpan di sebelah konfigurasi dan bukan dalam urutan sembang.

Artikel berkaitan