Un proxy inverse peut-il utiliser SNI avec SSL?

18

J'ai besoin de servir plusieurs applications via https en utilisant une adresse IP externe.

Les certificats SSL ne doivent pas être gérés sur le proxy inverse. Ils sont installés sur les serveurs d'applications.

Un proxy inverse peut-il être configuré pour utiliser SNI et transmettre ssl pour la terminaison au point de terminaison?

Est-ce possible en utilisant quelque chose comme Nginx ou Apache? À quoi ressemble la configuration?

user319862
la source

Réponses:

14

C'est possible avec Haproxy. Vous pouvez configurer un proxy TCP et extraire le SNI et faire un routage basé sur le SNI. Voici un exemple:

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

Il est essentiel de retarder la demande jusqu'à ce que vous obteniez le bonjour SSL, sinon haproxy essaiera d'établir une connexion avant de recevoir l'en-tête SNI.

J'utilise des serveurs de poids 0 car, dans ma configuration actuelle, je n'ai qu'un seul serveur en cours d'exécution pour chaque SNI et je ne veux pas qu'ils reçoivent des demandes aléatoires. Vous pouvez probablement trouver de meilleures façons de jouer avec cela.

J'espère que ça aide.

Florin Asăvoaie
la source
Pouvez-vous m'indiquer une documentation à ce sujet ou un extrait de configuration afin que je puisse accepter la réponse?
user319862
3
@ user319862 J'ai trouvé ce joli tutoriel qui semble être ce qui est discuté.
Michael Hampton
1
Vraiment? Pourquoi quelqu'un voterait-il contre cette réponse?
Florin Asăvoaie
Le problème avec cela est que l'adresse IP du client n'est pas transmise, donc le serveur ne voit que le trafic provenant du proxy.
Kyle
@Kyle Bien sûr. C'est un proxy TCP. La seule chose que vous pouvez faire à ce sujet est de configurer et de définir haproxy en tant que routeur pour le serveur et d'utiliser tproxy.
Florin Asăvoaie
5

Vous pouvez utiliser sniproxy: https://github.com/dlundquist/sniproxy

Un exemple de configuration:

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
la source
Merci d'avoir posté sur ce projet. Je n'étais pas au courant
user319862
@mick Salut mick lors de l'exécution de SNI en tant que proxy transparent, il casse certains sites avec des erreurs SSL. Comment le réparer ?
gripenfighter
1

C'est certainement possible, même maintenant en 2019 avec le prochain TLS 1.3! De nombreux serveurs Web ou proxys inversés spécialisés offrent cette fonctionnalité prête à l'emploi:

  • Nginx ≥ 1.11.5 (Debian ≥ buster ou stretch-backports)
  • HAProxy ≥ 1,5 (Debian ≥ jessie)
  • Sniproxy (Debian ≥ buster)
  • etc.

Ceci est un exemple de configuration pour Nginx, qui est un choix très populaire pour les configurations qui nécessitent un proxy inverse:

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;
  }
}

Les modules Nginx concernés sont stream_coreet stream_ssl_preread. Manuels:

vog
la source