Bagaimana cara mencocokkan host wildcard di daftar ACL di HAproxy?

10

Saya memiliki baris berikut di haproxy.conf saya:

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

Bagaimana cara saya mencocokkan subdomain?

Saya mencoba:

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

dan:

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

... Tapi tidak ada yang berhasil.

Terima kasih

Tom
sumber

Jawaban:

15

Saya merasa hdr_sub lebih baik untuk kebutuhan Anda. Saya menggunakan hdr_end untuk sementara waktu tetapi mengalami masalah berikut:

permintaan dengan port 80 biasanya membuat port dilucuti sehingga header host terlihat seperti "example.com", tetapi jika Anda meminta pada port secara eksplisit, seperti example.com:8080, header akan memiliki port, dan hdr_end akan gagal periksa "example.com".

hdr_sub akan melakukan kecocokan substring, yang sepertinya lebih cocok untuk Anda (dan saya).

Entah solusi masih memiliki hal buruk yang saya tidak suka. Evaluasi hasil tergantung pesanan.

mis. (kondisi saya terlihat seperti ini di frontend)

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

Meminta pada port 8080 akan seperti ini:

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"

dimana port 80 kemungkinan bisa seperti ini

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
sumber
12

hdr_endadalah apa yang kamu cari. Coba ini:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
kuanta
sumber
bagaimana jika Anda memiliki dua domain. Satu disebut mysite.com dan satu disebut notmysite.com? Keduanya berakhir dengan mysite.com. Jadi pertandingan tidak cukup spesifik, bukan?
Saab
1
@ Saab dalam hal ini saya akan menulis acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.com, atau hanya menggunakanacl valid_domains hdr_dom(host) -i mysite.com
howanghk
7

Ada kasus di mana Anda perlu secara eksplisit tentang hal ini, seperti menangani arahan ulang untuk wildcard SSL dengan beberapa level subdomain.

Pencocokan akhir ( hdr_endatau -m end) atau substring ( hdr_subatau -m sub) dapat memiliki efek samping yang tidak diinginkan dari pencocokan lebih dari yang Anda harapkan. Dalam banyak kasus ini mungkin tidak terlalu penting, karena Anda tidak memiliki lalu lintas untuk domain yang datang ke server, tetapi itu tidak berarti itu adalah solusi yang secara teknis benar.

Menggunakan ekspresi reguler adalah cara terbaik yang saya temukan untuk melakukan pencocokan eksplisit. Misalnya, jika Anda hanya ingin mencocokkan *.example.orgtanpa mencocokkan sub.domain.example.org:

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

Jika Anda juga ingin menangani (non-standar) port, ini dapat sedikit diperluas:

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

Di atas akan cocok :

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

dan tidak akan cocok :

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com
gregmac
sumber