2016-06-20 4 views
0

Ich kann turn on Proxy Protocol on ELB.Proxy-Protokoll-Header auf ELB wiederverwenden

Aber in meinem Fall möchte ich Proxy-Protokoll-Header auf ELB wiederverwenden. Ist es möglich?

Ich meine, ich sende eine Anfrage mit Proxy-Protokoll-Header bereits auf ELB gesetzt. Und ich möchte, dass ELB diesen speziellen Header übernimmt und weitergibt. Kein neues erzeugen (bei dem sich Quelle/Port vom Original unterscheiden).

+0

Schalten Sie die Proxy-Protokoll-Unterstützung wieder aus und setzen Sie den ELB-Listener in den TCP-Modus. Dies ist genau das Verhalten, das Sie sehen sollten ... aber Sie möchten vielleicht erklären, warum Sie dies wünschen. Mir fällt es schwer, über eine Situation nachzudenken, in der das nützlich wäre. –

+0

@ Michael-sqlbot, danke. Wir haben eine Schicht von Balancern aus der Amazon-Infrastruktur, wo wir den Proxy-Protokoll-Header setzen. Und wir können Anfragen nicht direkt an elb weiterleiten. – fl00r

Antwort

1

Bezug auf die "Header" ist nicht technisch ungenau, aber ist möglicherweise etwas irreführende oder mehrdeutige Terminologie.

Es ist ein "Header" in dem Sinne, dass es am Anfang einer Verbindung ankommt, aber es ist kein HTTP-Request-Header, im Gegensatz zu der bekannten X-Forwarded-For, die natürlich ein HTTP-Request-Header ist.

Elegant in seiner Einfachheit, Version 1 dieses Protokolls injiziert eine Nachricht zu Beginn einer TCP-Verbindung:

PROXY TCP4 192.168.0.1 192.168.0.11 56324 443\r\n 

Die Felder sind Protokoll (TCP über IPv4), Quelle-IP, Ziel-IP, Quell-Port, Ziel-Port, getrennt durch jeweils genau ein Leerzeichen.

Wenn das Protokoll PROXY in einem Stapel verwendet wird, ist es obligatorisch. Eine fehlende oder fehlerhafte PROXY Nachricht zu Beginn einer Verbindung ist eine Fehlerbedingung. Die Existenz einer Nachricht PROXY führt zu einer Vertrauensstufe, die höher ist als diejenige, die von X-Forwarded-For bereitgestellt wird, die mit der Änderung übergeben wird (spätere Werte, die an frühere Werte angehängt wurden). Das Protokoll PROXY macht keine offizielle Genehmigung für die Kaskadierung mehrerer Werte.

Wenn Sie ELB benötigen, um diesen Wert "innerhalb" zu transportieren, dann ist es wichtig, dass die Ingress-Sicherheitsgruppe des ELB nur auf Anforderungen von vertrauenswürdigen Quelladressen beschränkt ist.

Sobald dies geschehen ist, tl; dr:

Konfigurieren des ELB Zuhörer im TCP-Modus (nicht HTTP) und Deaktivieren von Proxy-Protokoll auf der ELB selbst wird das Original, externe PROXY Nachricht ermöglichen, durch transportiert werden die Systeme hinter dem ELB.

Es ist nicht möglich, dies mit einem ELB im HTTP-Modus zu übergeben, da ELB dies bei Anfragen nicht erwartet und die Back-End-Verbindung für Anfragen mehrerer Front-End-Clients wiederverwendet werden kann ist nicht grundsätzlich kompatibel mit dem Proxy-Protokoll - es wurde entwickelt, um die IP-Quelladresse und den Port einer eingehenden Verbindung des Client-Rechners zu identifizieren (nicht die Quell-IP und -Port einer HTTP-Anfrage) ... und wie erwähnt kein HTTP-Anfrage-Header.

Die Idee hinter dem Protokoll PROXY besteht darin, den ursprünglichen Client über einen Stapel von Komponenten zu identifizieren, die nicht für die Nutzlast geeignet sind. In diesem Fall muss ELB diesem Modell folgen. (Es ist natürlich möglich, dass eine Zwischenkomponente diese Nachricht abzieht und dann erneut injiziert, obwohl dies in vielen Fällen etwas sinnlos wäre und ELB diese Konfiguration nicht unterstützt.)

Im TCP-Modus wird der ELB protokollunabhängig und es besteht eine 1: 1-Beziehung zwischen Front-Side- und Backside-Verbindungen, so dass die Nachricht wie erwartet ankommen und funktionieren sollte.

Ein möglicher Nachteil, der zu beachten ist, kann davon abhängen, wie ELB die Paketnutzlast im TCP-Modus verarbeitet. Das Proxy-Protokoll erfordert, dass die gesamte Nachricht im ersten Datenpaket vorhanden ist. (Das Protokoll ist sogar so entworfen, dass es garantiert, dass die Daten immer in ein einzelnes Segment passen.) Wenn ELB dies jemals fragmentiert, muss das Ziel tolerant sein. Dies scheint kein Problem zu sein, aber berücksichtigen Sie die Möglichkeit, wenn das endgültige Ziel intermittierend eingehende Datenströme für ungültig hält.