realip module broken?
Igor Sysoev
is at rambler-co.ru
Tue Aug 12 19:21:01 MSD 2008
On Tue, Aug 12, 2008 at 04:57:10PM +0200, Spil Games wrote:
> Spil Games wrote:
> > Does this ring a bell for anyone? It seems to me like the realip module
> > is seriously broken (at least in 0.6.32). I had a look at the source
> > code, but cannot come with anything obvious.
>
> I think I figured it out. We run multiple Nginx backends behind a Zeus
> ZXTM loadbalancer. The loadbalancer is configured to use keepalives to
> the backends and thus pipes requests from various source addresses
> through one connection.
>
> When the first request on a new lb->ws connection comes in, Nginx
> matches the source address to the value set through 'set_real_ip_from'.
> Let's assume the request originates from the loadbalancer (obviously :P)
> and that we have set 'set_real_ip_from' appropriately. The realip module
> will patch the following:
>
> sin->sin_addr.s_addr = addr;
> r->connection->addr_text.len = len;
> r->connection->addr_text.data = p;
>
> So the IP address is corrected for this connection. So far, so good.
>
> Now to the second request: Nginx will try to match the source address
> again, but because this is the same (already patched) connection, it
> will not match 'set_real_ip_from' and the address will pass unmodified,
> which is incorrect because this request originates from a different
> client ip address.
>
> I can work around this problem by setting 'set_real_ip_from' to
> '0.0.0.0/0', but I think this is essentially a bug in the module. It
> should not patch the source ip address for the whole (keepalive)
> connection, but only for the current request.
I suspected those are loadbalancer keepalive connections.
I will look how to resolve the issue. Right now you may disable keepalive
on nginx side.
--
Igor Sysoev
http://sysoev.ru/en/
More information about the nginx
mailing list