haproxy-TCP 모드에서 원본 / 원격 IP 전달 srvtimeout

percona 클러스터의로드 밸런싱 및 ip 장애 조치를 위해 keepalived로 haproxy를 설정했으며 훌륭하게 작동하므로 다른 서비스 / 데몬에 동일한 lb / 장애 조치를 사용하고 싶습니다.

이 방법으로 haproxy를 구성했습니다.

listen my_service 0.0.0.0:4567
    mode tcp
    balance leastconn
    option tcpka
    contimeout      500000
    clitimeout      500000
    srvtimeout      500000

    server host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3
    server host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3

로드 밸런싱은 제대로 작동하지만 서비스는 클라이언트의 실제 IP 대신로드 밸런서의 IP를 확인합니다. http 모드에서는 haproxy가 원격 IP를 통과하는 것이 매우 쉽지만 tcp 모드에서 어떻게해야합니까? 이것은로드 밸런싱에 필요한 서비스의 특성으로 인해 중요합니다.

감사! 비토



답변

나중에 참조하기 위해 keepalived는 장애 조치를위한로드 밸런싱을위한 솔루션입니다 (LVS를 의미 할 수 있습니까?). HAProxy의 투명 프록시 모드는 원래 IP를 전송하는 특별한 방법과 아무 관련이 없습니다. 표준 HTTP 헤더를 사용할 수있는 일반 비 투명 HTTP 모드입니다.

제 생각에는 원래 질문에 정확하게 대답합니다. TPROXY 지원 Linux 커널에서 HAProxy의 투명한 프록시 지원을 컴파일 할 수 있습니다. 동일한 머신에서 iptables의 버전 + 구성을 지원하는 적절한 TPROXY와 함께 실제로 완전히 투명한 tcp 프록시 지원이 가능합니다. 이는 백엔드 서버에 특별한 구성이 필요하지 않음을 의미합니다.

이것은 실제로 HAProxy에 권장되는 설정이 아니며 꼭 필요한 경우에만 사용해야합니다.


답변

내가 보지 못하거나 어떤 것도 해보고 싶지 않은 haproxy에는 일종의 “투명”모드가 있습니다. 그렇지 않으면, 백엔드 서비스가 haproxy의 원래 IP ( “PROXY blahblah”)를 전송하는 특별한 방법에 대해 가르치고 서비스가 원래 IP를 가져 오도록해야합니다.

그래도 왜 haproxy로 귀찮게합니까? 당신은 이미 자리를 지키고 있으며, 투명한 투명한로드 밸런싱도 수행합니다.


답변

사용 send-proxy(서버 당) 구성에 심지어 TCP 모드에서, 당신에게 잡 서버 측에서 원래의 소스 IP를 제공 할 것입니다. HAProxy 1.5 이상이 필요합니다.

프록시 프로토콜 에 대한 자세한 내용은 HAProxy 설명서를 참조하십시오 .

listen my_service 0.0.0.0:4567
mode tcp
balance leastconn
option tcpka
contimeout      500000
clitimeout      500000
srvtimeout      500000

server host1 xxx.xxx.xxx.xx1:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
server host2 xxx.xxx.xxx.xx2:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3

답변

HAProxy를 NAT 모드로 설정할 수 있습니다. NAT 모드는 여전히 계층 4에서 TCP 모드를 사용하지만 IP를 투명하게 만듭니다.

HAProxy Layer 4로드 밸런싱 NAT 모드


반면 HAPorxy Transparent Mode는 Layer 7에서 HTTP 모드를 사용하는데 HTTP 모드에는 이미 forwardfor옵션 이 있기 때문에 요점에 미치지 않습니다 .

HAProxy 계층 7로드 밸런싱 투명 프록시 모드


답변

이 구성은 저에게 효과적이었습니다. 소스 IP는 $ _SERVER [ ‘HTTP_X_FORWARDED_FOR’]에서 검색 할 수 있습니다.

글로벌
        [..... 평소 물건 ....]
        SSL- 서버-확인 없음

프론트 엔드 메인 * : 5000
        바인드 * : 443 ssl crt /etc/ssl/mycert_with_private_key.pem
        모드 http
        전달 옵션
        reqadd X-Forwarded-Proto : \ https
        default_backend https_server

백엔드 https_server
        모드 http
        최소 잔액
        옵션 tcpka
        스틱 테이블 유형 IP 크기 200k 만료 30m
        서버 srv04 192.168.1.10:443 SSL 검사
        서버 srv05 192.168.1.11:443 SSL 검사