Comment faire correspondre un hôte générique dans les listes ACL dans HAproxy?

10

J'ai les lignes suivantes dans mon 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

Comment faire correspondre un sous-domaine?

J'ai essayé:

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

et:

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

... Mais ni l'un ni l'autre n'a fonctionné.

Merci

À M
la source

Réponses:

15

Je pense que hdr_sub est mieux adapté à vos besoins. J'utilisais hdr_end depuis un certain temps, mais cela se heurte au problème suivant:

les demandes avec le port 80 obtiennent généralement le port supprimé afin que l'en-tête de l'hôte ressemble à "example.com", mais si vous demandiez explicitement sur un port, comme example.com:8080, l'en-tête aura le port, et hdr_end échouera le vérifiez "example.com".

hdr_sub fera une correspondance de sous-chaîne, ce qui semble être un meilleur choix pour vous (et moi).

L'une ou l'autre solution a toujours une mauvaise chose que je n'aime pas. Évaluation des résultats en fonction de l'ordre.

par exemple (mes conditions ressemblent à ceci sur le frontend)

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

Demander sur le port 8080 serait comme ceci:

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"

où le port 80 pourrait probablement être comme ça

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"
Rj Wilson
la source
12

hdr_endest ce que vous recherchez. Essaye ça:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
quanta
la source
que faire si vous avez deux domaines. Un appelé mysite.com et un appelé notmysite.com? Les deux se terminent avec mysite.com. Donc le match n'est pas assez précis, non?
Saab
1
@Saab dans ce cas, j'écrirais acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.com, ou j'utiliserais simplementacl valid_domains hdr_dom(host) -i mysite.com
howanghk
7

Il y a des cas où vous devez être explicite à ce sujet, comme la gestion des redirections pour SSL générique avec plusieurs niveaux de sous-domaines.

Faire correspondre la fin ( hdr_endou -m end) ou la sous-chaîne ( hdr_subou -m sub) peut avoir des effets secondaires involontaires de faire correspondre plus que vous ne le pensez. Dans de nombreux cas, cela peut ne pas vraiment avoir d'importance, car vous n'avez pas de trafic pour ces domaines vers le serveur, mais cela ne signifie pas que c'est la solution techniquement correcte.

L'utilisation d'une expression régulière est le meilleur moyen que j'ai trouvé pour faire une correspondance explicite. Par exemple, si vous souhaitez uniquement faire correspondre *.example.orgsans faire correspondre sub.domain.example.org:

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

Si vous souhaitez également gérer (tous) les ports non standard, cela peut être légèrement étendu:

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

Ce qui précède correspondra :

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

et ne pas correspondre :

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com
gregmac
la source