Wie kann ich einen Platzhalter-Host in ACL-Listen in HAproxy abgleichen?

10

Ich habe die folgenden Zeilen in meiner haproxy.conf:

acl valid_domains hdr(Host) -i mysite.com images.mysite.com docs.mysite.com admin.mysite.com
redirect location http://mysite.com/invalid_domain if !valid_domains

Wie kann ich eine Subdomain abgleichen?

Ich habe es versucht:

acl valid_domains hdr(Host) -i *.mysite.com

und:

acl valid_domains hdr(Host) -i [a-z]+.mysite.com

... aber beides hat nicht funktioniert.

Vielen Dank

Tom
quelle

Antworten:

15

Ich denke , dass hdr_sub besser für Ihre Bedürfnisse ist. Ich habe hdr_end für eine Weile verwendet, aber es tritt das folgende Problem auf:

Bei Anforderungen mit Port 80 wird der Port normalerweise entfernt, sodass der Host-Header wie "example.com" aussieht. Wenn Sie jedoch explizit an einem Port wie example.com:8080 anfordern, hat der Header den Port und hdr_end schlägt fehl Suchen Sie nach "example.com".

hdr_sub führt ein Teilstring-Match durch, das für Sie (und mich) besser zu passen scheint.

Jede Lösung hat immer noch eine böse Sache, die ich nicht mag. Auftragsabhängige Auswertung der Ergebnisse.

zB (meine Bedingungen sehen im Frontend so aus)

acl is_dbadmin hdr_sub(host) -i dbadmin.example.com

Das Anfordern an Port 8080 würde folgendermaßen aussehen:

Jul  9 02:48:40 localhost haproxy[8]: 192.168.1.1:55870 [09/Jul/2015:02:48:40.865] http-in example/s1 1/0/0/20/110 200 330722 - - ---- 0/0/0/0/0 0/0 {**example.com:8080**||http://example.com:} {Apache/2.4.10 (Debia||||} "GET /wp-includes/js/zxcvbn.min.js HTTP/1.1"

wo als Port 80 wahrscheinlich so sein könnte

Jul  9 02:48:40 localhost haproxy[8]: 192.168.1.1:55870 [09/Jul/2015:02:48:40.865] http-in example/s1 1/0/0/20/110 200 330722 - - ---- 0/0/0/0/0 0/0 {example.com||***http://example.com***:} {Apache/2.4.10 (Debia||||} "GET /wp-includes/js/zxcvbn.min.js HTTP/1.1"
Rj Wilson
quelle
12

hdr_endist was du suchst. Versuche dies:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
Quanten
quelle
Was ist, wenn Sie zwei Domains haben? Einer namens mysite.com und einer namens notmysite.com? Beide enden mit mysite.com. Das Match ist also nicht spezifisch genug, oder?
Saab
1
@ Saab in diesem Fall würde ich schreiben acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.comoder einfach verwendenacl valid_domains hdr_dom(host) -i mysite.com
Howanghk
6

Es gibt Fälle, in denen Sie dies explizit angeben müssen, z. B. die Behandlung von Weiterleitungen für Platzhalter-SSL mit mehreren Ebenen von Subdomänen.

Das Anpassen von Ende ( hdr_endoder -m end) oder Teilzeichenfolge ( hdr_suboder -m sub) kann unbeabsichtigte Nebenwirkungen haben, wenn mehr als erwartet abgeglichen wird. In vielen Fällen spielt dies möglicherweise keine Rolle, da Sie keinen Datenverkehr für die zum Server kommenden Domänen haben, dies bedeutet jedoch nicht, dass dies die technisch korrekte Lösung ist.

Die Verwendung eines regulären Ausdrucks ist der beste Weg, um einen expliziten Abgleich durchzuführen. Zum Beispiel, wenn Sie nur *.example.orgohne Übereinstimmung übereinstimmen möchten sub.domain.example.org:

acl valid_domains hdr(host) -m reg -i ^[^\.]+\.example\.org$

Wenn Sie auch (beliebige) nicht standardmäßige Ports verarbeiten möchten, kann dies geringfügig erweitert werden:

acl valid_domains hdr(host) -m reg -i ^[^\.]+\.example\.org(:[0-9]+)?$

Die obigen Angaben stimmen überein :

  • test1.example.org
  • test2.example.org:8080

und wird nicht übereinstimmen :

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com
Gregmac
quelle