On 10/24/2013 4:40 PM, [email protected] wrote:
Sorry, I should mention only drop packets in state "NEW", you don't
want to drop replies to your own queries.
On Thu, Oct 24, 2013 at 3:39 PM, [email protected]
<mailto:[email protected]> <[email protected]
<mailto:[email protected]>> wrote:
Your case should be easy to stop with a firewall rule. Just block
all packets matching the dns listen port (53 usually) in the INPUT
chain, where the source address is outside your block.
Optionally (this prevents reflection attacks against your own
network which you said is not required), configure your router to
drop packets arriving on its external interface where the source
IP is within your internal network. This is called a reverse
route check.
On Thu, Oct 24, 2013 at 12:11 PM, Brian Rak <[email protected]
<mailto:[email protected]>> wrote:
On 10/24/2013 1:00 PM, Simon Kelley wrote:
On 24/10/13 17:46, Brian Rak wrote:
On 10/24/2013 12:28 PM, Simon Kelley wrote:
On 24/10/13 17:03, Brian Rak wrote:
We've recently undertaken a project to clean
up our network, and lock
down all the open DNS resolvers. As you may
know, these are very
frequently used for DDOS attacks:
http://openresolverproject.org/ ,
http://www.team-cymru.org/Services/Resolvers/ .
I haven't been able to find any sort of
configuration option that would
prevent DNSMasq from being abused like this,
and I've had to resort to
iptables rules instead. Is there a
configuration option that that would
disable responding to DNS queries from certain
interfaces? The other
option that seems handy would be one to only
reply to DNS queries from
hosts that have a configured DHCP lease.
Are there any features of DNSMasq that would
prevent it from being
abused to conduct attacks?
This is an important topic, and quite difficult to
understand, so I'm
going to take this opportunity to try and put a
definitive statement
on the record.
First the simple stuff.
Dnsmasq has --interface --except-interface and
--listen-address
configuration options that disable response to DNS
queries from
certain interfaces. The first thing that has to be
done is to use
these. Mostly it's the only thing that needs to done.
Now, the complicated stuff.
Under certain circumstances,
--interface=<interface> degrades to mean
the same as --listen-address=<address on
interface>. For instance if
eth0 has address 192.168.0.1 and dnsmasq is
configured with
--interface=eth0, then dnsmasq will reply to any
query which is sent
to 192.168.0.1, no matter what interface it
actually arrives at. The
circumstance under which happens is when the
--bind-interfaces flag is
used.
Now, in the above example, this isn't a problem,
since a botnet can't
direct traffic to an RFC-1918 address. If, on the
other hand, the
address of an internal interface (ie one
configured to accept DNS
queries) is globally routable, then queries which
arrive via another
interface (ie one linked to the internet) with the
destination address
of the internal interface _will_ be replied to,
and a DNS reflection
attack is possible.
This has mainly been seen in libvirt and OpenStack
installations which
use dnsmasq, since sometimes they are provisioned
with "real"
addresses. I'd expect to see problems in the
future with IPv6, since
far more people will be using globally routable
addresses with IPv6.
The reason that this happens is that
--bind-interfaces uses the
bare-minimum BSD sockets API only. Detecting which
interface a packet
arrived on, rather than the address to which it
was sent, needs
non-portable API, and is impossible on some
platforms (openBSD, for
instance) --bind-interfaces is a "works
everywhere" least common
denominator. It's also useful when you're running
multiple instances
of dnsmasq on one host, which is why most people
use it.
The fix is to use either the default listening
mode, or if running
multiple instances, the new --bind-dynamic mode.
--bind-dynamic is
only available on Linux, and --bind-interfaces is
the only mode
available on openBSD, so BSD users have rather
more problems here.
Summary. There's a problem is you want to accept
queries in an
internal interface with a globally routable
address and use
--bind-interfaces. The fix is to remove
--bind-interfaces and, if
necessary, replace it with --bind-dynamic. This
fix is not applicable
on all platforms,
The Real Soon Now 2.67 release logs a very
prominent warning if the
dangerous combination is configured.
Cheers,
Simon.
Thanks for the detailed explanation! It seems that for
some of my
servers I can resolve the issue by using --interface and
--except-interface.
I do however have some DNSMasq instances that are
providing public,
globally routable IP addresses via DHCP. In order to
do this, DNSMasq
must be listening on an interface with a public IP, so
it ends up
providing DNS on that IP as well. I'm not sure if this
is a common use
case or not. For this setup, would there be any other
option aside from
iptables rules?
Yes, use --interface to enable that interface for DNS and
DHCP, and DON'T use --bind-interfaces. As long as you're
not using bind interfaces, DNS requests which arrive via
other interfaces won't be answered, even if they have
destination addresses for the enabled interface.
An example:
You have a router with two interfaces, internal and
external. Internal is where you're doing DHCP and DNS:
it's connected to an ethernet with a load of hosts.
Internal has a globally routable address (and so,
presumably do the hosts on the ethernet). External also
has a globally routeable address and is connected to
internet. Attack packets therefore arrive on external.
Setting --interface=internal means that attack packets
which arrive via external will NOT be answered, ever. The
exception to this if they are addressed to the IP address
of internal AND --bind-interfaces is set.
So, don't use --bind-interfaces. If you're on Linux, you
can use --bind-dynamic instead if you're running multiple
dnsmasq instances.
Cheers,
Simon.
Ah, but that's the problem. The machines I'm referring to
only have one interface. So, I'm primarily running this on
virtual machine hosts. They have one connection to the
internet, and no internal network.
So, for example we have a virtual machine host running with
eth0 being 198.51.100.10. DNSMasq is configured to listen on
eth0 and provide 198.51.100.11-198.51.100.15 for any virtual
machines that start up (virtual machines are recognized by
preconfigured static leases, all other DHCP requests are
ignored). The virtual machines are all bridged to the eth0
interface, and have no other connectivity.
I should also note that my primary concern is preventing my
machines from being abused to attack other people's machines.
Cases where someone would abuse my DNS server to attack my
own machines are not currently a concern (as they're
significantly easier to block).
Yep, currently we just block all incoming DNS unless it's from the
upstream resolvers or any of the configured DHCP ranges. We try to
avoid state tracking whenever possible, because it's really easy to fill
up the state tables on big web servers.
I was hoping there was a DNSMasq option that would address this issue,
just as an added layer. It's very easy for iptables rules to get
removed or disabled, but it's less likely that someone would unknowingly
remove a configuration option.
A configuration option to only respond to DNS from hosts with a valid
DHCP lease would help with my setup, but I'm not sure how common my
configuration is.
_______________________________________________
Dnsmasq-discuss mailing list
[email protected]
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss