Come posso abbinare un host jolly negli elenchi ACL in HAproxy?


10

Ho le seguenti righe nel mio 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

Come posso abbinare qualsiasi sottodominio?

Provai:

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

e:

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

... Ma nessuno dei due ha funzionato.

Grazie

Risposte:


15

Sento che hdr_sub è migliore per le tue esigenze. Stavo usando hdr_end da un po 'ma si verifica il seguente problema:

le richieste con la porta 80 di solito ottengono la porta spogliata in modo che l'intestazione host assomigli a "esempio.com", ma se stavi richiedendo esplicitamente una porta, come esempio.com:8080, l'intestazione avrà la porta e hdr_end fallirà il controlla "esempio.com".

hdr_sub eseguirà una corrispondenza di sottostringa, che sembra una misura migliore per te (e per me).

Entrambe le soluzioni hanno ancora una brutta cosa che non mi piace. Valutazione dipendente dall'ordine dei risultati.

ad es. (le mie condizioni sembrano così sul frontend)

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

La richiesta sulla porta 8080 sarebbe così:

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"

dove probabilmente la porta 80 potrebbe essere così

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"

12

hdr_endè quello che stai cercando. Prova questo:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains

cosa succede se hai due domini. Uno chiamato mysite.com e uno chiamato notmysite.com? Entrambi finiscono con mysite.com. Quindi la partita non è abbastanza specifica, giusto?
Saab,

1
@Saab in quel caso vorrei scrivere acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.com, o semplicemente usareacl valid_domains hdr_dom(host) -i mysite.com
howanghk

7

Esistono casi in cui è necessario essere espliciti al riguardo, ad esempio la gestione dei reindirizzamenti per SSL con caratteri jolly con più livelli di sottodomini.

L'estremità di corrispondenza ( hdr_endo -m end) o la sottostringa ( hdr_subo -m sub) possono avere effetti collaterali indesiderati associati alla corrispondenza più del previsto. In molti casi questo potrebbe non essere importante, dal momento che non hai traffico per quei domini che arrivano al server, ma non significa che sia la soluzione tecnicamente corretta.

L'uso di un'espressione regolare è il modo migliore che ho trovato per eseguire una corrispondenza esplicita. Ad esempio, se si desidera abbinare solo *.example.orgsenza abbinamento sub.domain.example.org:

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

Se vuoi anche gestire (qualsiasi) porte non standard, questa può essere leggermente estesa:

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

Quanto sopra corrisponderà :

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

e sarà non corrispondere :

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.