Làm cách nào để khớp với máy chủ ký tự đại diện trong danh sách ACL trong HAproxy?


10

Tôi có các dòng sau trong 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

Làm thế nào để tôi phù hợp với bất kỳ tên miền phụ?

Tôi đã thử:

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

và:

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

... Nhưng không làm việc.

Cảm ơn

Câu trả lời:


15

Tôi cảm thấy rằng hdr_sub tốt hơn cho nhu cầu của bạn. Tôi đã sử dụng hdr_end được một lúc nhưng nó gặp phải vấn đề sau:

các yêu cầu với cổng 80 thường bị tước cổng để tiêu đề máy chủ trông giống như "example.com", nhưng nếu bạn yêu cầu trên một cổng rõ ràng, như example.com:8080, tiêu đề sẽ có cổng và hdr_end sẽ thất bại kiểm tra "example.com".

hdr_sub sẽ thực hiện một kết hợp chuỗi con, có vẻ như phù hợp hơn với bạn (và tôi).

Hoặc là giải pháp vẫn có một điều khó chịu tôi không thích. Thứ tự đánh giá phụ thuộc của kết quả.

ví dụ (điều kiện của tôi trông như thế này trên frontend)

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

Yêu cầu trên cổng 8080 sẽ như thế này:

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"

nơi mà cổng 80 có thể giống như thế này

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_endlà những gì bạn đang tìm kiếm. Thử cái này:

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

Điều gì nếu bạn có hai tên miền. Một cái gọi là mysite.com và một cái gọi là notmysite.com? Cả hai kết thúc với mysite.com. Vì vậy, trận đấu không đủ cụ thể, phải không?
Saab

1
@Saab trong trường hợp đó tôi sẽ viết acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.com, hoặc chỉ sử dụngacl valid_domains hdr_dom(host) -i mysite.com
howanghk

7

Có những trường hợp bạn cần phải rõ ràng về điều này, chẳng hạn như xử lý các chuyển hướng cho SSL ký tự đại diện với nhiều cấp tên miền phụ.

Kết thúc kết hợp ( hdr_endhoặc -m end) hoặc chuỗi con ( hdr_subhoặc -m sub) có thể có tác dụng phụ ngoài ý muốn của kết hợp nhiều hơn bạn mong đợi. Trong nhiều trường hợp, điều này có thể không thực sự quan trọng, vì bạn không có lưu lượng truy cập cho các tên miền đến máy chủ, nhưng điều đó không có nghĩa đó là giải pháp chính xác về mặt kỹ thuật.

Sử dụng biểu thức chính quy là cách tốt nhất mà tôi đã tìm thấy để thực hiện so khớp rõ ràng. Ví dụ: nếu bạn muốn chỉ khớp *.example.orgmà không khớp sub.domain.example.org:

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

Nếu bạn cũng muốn xử lý (bất kỳ) cổng không chuẩn, điều này có thể được mở rộng một chút:

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

Trên đây sẽ phù hợp :

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

sẽ không khớp :

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.