BIND 9.3.5-P1 random UDP src ports: some DNS responses delivered to wrong process
Mark Andrews
Mark_Andrews at isc.org
Thu Jul 10 23:13:10 UTC 2008
> After upgrading to BIND 9.3.5-P1, I'm seeing some DNS responses
> arriving at my host being misdirected to other processes (not named)
> running on my host.
>
> It appears to be because when named needs to send a query and chooses
> a random UDP source port,
> it's able to bind() that port even though the port's already in-use.
>
> --
>
> My platform is Solaris 10 on SPARC.
>
> I have a RADIUS server already bound to IPv4 INADDR_ANY UDP port 1812,
> specifying SO_REUSEADDR.
>
> named is running without specifying any 'listen-on' or 'query-source
> address'.
> I see that when it sends a query and chooses a random UDP source port
> 'x'
> it binds the socket (which is waiting for the DNS response) to IPv4
> INADDR_ANY UDP port 'x',
> specifying SO_REUSEADDR.
>
> Sometimes 'x' happens to be 1812.
> Solaris 10 allows this second bind() to IPv4 INADDR_ANY UDP port 1812
> to succeed;
> I assume that's because of the SO_REUSEADDR.
>
> When the DNS response to the query arrives, Solaris may deliver it
> to the RADIUS server; I can confirm that because my RADIUS server
> logs these packets as malformed in various ways.
>
> (I imagine that the converse may also be true; that some of the
> packets sent by RADIUS clients to
> the RADIUS server may instead be delivered to named, but am not
> running named at a high enough
logging level to confirm that.)
>
> For a long-running UDP-based server running on a fixed UDP port,
> I see I can work around this using named's new 'avoid-v4-udp-ports'
> option.
> But I imagine that won't solve the problem in general; there may
> be other UDP servers (say RPC-based servers) that pick ephemeral UDP
> ports each time they start;
> I can't specify those ports in named's 'avoid-v4-udp-ports' option.
>
> Have I missed something here?
> (Is it right for BIND to specify SO_REUSEADDR when it binds a socket
> it will use for a UDP query with a random UDP source port?)
You will have the problem even without SO_REUSEADDR.
<explict-address>.<port> and <0.0.0.0.>.<port> don't collide.
Named doesn't just call bind(0.0.0.0#0) as many systems
don't do good random port selection. Lots of systems are
sequential. Linux keeps handing out the same port as long
as it is not in use then sequentially increments it.
If you can, give named its own address.
Explicitly binding the query source will help in some, but
not all cases. If you are running named on a NAT I would
bind to the internal address and have all the queries go
through the NAT process. Note this depends on how NAT is
implemented.
Very few applications use UDP ports as fast as named now
does and kernels really are not tuned to handle it.
For what it is worth named has code do deal with responses
to queries that are made on a 0.0.0.0#53 but arrive of a
socket listening for queries. The kernel does not have
enough information to deliver the UDP message to the right
socket.
This can all be avoided if everyone signs their zones.
http://www.isc.org/sw/bind/docs/DNSSEC_in_6_minutes.pdf
This could also have beeen avoided if everyone implemented
BCP38 to the best of their abilities.
Mark
--
Mark Andrews, ISC
1 Seymour St., Dundas Valley, NSW 2117, Australia
PHONE: +61 2 9871 4742 INTERNET: Mark_Andrews at isc.org
More information about the bind-users
mailing list