Il s'agit de HTTP keep-alive, qui permet à plusieurs demandes de ressources de passer par une seule session TCP (et, avec SSL, une seule session SSL). Ceci est d'une grande importance pour les performances d'un site SSL, car sans maintien en vie, une poignée de main SSL serait nécessaire pour chaque ressource demandée.
Donc, le problème ici est une grande session de maintien en vie du client jusqu'au serveur principal. C'est une chose importante pour les performances, et considérée comme une évidence pour les serveurs HTTP modernes, mais ce correctif indique qu'il ne le prend pas en charge. Voyons pourquoi ..
Une session persistante est simplement plus de demandes l'une après l'autre - une fois que le serveur a terminé sa réponse à une demande, le serveur n'envoie pas de FIN
paquet pour mettre fin à la session TCP; le client peut simplement envoyer un autre lot d'en-têtes.
Pour comprendre ce que fait ce patch, voici un exemple de conversation continue:
Client:
GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Serveur:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>
Voici où s'arrêterait une connexion non maintenue. Mais, keep-alive permet au client d'en déclencher un autre:
GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Pour l'ID client dans le proxy, certains proxy inverses peuvent ajouter l'en- X-Forwarded-For
tête dans chaque demande client. Cela indique au serveur en amont d'où provient la demande (au lieu de chaque demande initiée à partir de l'IP du proxy inverse), pour des raisons de cohérence dans la journalisation et d'autres besoins d'application.
L'en- X-Forwarded-For
tête doit être injecté dans chaque demande de ressource client envoyée via la connexion permanente, car les en-têtes complets sont envoyés à chaque fois; le traitement de l'en- X-Forwarded-For
tête et sa traduction en tant qu'IP de demande "réelle" est effectué sur une base par demande et non par session TCP-keep-alive. Et bon, il existe peut-être un logiciel de proxy inverse génial qui utilise une seule session permanente pour répondre aux demandes de plusieurs clients.
C'est là que ce patch échoue.
Le correctif de ce site surveille le tampon de la session TCP pour la fin du premier ensemble d'en-têtes HTTP dans le flux et injecte le nouvel en-tête dans le flux après la fin de ce premier ensemble d'en-têtes. Une fois cette opération effectuée, il considère que le X-Forwarded-For
travail est terminé et arrête de rechercher la fin de nouveaux ensembles d'en-têtes. Cette méthode n'a pas connaissance de tous les futurs en-têtes entrant via des demandes ultérieures.
Je ne peux pas vraiment leur en vouloir; stunnel n'était pas vraiment conçu pour gérer et traduire le contenu de ses flux.
L'effet que cela aurait sur votre système est que la première demande d'un flux de maintien en vie X-Forwarded-For
injectera correctement l'en- tête, et toutes les demandes suivantes fonctionneront très bien - mais elles n'auront pas l'en-tête.
À moins qu'il n'y ait un autre patch d'injection d'en-tête qui puisse gérer plusieurs demandes client par connexion (ou que celui-ci soit modifié avec l'aide de nos amis sur Stack Overflow), vous devrez peut-être examiner d'autres options pour votre terminaison SSL.
STunnel 4.45 corrige cela correctement en utilisant de nouvelles fonctionnalités (protocole proxy) fournies avec HAProxy 1.15
Il corrige également les problèmes avec les correctifs précédents et Keep Alive
la source
Semblable à ce que j'ai publié dans un autre fil, HAProxy prend en charge le SSL natif des deux côtés depuis 1.5-dev12. Ainsi, avoir X-Forwarded-For, HTTP keep-alive ainsi qu'un en-tête indiquant au serveur que la connexion a été établie via SSL est aussi simple que ce qui suit:
C'est beaucoup plus facile que de rapatrier Stunnel et bien mieux que de devoir laisser tomber Keep-Alive.
la source
En étendant l'excellente réponse de Shane, vous pouvez utiliser Nginx comme terminateur SSL devant HAproxy. Il gère correctement la conservation entre le client et nginx qui est le côté le plus sensible à la latence et établit une nouvelle connexion au backend pour chaque demande client, en envoyant le X-FORWARDED-FOR dans chacun d'eux.
la source