리버스 프록시가 SSL을 통해 SNI를 사용할 수 있습니까?


18

하나의 외부 IP 주소를 사용하여 https를 통해 여러 응용 프로그램을 제공해야합니다.

SSL 인증서는 리버스 프록시에서 관리되지 않아야합니다. 이들은 애플리케이션 서버에 설치됩니다.

SNI를 사용하고 엔드 포인트에서 종료를 위해 SSL을 통과하도록 리버스 프록시를 구성 할 수 있습니까?

Nginx 또는 Apache와 같은 것을 사용하여 가능합니까? 구성은 어떻게 생겼습니까?

답변:


14

이것은 Haproxy로 가능합니다. TCP 프록시를 설정하고 SNI를 추출하고 SNI를 기반으로 라우팅을 수행 할 수 있습니다. 예를 들면 다음과 같습니다.

backend be.app1
    mode tcp
    no option checkcache
    no option httpclose
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    tcp-request content reject
    use-server server1 if { req.ssl_sni -m beg app1. }
    server server1 server1:8443 check id 1 weight 0

SSL hello를받을 때까지 요청을 지연해야합니다. 그렇지 않으면 haproxy가 SNI 헤더를 수신하기 전에 연결을 시도합니다.

현재 구성에서 각 SNI에 대해 하나의 서버 만 실행되고 임의 요청을 수신하지 않기 때문에 가중치가 0 인 서버를 사용하고 있습니다. 당신은 아마 이것을 가지고 노는 더 좋은 방법을 찾을 수 있습니다.

이게 도움이 되길 바란다.


이 문서 또는 구성 스 니펫에 대한 문서를 알려 주시면 답변을 수락 할 수 있습니까?
user319862

3
@ user319862 토론중인 것으로 보이는 이 멋진 튜토리얼 을 발견 했습니다 .
마이클 햄튼

1
정말? 누군가이 답을 왜 내려 놓을까요?
Florin Asăvoaie

이것의 문제점은 클라이언트의 IP 주소가 전달되지 않으므로 서버는 프록시에서 오는 트래픽 만 볼 수 있다는 것입니다.
Kyle

@Kyle 물론입니다. TCP 프록시입니다. haproxy를 서버의 라우터로 구성하고 설정하고 tproxy를 사용하는 경우이 작업을 수행 할 수 있습니다.
Florin Asăvoaie

5

sniproxy를 사용할 수 있습니다 : https://github.com/dlundquist/sniproxy

구성 예 :

listener 0.0.0.0:443 {
    protocol tls
    table TableHTTPS
    fallback 127.0.0.1:8443
}

listener 0.0.0.0:80 {
    protocol http
    table TableHTTP
    fallback 127.0.0.1:8080
}

table TableHTTPS {
    domain1.com backend1:443
    domain2.org backend2:443
}

table TableHTTP {
    domain1.com backend1:80
    domain2.org backend2:80
}

해당 프로젝트에 대해 게시 해 주셔서 감사합니다. 나는 그것을
몰랐다

@mick 안녕하세요 SNI를 투명한 프록시로 실행하면 SSL 오류로 일부 사이트가 중단됩니다. 고치는 방법?
gripenfighter

1

다가오는 TLS 1.3으로 2019 년에도 가능합니다! 많은 웹 서버 또는 특수 리버스 프록시가이 기능을 기본적으로 제공합니다.

  • Nginx ≥ 1.11.5 (Debian ≥ 버스터 또는 스트레치 백 포트)
  • HAProxy ≥ 1.5 (데비안 ≥ jessie)
  • Sniproxy (데비안 ≥ 버스터)
  • 기타

다음은 리버스 프록시가 필요한 설정에 널리 사용되는 Nginx의 구성 예입니다.

stream {
  map $ssl_preread_server_name $selected_upstream {
    example.org upstream_1;
    example.net upstream_2;
    example.com upstream_3;
    default upstream_4;
  }
  upstream upstream_1 { server 10.0.0.1:443; }
  upstream upstream_2 { server 10.0.0.2:443; }
  upstream upstream_3 { server 10.0.0.3:443; }
  upstream upstream_4 { server 10.0.0.4:443; }
  server {
    listen 10.0.0.5:443;
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}

관련 Nginx 모듈은 stream_corestream_ssl_preread입니다. 매뉴얼 :

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