haproxy và chuyển tiếp địa chỉ IP của máy khách đến máy chủ


15

Tôi có một vấn đề với HAproxy.

Tôi sử dụng HAproxy làm bộ cân bằng tải phân phối các yêu cầu http đến 5 máy chủ web. thông thường, một yêu cầu của khách hàng được chuyển tiếp đến các máy chủ web có IP của bộ cân bằng. Nhưng tôi cần IP khách hàng hoặc IP thực sự yêu cầu thứ gì đó từ máy chủ web. Bởi vì chúng tôi cần phải đăng nhập IP của khách hàng thực sự.

Tôi cố gắng để có được IP của khách hàng trên các máy chủ web nhưng tôi không thể thành công cho đến bây giờ. Luôn luôn tôi thấy IP của bộ cân bằng tải.

Tôi sử dụng tùy chọn x-Forward-for nhưng nó không giải quyết được vấn đề. Sau đó, tôi đã tìm thấy một tùy chọn khác " nguồn 0.0.0.0:80 sử dụng clientrc " nhưng tôi đã bị lỗi khi cố gắng chạy HAproxy, đó là về nhu cầu biên dịch với tùy chọn USE_TPROXY của HAproxy. Tôi đã làm điều đó, tôi biên dịch lại HAproxy với tùy chọn USE_TPROXY nhưng không thay đổi gì cả. Tôi có thể làm gì để tìm hiểu IP của khách hàng thực sự.

Phiên bản kernel linux của tôi là 2.6.32-34 Ý tôi là kernel đó hỗ trợ proxy trong suốt. và tôi sử dụng UBUNTU 10,4 LTS

tập tin cấu hình của tôi ở đây

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) Trong khi thử nghiệm HAproxy, tôi đã sử dụng một trong hai dòng này.

Có ai giúp tôi tìm hiểu IP thực sự của các khách hàng đang yêu cầu từ máy chủ của chúng tôi không?


Những gì bạn đang tìm kiếm được gọi là "proxy minh bạch". iptables có liên quan bằng cách nào đó, nhưng tôi không chắc chính xác như thế nào.
sysadmin1138

bằng cách nói proxy minh bạch, tôi đề cập đến điều đó, các proxy không sửa đổi các tiêu đề http trong khi phân phối các kết nối đến. do đó, IP của khách hàng yêu cầu trang web thực có thể được gửi đến máy chủ web. Đó là những gì tôi hiểu từ proxy minh bạch.
Hệ thống

Câu trả lời:


15

Tôi đã giải quyết vấn đề này. Có thể nó không phải là một vấn đề ngay từ đầu. Tôi đã thực hiện tìm kiếm google khi tôi gặp phải vấn đề này và tôi thấy rằng

option forwardfor

để sử dụng trong tập tin haproxy.cfg và các tùy chọn khác. Tôi đã thử các tùy chọn đó bao gồm biên dịch lại haproxy ... Nhưng vấn đề thực sự liên quan đến việc học IP của máy khách thực trên máy chủ web không có nguồn gốc từ HAproxy, đó là về việc đọc các tiêu đề của tập lệnh máy chủ, trong trường hợp của chúng tôi, ngôn ngữ kịch bản này là PHP.

Tôi cố gắng học IP của khách hàng bằng các lệnh này

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

và các lệnh này hiển thị IP của loadbalancer. Điều này đúng nhưng đó không phải là điều tôi mong đợi. Mặc dù tùy chọn chuyển tiếp cho các lệnh này, đã cho tôi IP của bộ cân bằng

Bằng cách sử dụng tùy chọn chuyển tiếp, chúng tôi cho phép HAproxy chèn tiêu đề x-Forwarded-for vào các yêu cầu của khách hàng được gửi đến máy chủ web của chúng tôi. HAproxy đặt trường này để tiêu đề nhưng tôi đã bỏ qua điều này. Hôm nay tôi nhận ra rằng đây là một trường tiêu đề và tôi phải đọc tiêu đề này như thế này

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

Với lệnh này, tôi đã nhận được địa chỉ IP của khách hàng chứ không phải địa chỉ IP của loadbal.

Nhưng đề nghị của tôi là để có được dữ liệu tiêu đề để điều tra các thông tin khác là hàm getallheaders () cho PHP.

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

Kết thúc tất cả các tập tin haproxy.cfg cuối cùng của tôi như dưới đây.

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

Tuy nhiên, tôi có nhiều điều còn thiếu về HAproxy như ý nghĩa của uid hay gid.


2

Nếu bạn cần addr IP của máy khách trên nhật ký Apache, bạn có thể thay đổi conf apache của mình để đăng nhập X-Forwarded-for thay cho nguồn ban đầu (5h)

#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

Cảm ơn câu trả lời của bạn Marcelo, nhưng chúng tôi không cần địa chỉ IP của khách hàng trên nhật ký Apache. chúng tôi cố gắng học bằng các tập lệnh php của chúng tôi.
Hệ thống

1

Chỉ cần thử giải pháp của @ System và có vẻ như tên tiêu đề đã được thay đổi từ HTTP_X_FORWARDED_FORthành x-forwarded-for. Có lẽ nó liên quan đến phiên bản HAproxy, vì câu trả lời đã được viết 5 năm trước ...?

Ví dụ, điều này đang làm việc trên sản xuất:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.