Haproxy-Setup mit Subdomain-Setup

8

Hoffen Sie, dass jemand helfen kann, zu bestätigen, ob dies funktionieren soll? Ich versuche, 3 Subdomain-Datenverkehr an denselben Haproxy-Host weiterzuleiten.

Hier ist mein Setup

haproxy mit einer schnittstelle ip 10.10.10.100 und dns name haproxy01.mydomain.com

3 damit verbundene CNAME-Datensätze; sub1.mydomain.com, sub2.mydomain.com und sub3.mydomain.com

Der gesamte eingehende Verkehr ist für Port 443.

Es gibt zwei Back-End-Anwendungsserver, die beispielsweise Datenverkehr an drei Ports 8081, 8082, 8083 akzeptieren.

sub1.mydomain.com für 8081 sub2.mydomain.com für 8082 und sub3.mydomain.com für 8083

Die Anwendung erfordert SSL-Pass-Through nur für Port 8081-Verkehr, daher glaube ich, dass ich den TCP-Modus verwenden muss. Der andere Verkehr für 8082 und 8083 ist ebenfalls SSL, kann aber am Haproxy beendet werden, aber für die Tests habe ich alle TCP-Tests durchgeführt Modus.

Mein Konfigurationsabschnitt, um dies zu erreichen, ist unten;

    #Application Setup 
frontend mytraffic
    bind *:443
    mode  tcp
    acl host_sub1 hdr(host) -i sub1.mydomain.com
    acl host_sub2 hdr(host) -i sub2.mydomain.com
    acl host_sub3 hdr(host) -i sub3.mydomain.com

    use_backend sub1_nodes if host_sub1
    use_backend sub2_nodes if host_sub2
    use_backend sub3_nodes if host_sub3

    option tcplog backend sub1_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8081 check
    server node2 10.10.10.102:8081 check 
backend sub2_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8082 check
    server node2 10.10.10.102:8082 check 
backend sub3_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8083 check
    server node2 10.10.10.102:8083 check


    # APPLICATION SETUP END

Wenn ich versuche, über HAproxy auf die Anwendungsserver zuzugreifen, z. B. für 8082-Datenverkehr, werden die Protokolle ausgegeben.

localhost haproxy [6097]: xxxx: 51241 [20 / Mar / 2015: 12: 19: 38.720] mytraffic mytraffic / -1 / -1 / 0 0 SC 0/0/0/0/0/0/0

schätzen einige Anweisungen bezüglich dieses Setups.

PS Ich kann hier aus Gründen der Klarheit kein Bild einbetten, da es mein erster Beitrag ist :-(

Globales Lernen
quelle
Die Protokollnachricht war nicht vollständig. 20. März 12:19:38 localhost haproxy [6097]: xxxx: 51241 [20 / Mar / 2015: 12: 19: 38.720] mytraffic mytraffic / <NOSRV> -1 / -1 / 0 0 SC 0/0/0 / 0/0 0/0
Globales Lernen
NOSRV bedeutet, dass kein geeignetes Backend gefunden werden konnte. Können Sie auf die Statistikseite oder den Socket zugreifen und sehen, welche Backends HAproxy für aktiv hält?
Jim G.
Überprüfen Sie auch, ob eine Verbindung zwischen Haproxy und den Anwendungsservern besteht. Bei Verwendung von nc: nc -v 10.10.10.101 8081, nc -v 10.10.10.102 8081 usw.
hdanniel
Bei der letzten Überprüfung im Haproxy-Überwachungs-Dashboard werden alle Knoten gemeldet. Ich habe auch die Konnektivität von der Haproxy-Konsole zu diesen Anwendungsservern an allen Ports bestätigt.
Globales Lernen
@HD ja die Konnektivität ist auf beiden Knoten in Ordnung.
Globales Lernen

Antworten:

11

Im TCP-Modus dekodiert HAProxy die HTTP-Anforderung nicht, sodass Ihre aclLeitungen nichts tun und das Frontend niemals mit einem Backend übereinstimmen kann, wie aus den von Ihnen eingegebenen Protokollen hervorgeht: Dies mytraffic/<NOSRV>bedeutet, dass es keine auswählen konnte Backend oder Server.

Sie müssten die 3 Subdomains in zwei verschiedene Frontends mit jeweils eigenen IP-Adressen aufteilen, da sie alle über Port 443 verbunden sind. Eine für Passthrough, die andere für die SSL-Terminierung und die Inhaltsumschaltung mit mode http. Die Einschränkung hierbei ist, dass Sie, wenn Sie eine 4. Subdomain (sub4.mydomain.com) hinzufügen, für die ebenfalls Passthrough erforderlich ist, ein 3. Frontend und eine IP benötigen.

Sie müssten auch verschiedene CNAME- oder A-Einträge in DNS erstellen, damit die richtigen Subdomains auf die richtigen IPs verweisen.

Angesichts dieser DNS-Konfiguration:

10.10.10.100        A         haproxy01-cs.mydomain.com
10.10.10.101        A         haproxy01-pt1.mydomain.com
10.10.10.102        A         haproxy01-pt2.mydomain.com
sub1.mydomain.com   CNAME     haproxy01-pt1.mydomain.com
sub2.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub3.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub4.mydomain.com   CNAME     haproxy01-pt2.mydomain.com

Die HAproxy-Konfiguration würde ungefähr so ​​aussehen:

#Application Setup 
frontend ContentSwitching

  bind 10.10.10.100:443
  mode  http
  option httplog
  acl host_sub2 hdr(host) -i sub2.mydomain.com
  acl host_sub3 hdr(host) -i sub3.mydomain.com
  use_backend sub2_nodes if host_sub2
  use_backend sub3_nodes if host_sub3

frontend PassThrough1
  bind 10.10.10.101:443
  mode  tcp
  option tcplog
  use_backend sub1_nodes     

frontend PassThrough2
  bind 10.10.10.102:443
  mode  tcp
  option tcplog
  use_backend sub4_nodes

backend sub1_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8081 check
  server node2 10.10.10.102:8081 check 

backend sub2_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8082 check
  server node2 10.10.10.102:8082 check 

backend sub3_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8083 check
  server node2 10.10.10.102:8083 check

backend sub4_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8084 check
  server node2 10.10.10.102:8084 check
GregL
quelle
Eigentlich machen die IPs, die ich hier habe, keinen Sinn (ich habe 10.10.10.101-102 für die Frontends verwendet, wo Sie sie den Knoten zugewiesen haben), aber Sie bekommen eine Vorstellung davon, wie es aussehen würde.
GregL
@GreL - DANKE. Ich werde es versuchen und mit Ergebnissen kreisen. Ich war besorgt über den TCP-Modus und die Verwendung von ACL, bevor ich ihn verwendete.
Globales Lernen
Danke GregL. Es klappt. Eine letzte Frage, wenn ich darf? Um SSL vom Client -> Haproxy und zum Haproxy -> Backend-Server zu haben (wie es beendet werden kann, aber ein neues im Backend zu starten), wie wird dies empfohlen? SSL mit TCP-Modus passieren? Der Grund, warum ich den Passthrough für den Port 8081-Verkehr wollte, ist die Anforderung, dass eine Sitzung mit Anwendung und Client gegenseitig authentifiziert werden muss. Der Rest des Verkehrs der Ports 8082 und 8083 erfordert SSL, erfordert jedoch keine gegenseitige Authentifizierung. (Im Moment ging ich mit Passthrough-Ansatz).
Globales Lernen
Nun, HAProxy kann die Überprüfung des Client-Zertifikats mithilfe der Optionen ca-fileund verify optionalfür die bindAnweisung durchführen. Wenn Sie dies getan haben, können Sie ein einzelnes Frontend an eine IP binden und dann den Inhalt zu den entsprechenden Backends wechseln, wie vom Host- Header gefordert . Um zu bestätigen, dass die gegenseitige Authentifizierung funktioniert hat, können Sie eine ACL wie erstellen acl ClientSSLValid ssl_c_verify 0und diese dann als weitere Bedingung zu der use_backendAnweisung hinzufügenuse_backend sub1_nodes if host_sub1 ClientSSLValid
GregL
Hier und hier gibt es anständige Aufzeichnungen darüber, wie das geht, mit mehr Details, als ich angegeben habe.
GregL