haproxy - lulus ip asli / jarak jauh dalam mode tcp

8

Saya sudah menyiapkan haproxy dengan keepalived untuk load balancing dan ip failover dari sebuah cluster percona, dan karena berfungsi dengan baik saya ingin menggunakan lb / failover yang sama untuk layanan / daemon lain.

Saya telah mengkonfigurasi haproxy dengan cara ini:

listen my_service 0.0.0.0:4567
    mode tcp
    balance leastconn
    option tcpka
    contimeout      500000
    clitimeout      500000
    srvtimeout      500000

    server host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3
    server host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3

Penyeimbangan beban berfungsi dengan baik, tetapi layanan melihat IP penyeimbang beban alih-alih IP sebenarnya dari klien. Dalam mode http, cukup mudah memiliki haproxy meneruskan IP jarak jauh, tetapi bagaimana caranya dalam mode tcp? Ini penting karena sifat layanan yang saya perlukan untuk memuat keseimbangan.

Terima kasih! Vito

Vito Botta
sumber
di sini adalah dokumentasi lengkap dari haproxy 1.6.6 cbonte.github.io/haproxy-dconv/…

Jawaban:

3

Hanya untuk referensi di masa mendatang, keepalived adalah solusi untuk failover tidak memuat penyeimbangan (mungkin maksud Anda LVS?). mode proxy transparan untuk HAProxy tidak ada hubungannya dengan cara khusus untuk mengirim IP asli, yang akan menjadi mode HTTP non-transparan normal di mana Anda dapat menggunakan header HTTP standar untuk ini.

Menurut pendapat saya, jawaban yang benar atas pertanyaan awal adalah: Anda dapat mengkompilasi dukungan proxy transparan di HAProxy pada kernel linux yang diaktifkan TPROXY. Ini bersama dengan TPROXY yang mendukung versi + konfigurasi iptables pada mesin yang sama memungkinkan dukungan proxy tcp sepenuhnya transparan. Ini berarti bahwa server backend TIDAK memerlukan konfigurasi khusus.

Perhatikan bahwa ini sebenarnya bukan pengaturan yang disarankan untuk HAProxy dan hanya boleh digunakan jika Anda benar-benar membutuhkannya.

Robbert
sumber
2

Tampaknya ada semacam mode "transparan" untuk haproxy yang belum pernah saya lihat atau ingin saya lakukan, yang dapat Anda coba. Kalau tidak, Anda harus mengajarkan apa pun layanan backend tentang cara khusus haproxy untuk mengirim IP asli ("BUKTI bla") dan minta layanan menarik IP asli dari situ.

Mengapa Anda repot-repot dengan haproxy? Anda sudah tetap hidup di tempatnya, dan itu juga melakukan penyeimbangan beban transparan yang tepat.

womble
sumber
Hai, terima kasih banyak atas balasan Anda :) Saya membaca beberapa hal tentang dukungan 'tproxy', saya kira ini yang Anda maksud? Juga, saya tidak mempertimbangkan load balancing dengan terus hidup langsung untuk ini. Apakah keepalived lulus IP asli dari klien?
Vito Botta
Ya, keepalived menjaga IP asli tetap utuh, karena ini adalah penyeimbang beban, bukan proxy.
womble
2

Menggunakan send-proxydalam konfigurasi Anda (per-server) akan memberi Anda sumber-ip asli di sisi server penerima, bahkan dalam mode TCP. Ini membutuhkan HAProxy 1.5+.

Anda dapat menemukan informasi lebih lanjut tentang Protokol Proxy dalam Dokumentasi HAProxy .

listen my_service 0.0.0.0:4567
mode tcp
balance leastconn
option tcpka
contimeout      500000
clitimeout      500000
srvtimeout      500000

server host1 xxx.xxx.xxx.xx1:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
server host2 xxx.xxx.xxx.xx2:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
Nils Schmidt
sumber
HI Nils, terima kasih atas solusinya, tetapi ketika saya memasukkan send-proxy, itu menyebabkan db down (haproxy tidak dapat mendeteksi host)
neobie
Hal yang sama terjadi pada saya juga dengan DB. ada solusi?
Peeyush
-4

Konfigurasi ini bekerja untuk saya. Sumber IP dapat diambil dalam $ _SERVER ['HTTP_X_FORWARDED_FOR']:

global
        [..... barang biasa ....]   
        ssl-server-verifikasi tidak ada

frontend main *: 5000
        bind *: 443 ssl crt /etc/ssl/mycert_with_private_key.pem
        mode http
        opsi forwardfor
        reqadd X-Forwarded-Proto: \ https
        default_backend https_server

backend https_server
        mode http
        saldo saldo terkecil
        opsi tcpka
        stick-table type ip size 200k kedaluwarsa 30m
        server srv04 192.168.1.10:443 ssl periksa
        server srv05 192.168.1.11:443 ssl periksa
Pedro Sayago
sumber
2
jawaban ini tidak berlaku. koneksi bukan HTTP.
longneck
Apakah Anda menyarankan koneksi https harus dalam mode tcp ?.
Pedro Sayago
Tidak, saya katakan bahwa pertanyaannya menggunakan tcp, dan jawaban Anda hanya berlaku untuk http / s.
longneck
ok, semoga sukses, saya belum menemukan doc relatif terhadap haproxy dalam mode forwarding ip tcp. Mungkin lapisan tempat permintaan diproses tidak dapat meneruskan info ini.
Pedro Sayago