NGINX 역방향 프록시에서 호스트별로 아웃바운드 PROXY 프로토콜 구현

NGINX 역방향 프록시에서 호스트별로 아웃바운드 PROXY 프로토콜 구현

TLS 통과 역방향 프록시 역할을 하는 NGINX 인스턴스(nginx/1.17.7)가 있습니다(TLS를 종료하지 않지만 SNI 헤더를 기반으로 원래 TCP 연결을 전달함).

이 구성의 주요 단점은 업스트림 서버가 실제 클라이언트 IP 주소를 얻을 수 없지만 역방향 프록시 IP만 연결 소스로 볼 수 있다는 것입니다.

구현하려고 하는데기관 계약이 문제를 이해하는 업스트림 서버(예: 다른 NGINX 서버)를 가짐으로써 이 문제를 극복하십시오.

모든 업스트림 서버가 동시에 인바운드 프록시 프로토콜을 수락하기 시작하도록 구성되어 있다고 가정하면 구현하기가 매우 쉽습니다.

이 구성은 다음과 같은 경우에 잘 작동합니다.

stream {
    map $ssl_preread_server_name $name {
         www.site1.com site1_https;
         www.site2.com site2_https;
         # ...
    }

    upstream site1_https {
        server <site1 internal ip1>:443;
        # ...
    }
    upstream site2_https {
        server <site2 internal ip1>:443;
        # ...
    }
    # ...

    server {
        listen <public ip address>:443
        ssl_preread on;
        proxy_pass $name;

        # This line enable outbound PROXY Protocol to EVERY upstream server!
        proxy_protocol on;
    }
}

그러나 시간이 지남에 따라 인바운드 프록시 프로토콜을 구현하려는 경우 또는 PROXY 프로토콜 헤더를 디코딩할 수 없는 일부 업스트림 서버가 있는 경우 업스트림 서버의 하위 집합에만 아웃바운드 프록시 헤더를 추가할 수 있는 것이 더 좋습니다. .

이를 달성하기 위해 지금까지 시도한 것은 다른 매핑 변수를 추가하여 Proxy_protocol을 설정해야 하는지 결정하는 것입니다.

stream {
    map $ssl_preread_server_name $name {
        www.site1.com site1_https;
        # ...
    }
    map $name $proxy_protocol_onoff {
        site1_https on;
    }
    # ...
    server {
        # ...
        proxy_pass $name;
        proxy_protocol $proxy_protocol_onoff;
# ...

하지만 다음과 같은 오류가 발생합니다.

invalid value "$proxy_protocol_onoff" in "proxy_protocol" directive, it must be "on" or "off" in /etc/nginx/nginx.conf:147

지시어 사용은 지시어 내부에서 if허용되지 않으므로 옵션이 아닙니다 server. proxy_protocol on;내부 업스트림 지시문을 정의하는 것도 허용되지 않습니다 .

NGINX에서 이 동작이 가능합니까? 아니면 유일한 방법은 HAProxy나 이와 유사한 것으로 전환하는 것입니까?

관련 정보