HAProxy-Backend – Wie stellt man eine Verbindung zum Remote-Server her?

HAProxy-Backend – Wie stellt man eine Verbindung zum Remote-Server her?

Guten Abend allerseits,

Ich bin ein Neuling im Webhosting und habe immer noch das Gefühl, mitten im Ozean schwimmen zu lernen. Ich möchte HAproxy so einrichten, dass eine Anfrage an einen Remote-Server im Backend weitergeleitet wird. Dieser Server ist SSL und steht hinter Cloudflare.

Ich habe das ganze Internet durchsucht, aber bis jetzt konnte ich keine klare Antwort auf meine Frage finden. Ich habe ein Haproxy-Image gezogen und verwende es in einem Container mit einer externen Haproxy.cfg-Datei. Niemand erklärt, ob Sie einen Server im Backend, einen Server außerhalb Ihres Netzwerks (nicht lokal) und darüber hinaus SSL für diese Kommunikation verwenden können. Wenn jemand von Ihnen darüber Bescheid weiß, würde ich mich über eine Antwort freuen, ob und wie dies machbar ist.

Ich verwende derzeit in einem Server-Container den NginxProxyManager und untersuche die Lastausgleichsfunktionen von HAProxy. Bisher habe ich erfolgreich zwischen lokalen Containern hin- und hergewechselt, aber bei entfernten Servern erhalte ich in den Statistiken immer die Antwort „Wegen Wartungsarbeiten außer Betrieb“. Ich habe auch in einem Terminal im HA-Proxy-Container einen Wget-Befehl ausgeführt und er kann die Außenwelt sehen. Wenn ich aus dem HAProxy-Container heraus Google anpinge, wird es angepingt. Alle Container sind sowohl mit dem Bridge-Netzwerk als auch mit einem vom Benutzer erstellten Netzwerk (Bridge-Treiber) in Docker verbunden. Deshalb bin ich völlig verwirrt. Die Hauptfrage lautet also: Kann es gemacht werden und wenn ja, ist das folgende Szenario möglich (?):

  1. Der Client sendet eine https-Anfrage an HAProxy
  2. Mit Roundrobin wechsele ich zwischen lokalen Containern und Remote-Servern
  3. Wenn ich zur Runde „Remote-Server“ komme, möchte ich vom Backend den Host des richtigen Servers (neu geschrieben – das kann ich bereits tun, aber für lokale Container) zusammen mit der Information senden, dass dies eine SSL-Anfrage ist.
  4. Dann würde NginxProxyManager oder ein anderer HAProxy es an den dort verbundenen Container umleiten, die Antwort erhalten, es an den (1.) HAProxy zurücksenden und dieser an den Client.

Ich bin mir nicht einmal sicher, ob das möglich ist. Schauen Sie sich das Folgende an. Es funktioniert mit lokalen Containern, aber nicht mit einem Remote-Server. Es sendet die Anfrage und schreibt den Namen des Host-Headers um. Hier ist die haproxy.cfg

global
        maxconn     4000
        daemon

defaults
        mode    http
        default-server init-addr last,libc,none
        option  http-keep-alive
        option  redispatch
        retries 3
        timeout connect 10s
        timeout client  1m
        timeout server  1m
        option forwardfor 


resolvers mynameservers
   nameserver ns2 8.8.8.8:853


frontend stats
        bind *:8500
        stats enable
        stats uri /
        stats refresh 10s


frontend ft
        bind 0.0.0.0:443 ssl crt /usr/local/etc/haproxy/ha_trial.pem  
        default_backend bt2

backend bt2
        balance roundrobin
        http-send-name-header Host        
        server web1 web1:8080 check
        server web2 web2:8080 check
        server web3 web3:8080 check        
        server myback.mysite.com myback.mysite.com:443 ssl verify none resolvers mynameservers
## the latter does not work - it ends at down for maintenance in statistics and in logs it says: Layer6 invalid response, info: "SSL handshake failure" while it is "verify none"

Alle Leute wie ich und insbesondere ich wären Ihnen sehr dankbar, wenn Sie mir mit einer Antwort, sofern Sie diese wissen, und/oder einigen Referenzen weiterhelfen könnten.

Danke

Antwort1

Der Fall ist genau ein SSL-Handshake-Fehlerfall, da das HAProxy-Docker-Image nicht QUIC-fähig ist und das Backend hinter Cloudflare liegt, das standardmäßig QUIC unterstützt. Wenn ich eine andere Domain verwende, die im Kommunikationsprotokoll von https nicht QUIC-fähig ist, funktioniert alles wie am Schnürchen. Ich frage mich auch, warum in aller Welt Frontend und Backend unterschiedlich gehandhabt werden??? Das Frontend versteht QUIC (? – oder ist QUIC zwischen Ihnen und Cloudflare und zwischen Cloudflare und dem Server eine andere Verschlüsselung?), aber eine Verbindung vom Backend ist nicht möglich?

Kurz gesagt:

  1. HAProxy-Docker-Image ist nicht QUIC-fähig – Zumindest das, das ich habe (Alpine)
  2. Cloudflare hat QUIC standardmäßig als Kommunikationsprotokoll für seine Produkte aktiviert und Sie dürfen dies nicht ändern.
  3. Die Zusammenarbeit dieser beiden ist offensichtlich unmöglich und es wird Ihnen ein „SSL-Handshake-Fehler“ angezeigt.
  4. Um das Problem zu beheben, verwenden Sie einen Anbieter, der nicht die neuesten Kommunikationsprotokolle unterstützt – ok, im Moment ist das nur eine Abhilfe und keine Lösung.
  5. Die HAProxy-Site bietet eine Möglichkeit, HAProxy mit QUIC-Unterstützung von GitHub neu zu kompilieren, und ich werde das später untersuchen …

verwandte Informationen