[server] HAProxy를 통한 원격 IP

몇 가지 문제가있는 새로운 웹 서버 설정을 테스트하고 있습니다. 본질적으로, 우리는 웹 서버를 가지고 있는데, 여기서 코드는 흥미로운 것들을 위해 원격 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



답변

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

답변

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

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

몇 가지 참고 사항 :

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

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


답변

rpaf 아파치 모듈 http://stderr.net/apache/rpaf/ 사용 나는 이것이 오래된 게시물이라는 것을 알고 있지만 이것을 찾는 데 며칠이 걸렸습니다. 이것은 모든 응용 프로그램에 x-forwarded-for ip를 제공합니다.


답변

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

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

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


답변

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


답변

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

보세요:

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

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

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


답변

http://www.openinfo.co.uk/apache/ 에서 mod_extract_forwarded를 시도 하십시오

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx