haproxy + stunnel + giữ sống?


10

Tôi muốn đặt stunnel trước haproxy 1.4 để xử lý lưu lượng HTTPS. Tôi cũng cần stunnel để thêm tiêu đề X-Forwarded-For . Điều này có thể đạt được bằng các bản vá "stunnel-4.xx-xforwarded-for.diff" từ trang web haproxy.

Tuy nhiên, mô tả đề cập:

Lưu ý rằng bản vá này không hoạt động với keep-life, ...

Câu hỏi của tôi là: Điều này sẽ có ý nghĩa gì trong thực tế đối với tôi? Tôi không chắc chắn,

  1. nếu đây là về việc giữ sống giữa
    • khách hàng và stunnel
    • stunnel và haproxy
    • hoặc haproxy và máy chủ phụ trợ?
  2. Điều này có ý nghĩa gì đối với hiệu suất: Nếu tôi có 100 biểu tượng trên một trang web, trình duyệt sẽ phải thương lượng 100 kết nối SSL đầy đủ hay có thể sử dụng lại kết nối SSL, chỉ cần tạo kết nối TCP mới?

Câu trả lời:


12

Đây là về HTTP giữ nguyên, cho phép nhiều yêu cầu tài nguyên đi qua một phiên TCP duy nhất (và, với SSL, một phiên SSL duy nhất). Điều này có tầm quan trọng rất lớn đối với hiệu suất của một trang web SSL, vì nếu không có sự tồn tại, sẽ cần một cái bắt tay SSL cho mỗi tài nguyên được yêu cầu.

Vì vậy, mối quan tâm ở đây là một phiên duy trì lớn từ máy khách đến máy chủ phụ trợ. Đây là một điều quan trọng đối với hiệu suất và được coi là vấn đề tất nhiên đối với các máy chủ HTTP hiện đại, nhưng bản vá này cho biết nó không hỗ trợ nó. Hãy xem tại sao ..


Một phiên duy trì chỉ là nhiều yêu cầu lần lượt - một khi máy chủ kết thúc phản hồi của nó đối với một yêu cầu, máy chủ không gửi một FINgói để kết thúc phiên TCP; khách hàng có thể chỉ cần gửi một loạt các tiêu đề khác.

Để hiểu bản vá đó đang làm gì, đây là một ví dụ về cuộc trò chuyện trực tiếp:

Khách hàng:

GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...

Người phục vụ:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>

Đây là nơi một kết nối không còn tồn tại sẽ dừng lại. Nhưng, giữ cho phép khách hàng bắn ra một thứ khác:

GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...

Đối với ID khách hàng trong ủy quyền, một số proxy ngược có thể thêm vào X-Forwarded-Fortiêu đề trong mỗi yêu cầu của máy khách. Điều đó cho biết máy chủ ngược dòng nơi yêu cầu đến từ (thay vì mọi yêu cầu bắt đầu từ IP của proxy ngược), cho sự tỉnh táo trong việc đăng nhập và các nhu cầu ứng dụng khác.

Các X-Forwarded-Fortiêu đề cần phải được tiêm vào mỗi và mọi yêu cầu tài nguyên khách hàng gửi thông qua kết nối giữ-sống, như tiêu đề đầy đủ được gửi mỗi lần; việc xử lý X-Forwarded-Fortiêu đề và dịch thành IP yêu cầu "thực" được thực hiện trên cơ sở mỗi yêu cầu, không phải trên mỗi TCP-keep-live-session, trên cơ sở. Và này, có thể có một số phần mềm proxy ngược tuyệt vời ngoài kia sử dụng một phiên duy nhất cho các yêu cầu dịch vụ từ nhiều khách hàng.

Đây là nơi bản vá này thất bại.


Bản vá tại trang web đó xem bộ đệm của phiên TCP cho phần cuối của bộ tiêu đề HTTP đầu tiên trong luồng và đưa tiêu đề mới vào luồng sau khi kết thúc bộ tiêu đề đầu tiên đó. Sau khi hoàn thành, nó sẽ xem xét X-Forwarded-Forcông việc đã hoàn thành và dừng quét tìm phần cuối của các tiêu đề mới. Phương pháp này không có nhận thức về tất cả các tiêu đề trong tương lai đến thông qua các yêu cầu tiếp theo.

Không thể thực sự đổ lỗi cho họ; stunnel không thực sự được xây dựng để xử lý và dịch nội dung các luồng của nó.

Hiệu quả mà điều này sẽ có trên hệ thống của bạn là yêu cầu đầu tiên của luồng phát trực tiếp sẽ được X-Forwarded-Fortiêm tiêu đề đúng cách và tất cả các yêu cầu tiếp theo sẽ hoạt động tốt - nhưng chúng sẽ không có tiêu đề.

Trừ khi có một bản vá tiêm tiêu đề khác có thể xử lý nhiều yêu cầu của khách hàng trên mỗi kết nối (hoặc điều chỉnh cái này với sự trợ giúp của bạn bè chúng tôi tại Stack Overflow), bạn có thể cần xem xét các tùy chọn khác cho việc chấm dứt SSL của mình.


1
Câu trả lời tuyệt vời, cảm ơn. Nhắc nhở tôi, tại sao nên đặt câu hỏi ở đây.
Chris Lercher

1
Để cho phép tiêm tiêu đề liên tục trong stunnel, nó cần có khả năng nói gần như tất cả HTTP, đây sẽ là một khối lượng công việc khổng lồ. Điều đó nói rằng, bạn cũng có thể sử dụng giao thức PROXY của HAproxy (yêu cầu một bản vá cho stunnel hoặc stud thay thế ) một tiêu đề tiêm trong HAproxy. Xem tài liệu để biết thêm thông tin (từ bộ nhớ cache của google, vì trang web HAproxy dường như đã ngừng hoạt động một phần ATM)
Holger Chỉ cần


3

Tương tự như những gì tôi đã đăng trong một chủ đề khác, HAProxy không hỗ trợ SSL gốc ở cả hai bên kể từ 1.5-dev12. Vì vậy, việc có X-Forwarded-For, HTTP vẫn tồn tại cũng như một tiêu đề cho máy chủ biết rằng kết nối được tạo qua SSL cũng đơn giản như sau:

listen front
    bind :80
    bind :443 ssl crt /etc/haproxy/haproxy.pem
    mode http
    option http-server-close
    option forwardfor
    reqadd X-Forwarded-Proto:\ https if { is_ssl }
    server srv1 1.1.1.1:80 check ...
    ...

Nó dễ dàng hơn nhiều so với việc vá stunnel và tốt hơn nhiều so với việc phải sống sót.


Bạn có thể muốn sử dụng ssl_fc thay vì is_ssl
josch

2

Mở rộng câu trả lời xuất sắc từ Shane, bạn có thể sử dụng Nginx làm công cụ chấm dứt SSL trước HAproxy. Nó xử lý chính xác sự tồn tại giữa máy khách và nginx, mặt nhạy cảm nhất có độ trễ nhất và tạo kết nối mới đến phụ trợ cho mỗi yêu cầu của khách hàng, gửi X-FORWARDED-FOR cho mỗi người.


1
Tuy nhiên, nếu bạn cần websockets thì nginx sẽ không hoạt động.
w00t

Thêm vào đó, nó hỗ trợ bộ đệm phiên ssl.
3molo
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.