Hierbei handelt es sich um HTTP-Keep-Alive, bei dem mehrere Ressourcenanforderungen über eine einzelne TCP-Sitzung (und mit SSL über eine einzelne SSL-Sitzung) eingehen können. Dies ist für die Leistung einer SSL-Site von großer Bedeutung, da ohne Keep-Alive ein SSL-Handshake für jede angeforderte Ressource erforderlich wäre.
Hier geht es also um eine große Keep-Alive-Sitzung vom Client bis zum Backend-Server. Es ist eine wichtige Sache für die Leistung und für moderne HTTP-Server selbstverständlich, aber dieser Patch sagt, dass er es nicht unterstützt. Schauen wir uns an, warum ..
Eine Keep-Alive-Sitzung besteht nur aus mehreren Anfragen nacheinander. Sobald der Server seine Antwort auf eine Anfrage beendet hat, sendet der Server kein FIN
Paket, um die TCP-Sitzung zu beenden. Der Client kann einfach einen weiteren Stapel von Headern senden.
Um zu verstehen, was dieser Patch tut, ist hier ein Beispiel für ein Keep-Alive-Gespräch:
Klient:
GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Server:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>
Hier würde eine Nicht-Keep-Alive-Verbindung aufhören. Mit Keep-Alive kann der Client jedoch einfach einen anderen abfeuern:
GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Für die Client-ID beim Proxying können einige Reverse-Proxys im X-Forwarded-For
Header jeder Client-Anforderung hinzugefügt werden . Dadurch wird dem Upstream-Server mitgeteilt, woher die Anforderung stammt (anstelle jeder Anforderung, die von der IP des Reverse-Proxys initiiert wird), um die Protokollierung und andere Anwendungsanforderungen zu gewährleisten.
Der X-Forwarded-For
Header muss in jede Client-Ressourcenanforderung eingefügt werden, die über die Keep-Alive-Verbindung gesendet wird, da jedes Mal die vollständigen Header gesendet werden. Die Behandlung des X-Forwarded-For
Headers und die Übersetzung in die "echte" Anforderungs-IP erfolgt pro Anforderung und nicht pro TCP-Keep-Alive-Sitzung. Und hey, vielleicht gibt es da draußen eine großartige Reverse-Proxy-Software, die eine einzige Keep-Alive-Sitzung verwendet, um Anfragen von mehreren Clients zu bearbeiten.
Hier schlägt dieser Patch fehl.
Der Patch an dieser Site überwacht den Puffer der TCP-Sitzung auf das Ende des ersten Satzes von HTTP-Headern im Stream und fügt den neuen Header nach dem Ende dieses ersten Satzes von Headern in den Stream ein. Danach wird der X-Forwarded-For
Job als erledigt betrachtet und das Scannen nach dem Ende neuer Headersätze beendet. Diese Methode kennt nicht alle zukünftigen Header, die über nachfolgende Anforderungen eingehen.
Kann ihnen nicht wirklich die Schuld geben; stunnel war nicht wirklich dafür gebaut, den Inhalt seiner Streams zu verarbeiten und zu übersetzen.
Dies hätte Auswirkungen auf Ihr System, dass bei der ersten Anforderung eines Keep-Alive-Streams der X-Forwarded-For
Header ordnungsgemäß injiziert wird und alle nachfolgenden Anforderungen einwandfrei funktionieren - der Header jedoch nicht.
Sofern es keinen anderen Header-Injection-Patch gibt, der mehrere Client-Anforderungen pro Verbindung verarbeiten kann (oder diesen mithilfe unserer Freunde bei Stack Overflow optimieren kann), müssen Sie möglicherweise andere Optionen für Ihre SSL-Beendigung prüfen.
STunnel 4.45 behebt dieses Problem mithilfe einiger neuer Funktionen (Proxy-Protokoll), die mit HAProxy 1.15 geliefert werden
Es behebt auch die Probleme mit früheren Patches und Keep Alive
quelle
Ähnlich wie in einem anderen Thread unterstützt HAProxy seit 1.5-dev12 auf beiden Seiten natives SSL. X-Forwarded-For, HTTP Keep-Alive sowie ein Header, der dem Server mitteilt, dass die Verbindung über SSL hergestellt wurde, sind also so einfach wie folgt:
Es ist viel einfacher als das Ausbessern des Stunnels und viel besser, als Keep-Alive fallen zu lassen.
quelle
Wenn Sie die hervorragende Antwort von Shane erweitern, können Sie Nginx als SSL-Terminator vor HAproxy verwenden. Es behandelt das Keep-Alive zwischen Client und Nginx korrekt. Dies ist die latenzempfindlichste Seite und stellt für jede Clientanforderung eine neue Verbindung zum Backend her, wobei das X-FORWARDED-FOR in jeder gesendet wird.
quelle