Saya memiliki pengaturan berikut:
(internet) ---> [ pfSense Box ] /-> [ Apache / PHP server ]
[running HAproxy] --+--> [ Apache / PHP server ]
+--> [ Apache / PHP server ]
\-> [ Apache / PHP server ]
Untuk permintaan HTTP ini berfungsi dengan baik , permintaan didistribusikan ke server Apache saya dengan baik. Untuk permintaan SSL, saya meminta HAproxy mendistribusikan permintaan menggunakan penyeimbangan beban TCP, dan itu berhasil karena HAproxy tidak bertindak sebagai proxy, itu tidak menambahkan X-Forwarded-For
header HTTP, dan server Apache / PHP tidak tahu klien alamat IP asli.
Jadi, saya menambahkan stunnel
di depan HAproxy, membaca bahwa stunnel dapat menambahkan X-Forwarded-For
header HTTP. Namun, paket yang saya dapat instal ke pfSense tidak menambahkan header ini ... juga, ini tampaknya membunuh kemampuan saya untuk menggunakan permintaan KeepAlive , yang ingin saya simpan. Tetapi masalah terbesar yang mematikan gagasan itu adalah bahwa stunnel mengubah permintaan HTTPS menjadi permintaan HTTP biasa, jadi PHP tidak tahu bahwa SSL diaktifkan dan mencoba mengalihkan ke situs SSL.
Bagaimana saya bisa menggunakan HAproxy untuk memuat saldo di sejumlah server SSL, memungkinkan server-server itu untuk mengetahui alamat IP klien dan mengetahui bahwa SSL sedang digunakan? Dan jika mungkin, bagaimana saya bisa melakukannya di server pfSense saya?
Atau haruskah saya menghentikan semua ini dan hanya menggunakan nginx?
X-Forwarded-For
, lihat di sini .Jawaban:
Anda tidak perlu membatalkan semuanya, Anda bisa menggunakan nginx di depan haproxy untuk dukungan SSL, menjaga semua konfigurasi balancing Anda. Anda bahkan tidak perlu menggunakan nginx untuk HTTP jika Anda tidak mau. Nginx dapat melewati X-Forwarded-For dan header khusus yang menunjukkan SSL sedang digunakan (dan informasi klien jika Anda mau). Cuplikan konfigurasi nginx yang mengirimkan informasi yang diperlukan:
sumber
Sebagai catatan, karena utas ini sering disebut tentang HAProxy + SSL, HAProxy mendukung SSL asli di kedua sisi sejak 1.5-dev12. Jadi memiliki X-Forwarded-For, HTTP keep-live serta header yang memberitahu server bahwa koneksi dilakukan melalui SSL adalah sesederhana berikut ini:
Saya yakin bahwa pada saat Anda datang dengan sesuatu yang berbeda, tetapi setidaknya pengunjung baru akan mendapatkan solusi mudah sekarang :-)
sumber
acl is-ssl dst_port 443
dan menulis ulang sebuah baris:reqadd X-Forwarded-Proto:\ https if is-ssl
Nginx tampaknya menangani header ini dengan cukup baikUntuk siapa pun yang menemukan pertanyaan ini, saya mengikuti saran Ochoto dan menggunakan nginx. Inilah langkah-langkah spesifik yang saya gunakan untuk membuat ini bekerja di router pfSense saya :
Menggunakan antarmuka web pfsense, saya menginstal paket PfJailctl pfsense dan paket "jail_template" di bawah System> Packages sehingga saya bisa membuat penjara FreeBSD untuk mengkompilasi dan menginstal nginx pada sistem pfsense.
Saya mengkonfigurasi penjara untuk server nginx saya di bawah Services> Jails , memberikan penjara baru nama host dan alamat IP yang sama dari alias IP virtual yang saya jalankan HAproxy. Saya mengikat penjara ke antarmuka WAN. Saya menggunakan templat jail default dan mengaktifkan unionfs daripada nullfs.
Begitu penjara sudah dimulai, aku masuk ke kotak pfsense dan berlari
jls
mencari nomor penjara. Saya kemudian berlarijexec 1 sh
untuk mendapatkan sebuah shell di dalam penjara. Dari sana saya mengatur port BSD dan menginstal nginx menggunakan:Saya kemudian mengkonfigurasi nginx untuk mendengarkan pada port 443, dan meneruskan semua permintaan ke HAproxy pada port 80, termasuk IP asli dan status SSL di dalam header HTTP.
usr/local/etc/nginx/nginx.conf
Penampilan saya seperti:Saya kemudian memodifikasi aplikasi PHP saya untuk mendeteksi
X-Forwarded-Proto
HTTP Header:Jadi pengaturan terakhir adalah:
sumber
Konfigurasi saya untuk versi haproxy 1.5-dev-17:
Menggunakan
ssl_fc
ACL. Harap dicatat bahwaoption http-server-close
bagian ini sangat penting.sumber
HAProxy tidak dapat mencapai backend SSL tanpa menggunakan mode TCP mentah, kehilangan
X-Forwarded-For
, tetapi, Anda berpotensi dapat mengenkripsi ulang lalu lintas dengan stunnel mendengarkan untuk transit backend. Jeleknya.Saya suka pendekatan Ochoto lebih baik, dengan peringatan: nginx adalah penyeimbang beban yang sangat mampu; jika Anda menggunakannya, saya akan mengatakan menggunakannya untuk semuanya. Proksi HTTPS Anda yang masuk untuk memuat backend HTTPS yang seimbang - dan dengan demikian, tidak perlu header khusus untuk informasi SSL (kecuali Anda memang memerlukan sertifikat klien).
sumber
Saya mengimplementasikan solusi tahun lalu untuk mengintegrasikan HAProxy dengan pfSense dengan cara yang memanfaatkan semua fitur HAProxy dan mempertahankan isolasi yang baik dengan pfSense. Sehingga merupakan opsi yang layak untuk lingkungan produksi . SSL diakhiri di HAProxy . Saya menginstal HAProxy di dalam penjara di pfSense menggunakan ezjail dan Ports Collection . Dengan begitu sangat mudah untuk mempertahankan kedua komponen secara mandiri. Dan Anda dapat menginstal versi apa pun yang Anda inginkan. Saya mulai dengan 1,5-dev13. Dan sejak itu bekerja dengan baik untuk saya. Saya telah mendokumentasikan semuanya di sini.
Menginstal HAProxy di pfSense
BTW Willy, terima kasih banyak untuk produk yang luar biasa ini.
sumber