pfSense mit HAproxy funktioniert nur kurze Zeit



  • Hallo zusammen,

    ich "erforsche" gerade die pfSense mit HAproxy und bin dabei auf ein Phänomen gestoßen, bei dem ich nicht weiterkomme und mich über Hinweise/Ideen freuen würde :-)

    Ich habe eine Umgebung aufgesetzt, bei der mehrere unterschiedliche http-Server als Docker-Container laufen und (noch ohne Load Balancing) mit SSL Offloading auf unterschiedlichen Ports extern erreichbar sind. Das funktioniert, aber es funktioniert immer nur ein paar Minuten lang, bis es dann ein 504 Gateway Time-out gibt (obwohl die Checks in der HAProxy-Statistik ok sind). Öffne ich ein neues Inkognito-Browserfenster, dann klappt es wieder ein Weilchen, bis das Spiel von vorne losgeht.

    Hier der Vergleich von HAProxy-Logs - oben klappt es, unten nicht:

    [2020-10-11T11:16:14.857080] Incoming log entry; line='<134>Oct 11 13:16:14 haproxy[78394]: 116.202.xxx:54896 [11/Oct/2020:13:15:14.839] frontend-host~ backend-host_ipvANY/172.20.x.2 0/0/1/-1/60018 504 194 - - sH-- 1/1/0/0/0 0/0 "GET /swagger/index.html HTTP/1.1"\x0a'
    
    
    [2020-10-11T11:17:05.183193] Incoming log entry; line='<134>Oct 11 13:17:05 haproxy[78394]: 116.202.xxx:55512 [11/Oct/2020:13:17:05.173] frontend-host~ backend-host_ipvANY/172.20.x.2 0/0/1/10/11 200 5630 - - ---- 2/2/1/2/0 0/0 "GET /swagger/index.html HTTP/1.1"\x0a'
    

    Zum Setup:

    • pfSense bei Hetzner in der Cloud mit zusätzlicher Floating IP auf dem WAN-Interface (eingerichtet als IP Alias) - die Floating IP soll dabei für HAproxy genutzt werden
    • ein Docker-Server mit diversen Webservern (ONLYOFFICE und eine ASP.NET Core-App mit Front-/Backend) auf unterschiedlichen Ports im LAN
    • kaum Anpassungen an der pfSense bis auf die nötigen ACLs für HAProxy und ein IPsec-S2S-VPN

    Vielen Dank für jegliche Hinweise!!

    Hier noch die generierte HAProxy-Config:

    # Automaticaly generated, dont edit manually.
    # Generated on: 2020-10-11 18:11
    global
    	maxconn			1000
    	log			172.20.x.2:514	local0	debug
    	stats socket /tmp/haproxy.socket level admin  expose-fd listeners
    	uid			80
    	gid			80
    	nbproc			1
    	nbthread			1
    	hard-stop-after		15m
    	chroot				/tmp/haproxy_chroot
    	daemon
    	tune.ssl.default-dh-param	2048
    	server-state-file /tmp/haproxy_server_state
    
    listen HAProxyLocalStats
    	bind 127.0.0.1:2200 name localstats
    	mode http
    	stats enable
    	stats admin if TRUE
    	stats show-legends
    	stats uri /haproxy/haproxy_stats.php?haproxystats=1
    	timeout client 5000
    	timeout connect 5000
    	timeout server 5000
    
    frontend oo01front
    	bind			78.46.xxx:9101 name 78.46.xxx:9101   ssl crt-list /var/etc/haproxy/oo01front.crt_list  
    	mode			http
    	log			global
    	option			http-keep-alive
    	option			forwardfor
    	acl https ssl_fc
    	http-request set-header		X-Forwarded-Proto http if !https
    	http-request set-header		X-Forwarded-Proto https if https
    	timeout client		30000
    	acl			aclcrt_oo01front	var(txn.txnhost) -m reg -i ^bla\.blabla\.com(:([0-9]){1,5})?$
    	http-request set-var(txn.txnhost) hdr(host)
    	use_backend oo01_ipvANY  if   aclcrt_oo01front
    
    frontend ipswebback01-front
    	bind			78.46.xxx:4443 name 78.46.xxx:4443   ssl crt-list /var/etc/haproxy/ipswebback01-front.crt_list  
    	mode			http
    	log			global
    	option			http-keep-alive
    	option			forwardfor
    	acl https ssl_fc
    	http-request set-header		X-Forwarded-Proto http if !https
    	http-request set-header		X-Forwarded-Proto https if https
    	timeout client		30000
    	acl			aclcrt_ipswebback01-front	var(txn.txnhost) -m reg -i ^bla\.blabla\.com(:([0-9]){1,5})?$
    	http-request set-var(txn.txnhost) hdr(host)
    	use_backend ipswebback01_ipvANY  if   aclcrt_ipswebback01-front
    
    frontend ipswebfront01-front
    	bind			78.46.xxx:443 name 78.46.xxx:443   ssl crt-list /var/etc/haproxy/ipswebfront01-front.crt_list  
    	mode			http
    	log			global
    	option			http-keep-alive
    	option			forwardfor
    	acl https ssl_fc
    	http-request set-header		X-Forwarded-Proto http if !https
    	http-request set-header		X-Forwarded-Proto https if https
    	timeout client		30000
    	acl			aclcrt_ipswebfront01-front	var(txn.txnhost) -m reg -i ^bla\.blabla\.com(:([0-9]){1,5})?$
    	http-request set-var(txn.txnhost) hdr(host)
    	use_backend ipswebfront01_ipvANY  if   aclcrt_ipswebfront01-front
    
    frontend http-to-https
    	bind			78.46.xxx:80 name 78.46.xxx:80   
    	mode			http
    	log			global
    	option			http-keep-alive
    	timeout client		30000
    	http-request redirect scheme https 
    
    backend oo01_ipvANY
    	mode			http
    	id			100
    	log			global
    	timeout connect		30000
    	timeout server		100000
    	retries			3
    	option			httpchk GET / 
    	server			dockeroo01 172.20.x.2:9101 id 101 check inter 1000  
    
    backend ipswebback01_ipvANY
    	mode			http
    	id			102
    	log			global
    	timeout connect		30000
    	timeout server		100000
    	retries			3
    	option			httpchk GET / 
    	server			ipswebback01 172.20.x.2:8081 id 101 check inter 1000  
    
    backend ipswebfront01_ipvANY
    	mode			http
    	id			103
    	log			global
    	timeout connect		30000
    	timeout server		100000
    	retries			3
    	option			httpchk GET / 
    	server			ipswebfront01 172.20.x.2:8080 id 101 check inter 1000
    

  • LAYER 8 Moderator

    @ips-ad said in pfSense mit HAproxy funktioniert nur kurze Zeit:

    bis es dann ein 504 Gateway Time-out gibt (obwohl die Checks in der HAProxy-Statistik ok sind). Öffne ich ein neues Inkognito-Browserfenster, dann klappt es wieder ein Weilchen, bis das Spiel von vorne losgeht.

    Sind die wirklich durchgehend OK? 504 ist eigentlich klarer Fall, dass das Backend nicht erreichbar ist/war. Hast du mal testweise den Backend Check einfach disabled (und damit quasi immer OK angenommen)? Tritt es dann auch auf?


Log in to reply