Remote IP dengan HAProxy

19

Saya sedang menguji pengaturan server web baru yang mengalami beberapa masalah. Pada dasarnya, kami memiliki server web, di mana kodenya menggunakan IP jarak jauh untuk beberapa hal menarik, dan juga beberapa direktori apache diamankan ke beberapa IP tertentu (kantor kami, dll).

Namun, kami baru saja membuang ini di belakang ha_proxy sehingga kami dapat melihat menambahkan beberapa server aplikasi lagi, tetapi sekarang IP jarak jauh selalu datang sebagai ip proxy, bukan pengguna jarak jauh yang sebenarnya. Ini berarti kami tidak dapat mencapai beberapa lokasi, dan aplikasi kami berperilaku sedikit aneh di mana IP pengguna penting.

Konfigurasi kami adalah sebagai berikut:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check
Neil Middleton
sumber

Jawaban:

31

Dikutip dari HAProxy doc di haproxy.1wt.eu .

- jika aplikasi perlu mencatat IP klien asli, gunakan
  Opsi "forwardfor" yang akan menambahkan header "X-Forwarded-For" dengan
  alamat IP klien asli. Anda juga harus menggunakan "httpclose" untuk memastikan
  Anda akan menulis ulang setiap permintaan dan tidak hanya yang pertama dari setiap permintaan
  sidang:
        opsi httpclose
        opsi forwardfor

Dinyatakan bahwa aplikasi harus memperlakukan Header HTTP X-Forwarded-For untuk mengetahui alamat IP klien. Sepertinya satu-satunya cara untuk menangani kasus Anda.

Diperbarui untuk HAProxy 1.4

Haproxy 1.4 memperkenalkan mode baru dengan "option http-server-close". Itu masih menutup koneksi ke server tetapi mempertahankan tetap hidup terhadap klien jika memungkinkan dan digunakan. Pada sebagian besar pengaturan, Anda mungkin ingin menggunakannya karena hal ini membantu latensi pada bagian latensi tinggi tunggal dari koneksi Anda (antara Haproxy dan klien).

   option http-server-close
   option forwardfor
Maxwell
sumber
2
Lebih baik digunakan option forwardfor header X-Real-IPdan reqidel ^X-Real-IP:, ini berhenti memalsukan IP di log Anda. FYI: X-Real-IPadalah header default untuk NginXopsi ' set_real_ip_from.
Tino
Pertanyaannya tidak menyebutkan nginx. X-Real-IP tidak akan berfungsi.
Rick Fletcher
1. apakah kedua opsi ini harus diatur di bagian konfigurasi frontend atau backend? (Karena tampaknya tidak berfungsi di sini) 2. Apakah ada jenis konfigurasi yang diperlukan di tingkat Tomcat juga?
yglodt
6

Ada cara untuk mengkompilasi ulang HAproxy untuk memasukkan Tproxy yang akan memungkinkan penerusan alamat sumber.

Ada posting blog di sini tentang hal itu: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Beberapa catatan:

Kernel linux terbaru (2.6.28-11-server) termasuk dukungan untuk TProxy, jadi kompilasi ulang kernel tidak diperlukan.

Pastikan untuk mengonfigurasi server di web farm Anda dengan alamat gateway default yang mengarah ke server HAProxy.

Geoff Dalgas
sumber
2

Gunakan modul rpaf apache http://stderr.net/apache/rpaf/ Saya tahu ini dan posting lama tapi butuh waktu berhari-hari untuk menemukannya. Ini akan hadir untuk aplikasi apa pun x-forwarded-for ip.

Shaggy63
sumber
1

Perhatikan bahwa tampaknya Anda dapat menimpa apa yang dilihat aplikasi saya saat mengubah tajuk Apache:

SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1

Namun, ini tidak berfungsi untuk akses Apache melalui "Izinkan dari" dll.

Neil Middleton
sumber
Ini dapat menyebabkan hasil yang tidak dapat diprediksi jika klien mengirim X-Forwarded-Forheader yang ada sebagai alamat IP baru ditambahkan ke akhir daftar yang ada, dipisahkan oleh koma dan spasi. Ubah (.*)to ([^ ]*)$menjadi hanya ambil IP terakhir ... atau gunakan mod_rpafatau mod_remoteipuntuk Apache 2.4 atau yang lebih baru.
Ladadadada
1

HAProxy, berdasarkan desain, tidak dapat meneruskan alamat IP asli ke server sebenarnya, seperti halnya proxy lainnya.

Salah satu solusi mungkin, jika satu-satunya masalah Anda adalah dengan server web, untuk melihat header HTTP penerusan-X, yang harus berisi alamat klien. Sekarang, itu cukup banyak aplikasi / bahasa tertentu, tetapi lihat contoh ini di php:

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

Jika Anda juga ingin mencatat alamat asli, Anda dapat memodifikasi LogFormat di httpd.conf agar terlihat seperti ini:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common

Thiagodrv
sumber
salah, Anda dapat dengan opsi "forwardfor"
wittwerch
Ya, dan opsi ini aktif secara default, tetapi yang dilakukannya adalah mengatur header X-Forwarded-For HTTP. Apa yang saya katakan, dan tampak bagi saya bahwa adalah apa Penanya itu benar-benar bertanya, adalah tentang alamat sumber yang sebenarnya dari paket IP
Thiagodrv
0

Ya, sepertinya X-Forwarded-for tidak berfungsi dengan baik untuk pengaturan Anda. Jadi, adakah alasan khusus bagi Anda untuk tetap menggunakan haproxy? Tampaknya IPVS lebih sesuai untuk kebutuhan Anda (saya benar-benar menggunakan ldirector yang pada gilirannya menggunakan ipvs).

Melihat:

http://kb.linuxvirtualserver.org/wiki/IPVS

dan

http://www.vergenet.net/linux/ldirectord/

Menggunakan IPVS dalam mode 'IP Tunneling' atau 'Direct Routing' menjaga alamat klien.

Thiagodrv
sumber
0

Coba mod_extract_forwarded dari http://www.openinfo.co.uk/apache/

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx

sumber
-1

Cara mudah dengan haproxy dalam mode tcp dan nginx:

tambahkan send-proxy sebagai opsi server:

haproxy.conf:

.

.

dengarkan ssl 0.0.0.0.0:443

mode tcp

menyeimbangkan saldo minimum

opsi httpchk DAPATKAN / ping

opsi log-kesehatan-cek

server w1 192.168.1.1:443 cek kirim-proxy cek-ssl memverifikasi tidak ada

server w2 192.168.1.1:443 cek cek-proxy cek-ssl memverifikasi tidak ada

.

.

Nginx memerlukan dukungan proxy-protokol

nginx.conf:

.

.

dengarkan 192.168.1.1:443 ssl proxy_protocol;

.

.

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

Emilio Joel Macias Gomez
sumber