tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Question about tcp ephemeral ports
On Mon, Jan 30, 2012 at 03:39:50PM +0100, Olivier MATZ wrote:
>
> /*
> * Create two tcp servers. Try to connect many clients to the first
> * server. Once the maximum number of ephemeral ports is reached, it
> * should fail. Then try to connect the other server which is bound to
> * another port. Linux and NetBSD have a different behaviour.
...
> The last line shows that on Linux, the application is allowed to do the
> connect() if the destination port is different. On NetBSD, the connect()
> will fail as soon as the maximum number of ephemeral ports is reached.
...
> I would like to have some expert opinions about this behaviour. Is there
> a workaround? Is there a need to patch the kernel? I would answer yes
> because I don't see any obvious way to have more than several thousands
> of TCP clients with one source address. Also, I wonder if this behaviour
> could be used to do a deny of service and prevent other applications to
> do their connect().
The code that actually picks the ephemeral port to use is in netinet/rfc6056.c.
At first glance, it looks like it *should* allow your code to work: regardless
of the algorithm used to cycle through the port numbers, the
check_suitable_port() function uses the address to verify that the port is
available.
If you can build a kernel with options RFC6056_DEBUG, and try your test again
it should emit enough info to figure out what's going on.
This looks like it would be more than just a "patch". You'd need to rewrite
the ephemeral port selection code in netinet/rfc6056.c, which currently
doesn't looks like it considers the source address at all.
eric
Home |
Main Index |
Thread Index |
Old Index