Hi,

this is the first time I play around with hoststated/relayd.
I have a stateful web application, and try to use hoststated/relayd in front
of it. Because the application is stateful, the client has to be redirected
to the same instance for the session lifetime. The session id is encoded as
GET parameter "wosid". Further I have the problem that many of the users are
either sitting behind a proxy or a NAT'ed IP address, so these should not be
redirected to the same application instance.
I tried with hoststated on OpenBSD 4.2 i386 and with relayd on
OpenBSD -snapshot sparc64 from beginning of February 08.

I'm not sure, whether I see the same problems, as described here in that
thread:
http://www.nabble.com/relayd-http-check-connection-failures--hoststated-operates-correctly-to15646508.html

Well, I do not fiddle around with carp interfaces, and I also tried the
patch with the timeout, that did not fixed my problem.

First I tried to use relayd, until I came across above mentioned thread,
however, first I tried to setup a ssl accelerator as in the example:

ext_addr="10.0.0.24"
ogo1="10.0.0.121"
ogo2="10.0.0.122"
ogo3="10.0.0.123"
ogo4="10.0.0.124"
ogo5="10.0.0.125"

timeout 9999

table <ogohosts> { $ogo1 $ogo2 $ogo3 $ogo4 $ogo5 }

http protocol httpssl {
        header append "$REMOTE_ADDR" to "X-Forwarded-For"
        header append "$SERVER_ADDR:$SERVER_PORT" to "X-Forwarded-By"
        header change "Connection" to "close"
        cookie hash "wosid"
        url hash "wosid"
        url log "wosid"

        # Various TCP performance options
#       tcp { nodelay, sack, socket buffer 65536, backlog 128 }

#       ssl { no sslv2, sslv3, tlsv1, ciphers HIGH }
#       ssl session cache disable
}

relay wwwssl {
        # Run as a SSL accelerator
        listen on $ext_addr port 443 ssl
        protocol httpssl

        # Forward to hosts in the webhosts table using a src/dst hash
        forward to <ogohosts> port http mode hash \
                check http "/" code 200
}

# relayd -d -vv -f /etc/relayd.conf
startup
init_filter: filter init done
init_tables: created 0 tables
relay_privinit: adding relay wwwssl
protocol 0: name httpssl
        flags: 0x0004
        type: http
                request change "Connection" to "close"
                request cookie hash "wosid"
                request url hash "wosid"
                request url log "wosid"
                request append "$SERVER_ADDR:$SERVER_PORT" 
to "X-Forwarded-By"
                request append "$REMOTE_ADDR" to "X-Forwarded-For"
hce_notify_done: 10.0.0.121 (tcp_send_req: timeout)
relay_init: max open files 1024
relay_init: max open files 1024
host 10.0.0.121, check http code (9ms), state unknown -> down, availability 
0.00%
hce_notify_done: 10.0.0.122 (tcp_send_req: timeout)
host 10.0.0.122, check http code (51ms), state unknown -> down, availability 
0.00%
hce_notify_done: 10.0.0.123 (tcp_send_req: timeout)
host 10.0.0.123, check http code (52ms), state unknown -> down, availability 
0.00%
hce_notify_done: 10.0.0.124 (tcp_send_req: timeout)
host 10.0.0.124, check http code (53ms), state unknown -> down, availability 
0.00%
hce_notify_done: 10.0.0.125 (tcp_send_req: timeout)
host 10.0.0.125, check http code (53ms), state unknown -> down, availability 
0.00%
pfe_dispatch_imsg: state -1 for host 9 10.0.0.121
pfe_dispatch_imsg: state -1 for host 8 10.0.0.122
pfe_dispatch_imsg: state -1 for host 7 10.0.0.123
pfe_dispatch_imsg: state -1 for host 6 10.0.0.124
pfe_dispatch_imsg: state -1 for host 5 10.0.0.125
relay_ssl_ctx_create: loading certificate
relay_init: max open files 1024
relay_ssl_ctx_create: loading certificate
relay_ssl_ctx_create: loading certificate
relay_ssl_ctx_create: loading private key
relay_init: max open files 1024
adding 5 hosts from table ogohosts:80
relay_init: max open files 1024
relay_launch: running relay wwwssl
relay_ssl_ctx_create: loading private key
adding 5 hosts from table ogohosts:80
relay_ssl_ctx_create: loading private key
relay_launch: running relay wwwssl
adding 5 hosts from table ogohosts:80
relay_ssl_ctx_create: loading certificate
relay_launch: running relay wwwssl
relay_ssl_ctx_create: loading certificate
relay_ssl_ctx_create: loading private key
adding 5 hosts from table ogohosts:80
relay_ssl_ctx_create: loading private key
relay_launch: running relay wwwssl
adding 5 hosts from table ogohosts:80
relay_launch: running relay wwwssl
relay wwwssl, session 1 established (1 active)
relay_from_table: no active hosts
relay wwwssl, session 1 (1 active), 0, 10.0.0.9 -> :80, session failed
relay wwwssl, session 2 established (1 active)
relay_from_table: no active hosts
relay wwwssl, session 2 (1 active), 0, 10.0.0.9 -> :80, session failed
tcp_write: connect timed out
hce_notify_done: 10.0.0.124 (tcp_write: connect failed)
tcp_write: connect timed out
hce_notify_done: 10.0.0.125 (tcp_write: connect failed)
hce_notify_done: 10.0.0.121 (tcp_send_req: timeout)
hce_notify_done: 10.0.0.122 (tcp_send_req: timeout)
hce_notify_done: 10.0.0.123 (tcp_send_req: timeout)

=======================================================================================

Also a http redirect did not work. I get a timeout in the browser. With
tcpdump I see incoming SYN packets to port 80, but they are not answered:

ext_addr="10.0.0.24"
ogo1="10.0.0.121"
ogo2="10.0.0.122"
ogo3="10.0.0.123"
ogo4="10.0.0.124"
ogo5="10.0.0.125"

timeout 9999

table <ogohosts> { $ogo1 $ogo2 $ogo3 $ogo4 $ogo5 }

redirect "www" {
        listen on $ext_addr port 80
        listen on biggame.ds9 port 80
        sticky-address
        forward to <ogohosts> port http timeout 3000 \
                check http "/" code 200
}


# relayd -d -vv -f /etc/relayd.conf
startup
init_filter: filter init done
hce_notify_done: 10.0.0.125 (tcp_read_buf: check succeeded)
init_tables: created 1 tables
host 10.0.0.125, check http code (9ms), state unknown -> up, availability 
100.00%
hce_notify_done: 10.0.0.122 (tcp_read_buf: check succeeded)
host 10.0.0.122, check http code (146ms), state unknown -> up, availability 
100.00%
hce_notify_done: 10.0.0.124 (tcp_read_buf: check succeeded)
host 10.0.0.124, check http code (148ms), state unknown -> up, availability 
100.00%
hce_notify_done: 10.0.0.123 (tcp_read_buf: check succeeded)
host 10.0.0.123, check http code (149ms), state unknown -> up, availability 
100.00%
hce_notify_done: 10.0.0.121 (tcp_read_buf: check succeeded)
host 10.0.0.121, check http code (150ms), state unknown -> up, availability 
100.00%
pfe_dispatch_imsg: state 1 for host 5 10.0.0.125
pfe_dispatch_imsg: state 1 for host 8 10.0.0.122
pfe_dispatch_imsg: state 1 for host 6 10.0.0.124
pfe_dispatch_imsg: state 1 for host 7 10.0.0.123
pfe_dispatch_imsg: state 1 for host 9 10.0.0.121
sync_table: table www: 5 added, 0 deleted, 0 changed
pfe_sync: enabling ruleset
sync_ruleset: rule added
sync_ruleset: rule added
sync_ruleset: rule added
hce_notify_done: 10.0.0.124 (tcp_read_buf: check succeeded)
hce_notify_done: 10.0.0.121 (tcp_read_buf: check succeeded)
hce_notify_done: 10.0.0.123 (tcp_read_buf: check succeeded)
hce_notify_done: 10.0.0.122 (tcp_read_buf: check succeeded)
hce_notify_done: 10.0.0.125 (tcp_read_buf: check succeeded)

============================================================================================

Using hoststated on OpenBSD 4.2, there it generally works, www
loadbalancing, and https acceleration.
But here I have another little problem. When I change the "sessid"
to "wosid", in the protocol definition, then hoststated refuses to start,
below below shown reason.

ext_addr="10.0.0.21"
ogo1="10.0.0.121"
ogo2="10.0.0.122"
ogo3="10.0.0.123"
ogo4="10.0.0.124"
ogo5="10.0.0.125"

timeout 9999
log all

table webhosts {
                check http "/" code 200
                real port 80
                host $ogo1
                host $ogo2
                host $ogo3
                host $ogo4
                host $ogo5
        }

protocol http_ssl {
                   protocol http
                   header append "$REMOTE_ADDR" to "X-Forwarded-For"
                   header append "$SERVER_ADDR:$SERVER_PORT" 
to "X-Forwarded-By"
                   header change "Keep-Alive" to "$TIMEOUT"
#               cookie hash ogo-webui-1.1
#                   query hash "wosid"
#               url log "sessid"
                url hash "sessid"
           }

           relay sslaccel {
                   listen on $ext_addr port 443 ssl
                   protocol http_ssl
                   table webhosts hash
           }

        service www {
                virtual host $ext_addr port 80
                sticky-address
                table webhosts
}

The construct seems to work well with the service www. The sessions are
stuck to the same instance because of the sticky-address. However, in my
testsetup it seems, that all clients from the same host are redirected to
the same instance. My testsetup were only two different browsers on the same
host, so I might have the wrong conclusion. Therefore I thought, I could
make the protocol definition used for the relay sslacces consider the value
of wosid to calculate the host to which it gets redirected. As it seems, I
can change the value of cookie hash to anything I want, without getting an
error, but I do not want to use cookies. So I changed the url hash "sessid"
to url hash "wosid", but then the following error occurs on hoststated
startup:

hoststated -d -v -f /etc/hoststated.conf
/etc/hoststated.conf:41: protocol node wosid defined twice
/etc/hoststated.conf:44: syntax error
/etc/hoststated.conf:48: no such protocol: http_ssl
/etc/hoststated.conf:49: table webhosts defined twice

Also, I cannot specify both url log "sessid", and url hash "sessid", then
the same error as above shows up. With relayd, I can specify both, and also
name the value wosid, without getting this error, but there I run into the
problem mentioned in the beginning of the mail.

So, long story, some shorter questions:

Is the problem I see with relayd, the same as in the thread I mentioned
above, or have I done sth. else wrong?
How can I make hoststated protocol consider the value of wosid to calculate
the host to redirect to?

cheers
Sebastian

Reply via email to