HAProxy를 통한 원격 IP


19

몇 가지 문제가있는 새로운 웹 서버 설정을 테스트하고 있습니다. 본질적으로, 우리는 웹 서버를 가지고 있는데, 여기서 코드는 흥미로운 것들을 위해 원격 IP를 사용하고, 일부 아파치 디렉토리 (일부 사무실 등)에 보안을 유지합니다.

그러나 우리는 ha_proxy 뒤에 이것을 막아서 더 많은 응용 프로그램 서버를 추가하는 것을 볼 수 있지만 이제 원격 IP는 항상 실제 원격 사용자가 아닌 프록시 IP로 전달됩니다. 이것은 우리가 어떤 위치에 갈 수 없다는 것을 의미하며, 우리의 앱은 사용자 IP가 중요한 곳에서 약간 이상하게 작동합니다.

우리의 설정은 다음과 같습니다 :

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check

답변:


31

haproxy.1wt.eu의 HAProxy 문서에서 인용 했습니다 .

-응용 프로그램이 원래 클라이언트의 IP를 기록해야하는 경우
  "forwardfor"옵션을 사용하여 "X-Forwarded-For"헤더를 추가합니다.
  원래 클라이언트의 IP 주소 또한 "httpclose"를 사용하여
  각 요청 중 첫 번째 요청뿐만 아니라 모든 요청을 다시 작성합니다.
  세션:
        옵션 httpclose
        전달 옵션

클라이언트 IP 주소를 알기 위해서는 애플리케이션이 X-Forwarded-For HTTP 헤더를 처리해야한다고 명시되어 있습니다. 귀하의 경우에 갈 수있는 유일한 방법 인 것 같습니다.

HAProxy 1.4 용으로 업데이트되었습니다

Haproxy 1.4에는 "옵션 http-server-close"가 포함 된 새로운 모드가 도입되었습니다. 여전히 서버와의 연결을 닫았지만 가능하면 클라이언트에 대한 연결 유지를 유지합니다. 대부분의 설정에서 연결의 단일 대기 시간이 긴 부분 (Haproxy와 클라이언트 간)의 대기 시간을 돕는 데 사용할 수 있습니다.

   option http-server-close
   option forwardfor

2
더 나은 사용 option forwardfor header X-Real-IP하고 reqidel ^X-Real-IP:, 당신의 로그에서 IP를 날조이 중지됩니다. 참고 : '옵션 X-Real-IP의 기본 헤더입니다 . NginXset_real_ip_from
Tino

이 질문에는 nginx가 언급되어 있지 않습니다. X-Real-IP가 작동하지 않습니다.
Rick Fletcher

1.이 두 옵션을 프론트 엔드 또는 백엔드 구성 섹션에서 설정해야합니까? (여기서 작동하지 않는 것 같습니다.) 2. Tomcat 수준에서도 어떤 유형의 구성이 필요합니까?
yglodt

6

소스 주소를 전달할 수있는 Tproxy를 포함하도록 HAproxy를 다시 컴파일하는 방법이 있습니다.

여기에 블로그 게시물이 있습니다 : http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

몇 가지 참고 사항 :

최신 Linux 커널 (2.6.28-11 서버)에는 TProxy에 대한 지원이 포함되어 있으므로 커널을 다시 컴파일 할 필요가 없습니다.

HAProxy 서버를 가리키는 기본 게이트웨이 주소로 웹 팜의 서버를 구성해야합니다.



1

응용 프로그램이 Apache 헤더를 변경하는 것으로 보는 것을 무시할 수 있습니다.

SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1

그러나 "Allow from"등을 통한 Apache 액세스에는 작동하지 않습니다.


X-Forwarded-For새 IP 주소가 기존 목록의 끝에 쉼표와 공백으로 구분되어 추가 될 때 클라이언트가 기존 헤더를 보내면 예기치 않은 결과가 발생할 수 있습니다 . 에서 마지막 IP 만 가져 오거나로 또는 Apache 2.4 이상을 사용 (.*)하도록 ([^ ]*)$로 변경하십시오 . mod_rpafmod_remoteip
Ladadadada

1

HAProxy는 의도적으로 다른 IP 프록시와 마찬가지로 원래 IP 주소를 실제 서버로 전달할 수 없습니다.

유일한 문제는 웹 서버에 문제가있는 경우 클라이언트의 주소를 포함해야하는 X- 전달 된 HTTP 헤더를 조사하는 것입니다. 이제는 응용 프로그램 / 언어에 따라 다르지만 PHP 에서이 예제를 살펴보십시오.

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

원래 주소도 기록하려면 다음과 같이 httpd.conf에서 LogFormat을 수정하면됩니다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common


잘못했다면, "
forwardfor

예,이 옵션은 기본적으로 제공되지만 X-Forwarded-For HTTP 헤더를 설정하면됩니다. 내가 말한 것은 실제로 asker가 묻는 것은 IP 패킷의 실제 소스 주소에 관한 것입니다.
Thiagodrv

0

글쎄, X-Forwarded-for는 설정에 적합하지 않은 것 같습니다. 그래서, 당신이 haproxy를 고수해야 할 특별한 이유가 있습니까? IPVS가 귀하의 요구에 더 적합한 것으로 보입니다 (실제로 ipvs를 사용하는 ldirector를 사용합니다).

보세요:

http://kb.linuxvirtualserver.org/wiki/IPVS

http://www.vergenet.net/linux/ldirectord/

'IP 터널링'또는 '직접 라우팅'모드에서 IPVS를 사용하면 클라이언트 주소가 유지됩니다.



-1

tcp 및 nginx 모드에서 haproxy를 사용하는 쉬운 방법 :

서버 옵션으로 send-proxy 추가 :

haproxy.conf :

.

.

ssl 듣기 0.0.0.0:443

모드 TCP

최소 잔액

옵션 httpchk GET / ping

옵션 로그 상태 점검

서버 w1 192.168.1.1:443 send-proxy check check-ssl verify none

서버 w2 192.168.1.1:443 send-proxy check check-ssl verify none

.

.

Nginx는 프록시 프로토콜을 지원해야합니다.

nginx.conf :

.

.

192.168.1.1:443 ssl proxy_protocol을 수신;

.

.

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

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