[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