haproxy + stunnel + hayatta kal?


10

HTTPS trafiğini işlemek için stuneli 1.4 haproxy'nin önüne koymak istiyorum. Ayrıca X-Forwarded-For başlığını eklemek için stunnel'e ihtiyacım var . Bu , haproxy web sitesinden "stunnel-4.xx-xforwarded-for.diff" yamalarıyla gerçekleştirilebilir .

Ancak, açıklamadan bahseder:

Bu yamanın canlı tutma ile çalışmadığını unutmayın ...

Sorum şu: Bu benim için pratikte ne anlama geliyor? Emin değilim,

  1. eğer bu hayatta kalmakla ilgiliyse
    • müşteri ve stunnel
    • bayıltma ve alkoksi
    • veya haproxy ve arka uç sunucusu?
  2. bunun performans için anlamı nedir: Bir web sayfasında 100 simgem varsa, tarayıcının 100 tam SSL bağlantısı üzerinde anlaşması gerekecek mi yoksa SSL bağlantısını yeniden kullanabilir mi, sadece yeni TCP bağlantıları oluşturabilir mi?

Yanıtlar:


12

Bu, birden çok kaynak isteğinin tek bir TCP oturumundan (ve SSL ile tek bir SSL oturumu) gelmesine izin veren HTTP canlı tutma ile ilgilidir. Bu, bir SSL sitesinin performansı için büyük önem taşır, çünkü canlı tutma olmadan, istenen her kaynak için bir SSL anlaşması gerekecektir.

Yani, buradaki endişe istemciden arka uç sunucusuna kadar büyük bir canlı oturum. Performans için önemli bir şey ve elbette modern HTTP sunucuları için ele alındı, ancak bu yama bunu desteklemediğini söylüyor. Bakalım neden ..


Canlı oturum, birbiri ardına yalnızca daha fazla istektir - sunucu bir isteğe yanıtını tamamladıktan sonra, sunucu FINTCP oturumunu sonlandırmak için bir paket göndermez; istemci başka bir başlık kümesi gönderebilir.

Bu yamanın ne yaptığını anlamak için, canlı bir sohbete bir örnek:

Müşteri:

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

Sunucu:

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

Canlı olmayan bir bağlantının nerede duracağı burada. Ancak, canlı tutma, müşterinin bir başkasını ateşlemesine izin verir:

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

Proxy'de istemci kimliği için X-Forwarded-For, her istemci isteğinde başlığa bazı ters proxy'ler eklenebilir . Bu, yukarı akış sunucusuna, günlüğe kaydetme ve diğer uygulama ihtiyaçları için akıl sağlığına yönelik isteğin nereden geldiğini (ters proxy'nin IP'sinden başlayan her istek yerine) gösterir.

X-Forwarded-ForBaşlık her ve Tam başlıklar her zaman gönderilir olarak, canlı tutma bağlantısı üzerinden gönderilen her istemci kaynak isteği enjekte edilmesi gerekmektedir; X-Forwarded-Forüstbilgi ve çevirinin "gerçek" istek olarak işlenmesi IP, TCP-canlı tutma oturumu başına değil, istek başına yapılır. Ve hey, belki birden fazla istemciden gelen isteklere hizmet vermek için tek bir canlı oturum kullanan bazı harika ters proxy yazılımı var.

Bu yama başarısız oluyor.


Bu sitedeki düzeltme eki, akıştaki ilk HTTP üstbilgi kümesinin sonu için TCP oturumunun arabelleğini izler ve ilk üstbilgi kümesinin bitiminden sonra yeni üstbilgiyi akışa enjekte eder. Bu yapıldıktan sonra, yapılan X-Forwarded-Forişi dikkate alır ve yeni başlık kümelerinin sonu için taramayı durdurur. Bu yöntemin, sonraki istekler yoluyla gelen gelecekteki tüm üstbilgiler hakkında hiçbir bilgisi yoktur.

Onları gerçekten suçlayamam; stunnel, akışlarının içeriğinin işlenmesi ve çevirisi için gerçekten inşa edilmemiştir.

Bunun sisteminiz üzerindeki etkisi, canlı tutma akışının ilk isteğinin X-Forwarded-Forbaşlığı düzgün bir şekilde enjekte etmesini ve sonraki tüm isteklerin iyi çalışmasını sağlar - ancak üstbilgileri olmaz.

Bağlantı başına birden fazla istemci isteğini işleyebilecek (veya Stack Overflow'daki arkadaşlarımızın yardımıyla bunu değiştirebilecek) başka bir başlık enjeksiyon yaması yoksa, SSL sonlandırmanız için diğer seçeneklere bakmanız gerekebilir.


1
Mükemmel cevap, teşekkürler. Bana burada soru sormanın iyi bir fikir olduğunu hatırlatıyor.
Chris Lercher

1
Stunnel'de canlı tutma başlığı enjeksiyonuna izin vermek için, HTTP'nin hemen hemen tümünün çok büyük bir çalışma olacağını söyleyebilmesi gerekir. Bununla birlikte, HAproxy'ye başlık enjekte etmek için HAproxy'nin PROXY protokolünü (stunnel için bir yama gerektiren veya alternatif olarak saplama gerektiren ) kullanabilirsiniz. Daha fazla bilgi için dokümanlara bakın (HAproxy sitesi ATM'nin kısmen altında gibi göründüğü için google önbelleğinden)
Holger Just


3

Başka bir iş parçacığında gönderdiğim gibi, HAProxy 1.5-dev12'den beri her iki tarafta yerel SSL'yi destekliyor. Bu nedenle, X-Forwarded-For, HTTP canlı tutma ve sunucuya bağlantının SSL üzerinden yapıldığını söyleyen bir üstbilgiye sahip olmak aşağıdakiler kadar basittir:

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 ...
    ...

Stunnel'i yamalamaktan çok daha kolay ve hayatta kalmaktan çok daha iyi.


İs_ssl yerine ssl_fc kullanmak isteyebilirsiniz
josch

2

Shane'in mükemmel yanıtını genişleterek, Nginx'i HAproxy'nin önünde SSL sonlandırıcı olarak kullanabilirsiniz. İstemci ve en gecikmeye duyarlı tarafı olan nginx arasındaki canlılığı doğru şekilde işler ve her bir istemci isteği için arka uca yeni bir bağlantı kurarak her birinde X-FORWARDED-FOR gönderir.


1
Ancak, websockets gerekiyorsa nginx çalışmaz.
w00t

Ayrıca, SSL oturum önbelleğini destekler.
3molo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.