HAProxy: Rule Verständnisfrage

Started by ThomasH, May 13, 2019, 11:27:13 PM

Previous topic - Next topic
Hallo zusammen

Ich bin am Konfigurieren des HAProxy und bringe das Teil einfach nicht richtig zum Laufen. Eigentlich ist es ein einfaches Testszenario in welchem zwei verschiedene Domains (test1.domain.com und test2.domain.com) auf
dem selben Port erreichbar sein sollen (Port HTTP 89), ohne SSL nur HTTP.

Meines Erachtens habe ich alles richtig konfiguriert:

1. NAT Rule erstellt: Anfragen via Port 89 werden auf HAProxy / OpnSense weitergeleitet
2. HAProxy: 2 Real Server erstellt
3. HAProxy: 2 verschiedene Conditions erstellt (Host contains test1.domain.com und test2.domain.com)
4. HAProxy: 2 Rules erstellt
5. HAProxy: 2 Backend Pools erstellt mit Zuweisung des jeweiligen Real Servers (Rest default, keine Rules etc.)
6. HAProxy: 2 Public Services erstellt (Listener)

Ich vermute nun ein Problem in den Rules und dort in der Execute function. In älteren Versionen von OpnSense gab es dort die Möglichkeit "Use specified Backend Pool" anzugeben. Nun gibt es diesen Eintrag nicht mehr. Ich sehe einzig "Override server in Backend Pool" und "Map domains to backend pools using a map file". Ist einer dieser Optionen die "Nachfolgefunktion"? Wenn ja, wie muss ich das einrichten, dass aufgrund der Rule
(mit entsprechender Condition "Host contains...") auf den Backend Pool und somit auf den entsprechenden Server zugegriffen wird?

Testmässig habe ich nun mal unter der Rule "Map domains to backend pools using a map file" ausgewählt mit Parameter Map file: none und Default backend pool: der jeweilige Backend Pool. Weiter oben die entsprechende Condition und unter "Logical operator for conditions" AND (default). Keine Ahnung ob das richtig ist und so funktionieren könnte. Im HAProxy Log File sehe ich, dass jeweils Requests an einen der Public Service ankommt. Dort erscheint dann die folgende Meldung:

haproxy[55878]: xxx.xxx.xxx.xxx:49773 [13/May/2019:23:00:10.104] Listener_Test1_89 Listener_Test1_89/<NOSRV> -1/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

Die Backend Webserver laufen aber problemlos.
Was ich auch nicht verstehe ist die Tatsache, dass gemäss Log File die Requests immer an den gleichen Public Service gelangen (obwohl bei beiden eine entsprechende Rule (mit Condition host match) hinterlegt ist).

Weiss hier evtl. jemand Rat, ich bin mittlerweile verzweifelt und weiss nicht mehr, wo das Problem liegen könnte.

Vielen Dank für eure wertvolle Hilfe.

Gruss Thomas

Hallo ThomasH


hast du die Rules auch dem Frontend zugeordnet?


Ansonsten führe mal bitte folgenden Befehl auf deiner OPNsense aus und Poste den Output. Dann sehen wir was du wie konfiguriert hast:
cat /usr/local/etc/haproxy.conf

Proxmox VE
i3-4030U | 16 GB RAM | 512 GB SSD | 500 GB HDD
i3-2350M | 16 GB RAM | 120 GB SSD | 500 GB HDD

FW VMs:
2 Cores | 1 GB RAM | 20 GB SSD

Aus der kurzen Beschreibung kann ich auch nichts falsches erkennen.

Vielleicht hilft dir mein Howto etwas weiter:
Link zum Howto
Lass einfach den Kram mit HTTPS offloading weg...
Stay secure!
Thomas

OPNsense 22.x / Qotom Q370G4 ram8G ssd256G

Hallo Thomas


sei mir bitte nicht böse aber es wäre echt sehr sehr hilfreich einfach deine Config zu posten.
Habe keine Lust in der Anleitung den Fehler zu erahnen....
Da sieht man direkt wenn was falsch eingestellt ist oder nicht....
(Nachher ist etwas eben falsch eingestellt weil du eben dieses SSL Offloading weggelassen hast)


Grüße
Proxmox VE
i3-4030U | 16 GB RAM | 512 GB SSD | 500 GB HDD
i3-2350M | 16 GB RAM | 120 GB SSD | 500 GB HDD

FW VMs:
2 Cores | 1 GB RAM | 20 GB SSD

Hi Hi
Thomasverwirrung ;-)

ThomasH = TO

Thomas aka astromeier = Helfenwollender

Stay secure!
Thomas

OPNsense 22.x / Qotom Q370G4 ram8G ssd256G

Oh  ::)  da hab ich wohl etwas vertauscht *lach*
Sorry :D
Proxmox VE
i3-4030U | 16 GB RAM | 512 GB SSD | 500 GB HDD
i3-2350M | 16 GB RAM | 120 GB SSD | 500 GB HDD

FW VMs:
2 Cores | 1 GB RAM | 20 GB SSD

Hallo zusammen

Hier spricht nochmals ein Thomas... der Hilfesuchende :)

Vielen Dank mal vorerst für eure Antworten.
Quote from: superwinni2 on May 14, 2019, 01:51:23 PM
Hallo ThomasH

hast du die Rules auch dem Frontend zugeordnet?

Ansonsten führe mal bitte folgenden Befehl auf deiner OPNsense aus und Poste den Output. Dann sehen wir was du wie konfiguriert hast:
cat /usr/local/etc/haproxy.conf

Ja, die Rules sind den Frontends / Public Services zugewiesen. Untenstehend der Output von der HAProxy Konfiguration:

#
# Automatically generated configuration.
# Do not edit this file manually.
#
global
   # Note: Could be a security issue, but required for some feature.
   uid                     80
   gid                     80
   chroot                  /var/haproxy
   daemon               
   stats                  socket /var/run/haproxy.sockelt level admin
   nbproc                  1
   nbthread               1
   tune.ssl.default-dh-param   1024
   spread-checks            0
   tune.chksize            16384
   tune.lua.maxmem            0
   log /var/run/log local0 info
   
defaults
   log      global
   option redispatch -1
   timeout client 30s
   timeout connection 30s
   timeout server 30s
   retries 3
   
# autogenerated entries for ACLs

# autogenerated entries for config in backends/frontends

# autogenerated entries for stats


# Frontend: Listener_Test2_89 (Listener Test 2 für Port 89)
frontend Listener_Test2_89
   bind 0.0.0.0:89 name 0.0.0.0:89
   mode http
   option http-keep-alive
   option forwardfor
   # tuninng options
   timeout client 30s
   
   # logging options
   option httplog
   #ACL: Condition_Test2
   acl acl_5cd8547bc163c6.80550707 hdr_sub(host) -i test2.domain.com
   # ERROR: missing parameters
   # ACTION INVALID: Test2-rule

   
# Frontend: Listener_Test1_89 (Listener Test 1 für Port 89)
frontend Listener_Test1_89
   bind 0.0.0.0:89 name 0.0.0.0:89
   mode http
   option http-keep-alive
   option forwardfor
   # tuninng options
   timeout client 30s
   
   # logging options
   option httplog
   #ACL: Condition_Test1
   acl acl_5cd853985b9ff4.30025630 hdr_sub(host) -i test1.domain.com
   # ERROR: missing parameters
   # ACTION INVALID: Test1-rule   

   
# Backend: SRVDB_Test1_89 (Test1-89)
backend SRVDB_Test1_89
   # health checking is DISABLED
   mode http
   balance source
   # stickiness
   stick-table type ip size 50k expire 30m
   stick on src
   # tuning options
   timeout connect 30s
   timeout server 30s
   http-reuse never
   server SRVDB_Test1_89 192.168.10.6:89

# Backend: SRVDC16_Test2_89 (Test2-89)
backend SRVDC16_Test2_89
   # health checking is DISABLED
   mode http
   balance source
   # stickiness
   stick-table type ip size 50k expire 30m
   stick on src
   # tuning options
   timeout connect 30s
   timeout server 30s
   http-reuse never
   server SRVDC16_Test2_89 192.168.10.30:89   
   
listen local_statistics
   bind         127.0.0.1:8822
   mode         http
   stats uri      /haproxy?stats
   stats realm      HAProxy\ statistics
   stats admin      if TRUE
   
# statistics are DISABLED

   
Wie ihr sehen könnt gibt es in den Frontends Errors, die allenfalls das Problem erklären:
# ERROR: missing parameters
# ACTION INVALID: Test1-rule      

Hier ein Screenshot eines Public Servers:



...die Konfiguration einer Rule:



... Details zur Condition:



Hinweis: Der Domainnamen wurde entsprechend angepasst auf test1.domain.com etc.

Vielen herzlichen Dank für eure hochgeschätzte Unterstützung!

Gruss vom Hilfesuchenden

Thomas

May 14, 2019, 10:26:17 PM #7 Last Edit: May 14, 2019, 10:28:07 PM by superwinni2
Ich glaube da sind zwei Fehler drin:
Einmal in den Regeln und einmal in den Frontends.
Du braucht für beide Backends nur ein Frontend ;) Also bitte eines der Beiden löschen.
Bei dem Frontend was du behälst, bitte beide (!) Regeln hinzufügen.


Zum "Fehler" deiner Rule:Der Fehler liegt in der "logik" deiner Rule.

Du willst durch die Rule erreichen,dass ein spezieller BackendPool benutzt wird?
Falls ja:
Nimm bei "Execute Funktion" -> "Use specific Backend Pool" und wähle dann unten drunter bei "Use backend Pool" deinen Pool aus. Ist die erste Option in der riesigen Auswahlliste... Es kan bisher einmal bei mir vor, dass aufgrund von blöden Bildschirmeinstellungen diese Option oben "versteckt" war... dann halt die Pfeiltasten benutzen ;)
Falls nein: Erklär mir bitte nochmals was du vor hast :D


Falls dem so ist, sollte es dann funktionieren.

EDIT: Noch was gefunden in deiner Condition:
Änder mal von "Host contains" nach "Host matches"
Proxmox VE
i3-4030U | 16 GB RAM | 512 GB SSD | 500 GB HDD
i3-2350M | 16 GB RAM | 120 GB SSD | 500 GB HDD

FW VMs:
2 Cores | 1 GB RAM | 20 GB SSD

Hallo superwinni2

Vielen herzlichen Dank für die rasche Rückmeldung. Ich habe die Konfiguration gemäss deinem Input angepasst. Jetzt verstehe ich auch etwas mehr die Logik dahinter. Trotzdem geht es nun immer noch nicht. :( Hier nochmals die aktuelle Konfiguration, inkl. Backend Pool und Real Server:

Frontend



Rule 1



Rule 2



Condition



Backend Pool



Real Server



Vielen Dank auch für den Input bezüglich "Use backend Pool", als ich die Skalierung im Browser angepasst habe (für die Screenshoots) ist auf einmal auch dieser Eintrag erschienen...

Vielen Dank für eure Unterstützung, wäre für mich ein Meilenstein, wenn dies nun endlich laufen würde.

Gruss Thomas



Guten Morgen

Kannst du bitte nochmals die Textbasierte Config hochladen? Finde jetzt so an sich eigentlich keinen Fehler mehr...

Evtl. Auch noch die log wenn du probierst darauf zu zugreifen?


Zeigt der Syntax test irgendwelche Fehler an?

Grüße

Gesendet von meinem LG-H815 mit Tapatalk

Proxmox VE
i3-4030U | 16 GB RAM | 512 GB SSD | 500 GB HDD
i3-2350M | 16 GB RAM | 120 GB SSD | 500 GB HDD

FW VMs:
2 Cores | 1 GB RAM | 20 GB SSD

Hallo

Vielen Dank für die Rückmeldung. Sämtliche Syntax-Tests sind erfolgreich, es werden keinerlei Fehler angezeigt. Hier ein Auszug aus den Fehlermeldungen (Logs):



Es scheint so, dass der dahinterliegende Server nicht erreichbar ist. Wenn ich auf die Server mittels IP Adresse zugreife kann ich aber problemlos auf die Webseiten zugreifen...

Den Auszug der Config werde ich heute Abend nachliefern.

Gruss Thomas




Ich gleich nochmals... ich konnte nun bereits jetzt die HAProxy Config auslesen. Untenstehend das Resultat:

#
# Automatically generated configuration.
# Do not edit this file manually.
#

global
    # NOTE: Could be a security issue, but required for some feature.
    uid                         80
    gid                         80
    chroot                      /var/haproxy
    daemon
    stats                       socket /var/run/haproxy.socket level admin
    nbproc                      1
    nbthread                    1
    tune.ssl.default-dh-param   1024
    spread-checks               0
    tune.chksize                16384
    tune.bufsize                16384
    tune.lua.maxmem             0
    log /var/run/log local0 info

defaults
    log     global
    option redispatch -1
    timeout client 30s
    timeout connect 30s
    timeout server 30s
    retries 3

# autogenerated entries for ACLs

# autogenerated entries for config in backends/frontends

# autogenerated entries for stats


# Frontend: Listener_Test_89 (Listener Test für Port 89)
frontend Listener_Test_89
    bind 0.0.0.0:89 name 0.0.0.0:89
    mode http
    option http-keep-alive
    option forwardfor
    # tuning options
    timeout client 30s

    # logging options
    option httplog
    # ACL: Condition_Test2
    acl acl_5cd8547bc163c6.80550707 hdr(host) -i test2.domain.com
    # ACL: Condition_Test1
    acl acl_5cd853985b9ff4.30025630 hdr(host) -i test1.domain.com

    # ACTION: Test2-rule
    use_backend SRVDC16_Test2_89 if acl_5cd8547bc163c6.80550707
    # ACTION: Test1-rule
    use_backend SRVDB_Test1_89 if acl_5cd853985b9ff4.30025630

# Backend: SRVDB_Test1_89 (Test1-89)
backend SRVDB_Test1_89
    # health checking is DISABLED
    mode http
    balance source
    # stickiness
    stick-table type ip size 50k expire 30m
    stick on src
    # tuning options
    timeout connect 30s
    timeout server 30s
    http-reuse never
    server SRVDB_Test1_89 192.168.10.6:89

# Backend: SRVDC16_Test2_89 (Test2-89)
backend SRVDC16_Test2_89
    # health checking is DISABLED
    mode http
    balance source
    # stickiness
    stick-table type ip size 50k expire 30m
    stick on src
    # tuning options
    timeout connect 30s
    timeout server 30s
    http-reuse never
    server SRVDC16_Test2_89 192.168.10.30:89

listen local_statistics
    bind            127.0.0.1:8822
    mode            http
    stats uri       /haproxy?stats
    stats realm     HAProxy\ statistics
    stats admin     if TRUE

# statistics are DISABLED

Vielen Dank für eure Hilfe.

Gruss Thomas

Also sieht so aus, als wenn dein Backend Server nicht antwortet...
Wenn du die Server direkt ansprichst... musst du dort auch den Port 89 angeben?
Wird intern SSL verwendet?
Proxmox VE
i3-4030U | 16 GB RAM | 512 GB SSD | 500 GB HDD
i3-2350M | 16 GB RAM | 120 GB SSD | 500 GB HDD

FW VMs:
2 Cores | 1 GB RAM | 20 GB SSD

Ja, ich muss den Port 89 auch angeben. Beide Zugriffe funktionieren direkt problemlos:

http://192.168.10.6:89/
http://192.168.10.30:89/

Es ist keinerlei SSL involviert, ganz simpel über Port 89.

Gibt es allenfalls ein Routing Problem, NAT Problem? Ich poste mal die NAT Rule. Gibt es allenfalls hier einen Überlegungsfehler?

OpnSense Firewall Alias:



NAT Rule:




Vielen Dank für eure Bemühungen!

Gruss Thomas

Öööhmmm... Ich hab gar keine Forwarding Regel angelegt....
Ich hab nur ne WAN Regel die erlaubt, dass man via Port 80 (oder in deinem Fall Port 89) auf die FirewallIP darf...


PS. Es gibt bereits einen Alias für die Firewall (This Firewall) hier sind dann alle eigenen IPs dann drin.


Was ich vorschlagen würde:
Lösch die Forwarding Regel udn lege eine Regel im WAN an. Testweise kannst ja mal ne kleine ANY regel anlegen.
Protokol: UDP/ TCP
Source: ANY
Destination: This Firewall
Port: 89


Dann nochmal schauen ob es klappt.. Falls ja dann würde ich eben die Regel noch weiter einschränken indem ich nur die gewünschte "Destination" IP freigeben würde.
Proxmox VE
i3-4030U | 16 GB RAM | 512 GB SSD | 500 GB HDD
i3-2350M | 16 GB RAM | 120 GB SSD | 500 GB HDD

FW VMs:
2 Cores | 1 GB RAM | 20 GB SSD