haproxy 및 서버에 클라이언트 IP 주소 전달


15

HAproxy에 문제가 있습니다.

들어오는 HTTP 요청을 5 개의 웹 서버에 배포하는로드 밸런서로 HAproxy를 사용합니다. 일반적으로 클라이언트 요청은로드 밸런서의 IP를 사용하여 웹 서버로 전달됩니다. 그러나 웹 서버에서 무언가를 요청하는 클라이언트 IP 또는 실제 IP가 필요합니다. 실제 클라이언트의 IP를 기록해야하기 때문입니다.

웹 서버에서 클라이언트의 IP를 얻으려고 노력했지만 지금까지는 성공할 수 없습니다. 항상로드 밸런서의 IP가 보입니다.

x-forward-for 옵션을 사용하지만 문제가 해결되지 않았습니다. 그 후 다른 옵션 " source 0.0.0.0:80 usesrc clientip "을 찾았지만 HAproxy의 USE_TPROXY 옵션을 사용하여 컴파일 요구에 관한 HAproxy를 실행하는 동안 오류가 발생했습니다. USE_TPROXY 옵션을 사용하여 HAproxy를 다시 컴파일하지만 아무것도 변경하지 않았습니다. 실제 고객의 IP를 배우기 위해 무엇을 할 수 있습니까?

내 리눅스 커널 버전은 2.6.32-34입니다. 커널이 투명한 프록시를 지원한다는 것을 의미합니다. UBUNTU 10.4 LTS를 사용합니다

내 설정 파일이 여기 있습니다

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) HAproxy를 테스트하는 동안이 두 줄 중 하나를 사용했습니다.

누군가 서버에서 요청하는 클라이언트의 실제 IP를 배우도록 도와 줍니까?


당신이 찾고있는 것을 '투명 프록시'라고합니다. iptables가 어떻게 든 관련되어 있지만 정확히 어떻게 모르겠습니다.
sysadmin1138

투명 프록시라고 말하면 들어오는 연결을 배포하는 동안 http 헤더를 수정하지 않는 프록시가 언급됩니다. 따라서 실제 웹 페이지 요청자 클라이언트의 IP는 웹 서버로 전송 될 수 있습니다. 그것이 투명한 프록시에서 이해 한 것입니다.
시스템

답변:


15

이 문제를 해결했습니다. 처음부터 문제가되지 않았을 수도 있습니다. 이 문제에 직면했을 때 Google 검색을 수행했는데

option forwardfor

haproxy.cfg 파일 및 기타 옵션에서 사용하십시오. haproxy 재 컴파일을 포함하여 이러한 옵션을 시도했지만 웹 서버에서 실제 클라이언트의 IP를 배우는 것과 관련된 실제 문제는 HAproxy에서 가져온 것이 아니며 서버 스크립트로 헤더를 읽는 것입니다.이 경우 스크립트 언어는 PHP입니다.

이 명령으로 클라이언트의 IP를 배우려고합니다.

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

이 명령은로드 밸런서의 IP를 표시합니다. 이것은 정확하지만 내가 기대 한 것이 아닙니다. forwardfor 옵션에도 불구하고로드 밸런서의 IP를 제공했습니다.

forwardfor 옵션을 사용하면 HAproxy가 x-forwarded-for 헤더를 웹 서버로 전송되는 클라이언트 요청에 삽입 할 수 있습니다. HAproxy는이 필드를 헤더에 넣었지만 이것을 무시했습니다. 오늘 나는 이것이 헤더 필드라는 것을 깨달았습니다.이 헤더를 다음과 같이 읽어야합니다.

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

이 명령으로 클라이언트의 IP 주소가로드 밸런서의 IP 주소가 아닙니다.

그러나 내 제안은 다른 정보를 조사하기 위해 헤더 데이터를 가져 오기 위해 PHP에 대한 getallheaders () 함수입니다.

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

마지막 haproxy.cfg 파일의 끝은 다음과 같습니다.

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

그럼에도 불구하고 uproxy 또는 gid의 의미와 같은 HAproxy에 대해 많은 누락 된 사항이 있습니다.


2

Apache 로그에 클라이언트 IP 주소가 필요한 경우 아파치 conf를 변경하여 X-forwarded-for를 원본 소스 (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

답변 해 주셔서 감사합니다. Marcelo, Apache 로그에 클라이언트의 IP 주소가 필요하지 않습니다. 우리는 PHP 스크립트로 배우려고 노력합니다.
시스템

1

그냥 시스템의 솔루션 @ 시도하고 헤더 이름이 변경되었습니다 것으로 보인다 HTTP_X_FORWARDED_FOR까지 x-forwarded-for. 아마도 HAproxy 버전과 관련이있을 것입니다.

예를 들어, 이것은 생산 작업 중입니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.