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를 배우도록 도와 줍니까?
답변
이 문제를 해결했습니다. 처음부터 문제가되지 않았을 수도 있습니다. 이 문제에 직면했을 때 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에 대해 많은 누락 된 사항이 있습니다.
답변
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
답변
그냥 시스템의 솔루션 @ 시도하고 헤더 이름이 변경되었습니다 것으로 보인다 HTTP_X_FORWARDED_FOR
까지 x-forwarded-for
. 아마도 HAproxy 버전과 관련이있을 것입니다.
예를 들어, 이것은 생산 작업 중입니다.
String requestIp = httpRequest.getHeader("x-forwarded-for");