haproxy dan meneruskan alamat IP klien ke server


15

Saya punya masalah dengan HAproxy.

Saya menggunakan HAproxy sebagai penyeimbang beban yang mendistribusikan permintaan http masuk ke 5 server web. biasanya permintaan klien diteruskan ke server web dengan IP loadbalancer. Tetapi saya membutuhkan IP klien atau IP nyata yang meminta sesuatu dari server web. Karena kita perlu mencatat IP klien yang sebenarnya.

Saya mencoba untuk mendapatkan IP klien di server web tetapi saya tidak dapat berhasil hingga sekarang. Selalu saya melihat IP load balancer.

Saya menggunakan opsi x-forward-for tetapi tidak menyelesaikan masalah. Setelah itu saya menemukan pilihan lain " sumber 0.0.0.0:80 usingrc clientip " tetapi saya mendapatkan eror ketika mencoba menjalankan HAproxy yang adalah tentang kompilasi kebutuhan dengan opsi USE_TPROXY dari HAproxy. Saya melakukannya, saya mengkompilasi ulang HAproxy dengan opsi USE_TPROXY tetapi tidak mengubah apa pun. apa yang bisa saya lakukan untuk mempelajari IP klien nyata.

Versi kernel linux saya adalah 2.6.32-34 Maksud saya kernel tersebut mendukung proxy transparan. dan saya menggunakan UBUNTU 10.4 LTS

file konfigurasi saya ada di sini

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    (1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
        (2)source 0.0.0.0:80 usesrc clientip
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor header X-Client
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:xXx

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

(1) (2) Saat menguji HAproxy I menggunakan salah satu dari dua baris ini.

Apakah ada yang membantu saya mempelajari IP nyata dari klien yang diminta dari server kami?


Apa yang Anda cari disebut 'proxy transparan'. Entah bagaimana iptables terlibat, tetapi saya tidak yakin persis bagaimana caranya.
sysadmin1138

dengan mengatakan proxy transparan saya sebutkan itu, proxy yang tidak memodifikasi header http saat mendistribusikan koneksi yang masuk. dengan demikian pemohon halaman nyata IP klien dapat dikirim ke server web. Itulah yang saya mengerti dari proxy transparan.
Sistem

Jawaban:


15

Saya memecahkan masalah ini. Bisa jadi itu bukan masalah sejak awal. Saya membuat pencarian google ketika saya menghadapi masalah ini, dan saya melihatnya

option forwardfor

baris untuk digunakan dalam file haproxy.cfg dan juga opsi lainnya. Saya mencoba opsi-opsi tersebut termasuk mengkompilasi ulang haproxy ... Tetapi masalah sebenarnya terkait dengan belajar IP klien nyata pada server web tidak bersumber dari HAproxy, ini tentang membaca header dengan skrip server, dalam kasus kami bahasa skrip ini adalah PHP.

Saya mencoba mempelajari IP klien dengan perintah ini

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

dan perintah ini menampilkan IP loadbalancer. Ini benar tetapi bukan itu yang saya harapkan. Meskipun opsi forwardfor perintah ini, memberi saya IP loadbalancer

Dengan menggunakan opsi forwardfor, kami memungkinkan HAproxy untuk memasukkan header x-forwarded-for ke dalam permintaan klien yang dikirim ke server web kami. HAproxy menempatkan bidang ini ke tajuk tetapi saya mengabaikan ini. Hari ini saya menyadari bahwa ini adalah bidang tajuk dan saya harus membaca tajuk ini seperti ini

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

Dengan perintah ini saya mendapat alamat IP klien bukan alamat IP loadbalancer.

Tapi tawaran saya adalah untuk mendapatkan data header untuk menyelidiki informasi lainnya adalah fungsi getallheaders () untuk PHP.

//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

Akhir dari semua file haproxy.cfg terakhir saya adalah seperti di bawah ini.

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:passwd

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

Namun demikian saya memiliki banyak hal yang hilang tentang HAproxy seperti apa arti uid atau gid.


2

Jika Anda memerlukan addr IP klien pada log Apache Anda dapat mengubah apache conf Anda untuk log X-forwarded-for di tempat sumber aslinya (5 jam)

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Terima kasih atas jawaban Anda Marcelo, tetapi kami tidak memerlukan alamat IP klien pada log Apache. kami mencoba belajar dengan skrip php kami.
Sistem

1

Baru saja mencoba solusi @ System dan sepertinya nama header diubah dari HTTP_X_FORWARDED_FORmenjadi x-forwarded-for. Mungkin ini terkait dengan versi HAproxy, karena jawabannya ditulis 5 tahun yang lalu ...?

Sebagai contoh, ini bekerja pada produksi:

String requestIp = httpRequest.getHeader("x-forwarded-for");

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.