[zorp-hu] pssl

Balazs Scheidler bazsi at balabit.hu
2006. Jan. 11., Sze, 13:19:46 CET


On Tue, 2006-01-10 at 20:41 +0200, Balazs Czigany wrote:
> Sziasztok!
> 
> Egy webszervert védenék http/https proxyval (az apache a zorp egy gépen van).
> A teszt üzemben minden jól működött, viszont, most, hogy ma élesbe ment a site
> a https proxy néha beadja az unalmast. Először lassulásokat tapasztalok, majd
> a https teljesen leáll. Ezekután csak force-stop-pal tudom csak leállítani a
> https proxy-t.
> Mi a fene lehet? 
> 
> -------------------------------------------------------------------
> # zorpctl version
> Zorp 3.0.8
> Revision: devel at balabit.hu--zorp-1/zorp-core--mainline--3.0--patch-362
> Compile-Date: Dec 18 2005 19:39:15
> Config-Date: 2005/12/18
> Trace: off
> Debug: off
> IPOptions: off
> IPFilter-Tproxy: off
> Netfilter-Tproxy: on
> Netfilter-Linux22-Fallback: on
> Linux22-Tproxy: off
> Conntrack: on
> 
> Zorplib 3.0.6.4
> Revision: devel at balabit.hu--zorp-1/zorp-lib--mainline--3.0--patch-109
> Compile-Date: Dec 18 2005 19:37:19

Pro vagy GPL ? (jut eszembe, lehet, hogy a version kimenetbe ki kellene
irni...)

Van egy ilyen javitas, ami a Pro-ban 3.0.8-cal jelent meg, viszont a
GPL-ben egy teljesen masik Pssl proxy van, igy ellenoriznem kellene,
hogy abban megvan-e.

          * Fixed timeout processing during SSL handshake.
          * Added new handshake_timeout parameter to control the timeout
            used during SSL handshake.

Ugy nezem ott meg megvan ez a problema. Ellenorizni ugy tudod, hogy tenyleg 
errol van-e szo, hogy rainditasz egy strace-t egy SSL-es szalra, ami
valoszinuleg read()-ben blokkol.

Egy ido utan betelik a --threads altal megadott limit, es ilyenkor a
zorp var egy szal felszabadulasara, ami ha a szalak fixen, timeout
nelkul blokkolnak sosem tortenik meg.

Atportoltam a kereskedelmiben levo javitast (bar szemelyesen nem tudtam
kiprobalni), a lenyeg, hogy letrejott egy handshake_timeout attributum,
default 30 masodperc, es ha az SSL handshake nem jon letre ennyi ido
alatt barmelyik oldalon, akkor bontja a kapcsolatot.

--- orig/modules/pssl/pssl.c
+++ mod/modules/pssl/pssl.c
@@ -51,6 +51,7 @@ typedef struct _PsslProxy
   GString *server_ca_dir;
   GString *server_crl_dir;
   gboolean need_ssl[EP_MAX];
+  gint handshake_timeout;
   int verify_type[EP_MAX];
   int verify_depth[EP_MAX];
 } PsslProxy;
@@ -71,6 +72,7 @@ pssl_config_set_defaults(PsslProxy *self

   z_proxy_enter(self);

+  self->handshake_timeout = 30000;
   self->session_data.timeout = -1;
   self->session_data.copy_to_server = TRUE;
   self->session_data.copy_to_client = TRUE;
@@ -113,6 +115,11 @@ pssl_register_vars(PsslProxy *self)
                   &self->session_data.timeout);

   z_proxy_var_new(&self->super,
+                  "handshake_timeout",
+                  Z_VAR_GET | Z_VAR_SET_CONFIG | Z_VAR_TYPE_INT,
+                  &self->handshake_timeout);
+
+  z_proxy_var_new(&self->super,
                   "copy_to_client",
                   Z_VAR_GET | Z_VAR_SET_CONFIG | Z_VAR_TYPE_INT,
                   &self->session_data.copy_to_client);
@@ -311,11 +318,12 @@ pssl_init_client_ssl(PsslProxy *self)

   SSL_set_options(ssl->ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);

+  z_stream_set_timeout(self->super.endpoints[EP_CLIENT], self->handshake_timeout);
+
   tmpstream = self->super.endpoints[EP_CLIENT];
   self->super.endpoints[EP_CLIENT] = z_stream_ssl_new(tmpstream, ssl);
   z_stream_unref(tmpstream);

-  z_stream_set_timeout(self->super.endpoints[EP_CLIENT], self->session_data.timeout);

   ret = SSL_accept(ssl->ssl);
   if (ret <= 0)
@@ -339,6 +347,7 @@ pssl_init_client_ssl(PsslProxy *self)
     }

   z_ssl_session_unref(ssl);
+  z_stream_set_timeout(self->super.endpoints[EP_CLIENT], -2);
   z_proxy_log(self, PSSL_DEBUG, 6, "Client side SSL handshake successful;");
   z_proxy_leave(self);
   return TRUE;
@@ -370,13 +379,13 @@ pssl_init_server_ssl(PsslProxy *self)
     }

   SSL_set_options(ssl->ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);
-
+
+  z_stream_set_timeout(self->super.endpoints[EP_SERVER], self->handshake_timeout);
+
   tmpstream = self->super.endpoints[EP_SERVER];
   self->super.endpoints[EP_SERVER] = z_stream_ssl_new(tmpstream, ssl);
   z_stream_unref(tmpstream);

-  z_stream_set_timeout(self->super.endpoints[EP_SERVER], self->session_data.timeout);
-
   ret = SSL_connect(ssl->ssl);
   if (ret <= 0)
     {
@@ -399,6 +408,7 @@ pssl_init_server_ssl(PsslProxy *self)
     }

   z_ssl_session_unref(ssl);
+  z_stream_set_timeout(self->super.endpoints[EP_SERVER], -2);
   z_proxy_log(self, PSSL_DEBUG, 6, "Server side SSL handshake successful;");
   z_proxy_leave(self);
   return TRUE;





További információk a(z) zorp-hu levelezőlistáról