A partir de la versión 9.9 de Bind, está disponible una funcionalidad que permite mitigar ataques de denegación de servicio al DNS mediante ratelimit. Básicamente lo que permite es limitar el número de queries por cliente a partir de una serie de criterios.
Para poder utilizar rate-limit es necesario compilar manualmente las fuentes de Bind, normalmente las versiones precompiladas no son del tipo «Extended Support» por lo que no tendremos la posibilidad de hacer uso de esta característica.
Actualmente la versión estable es la 9.9.8-P2, no obstante echad un vistazo al sitio web de ISC para descargar siempre la última.
A la hora de compilar, debemos tener en cuenta el parámetro --enable-rrl
para habilitar la funcionalidad de rate-limit:
--enable-rrl use DNS Response Rate Limiting
Este sería un ejemplo válido de compilación:
# wget https://www.isc.org/downloads/file/bind-9-9-8-p2/?version=tar-gz # tar -xzvf bind-9.9.8-G2.tar.gz # cd bind-9.9.8-P2 # ./configure --prefix=/dns --enable-threads --with-libtool \ --with-openssl=/usr/ssl --enable-rrl --enable-fetchlimit \ --with-openssl=/usr --localstatedir=/dns/var/state # make # make install
Una vez compilado y arrancado, vemos que tenemos la versión con soporte extendido:
# /dns/sbin/named -V BIND 9.9.8-P2 (Extended Support Version) built by make with '--prefix=/dns' '--enable-threads' '--with-libtool' '--with-openssl=/usr/ssl' '--enable-rrl' '--enable-fetchlimit' '--with-openssl=/usr' '--localstatedir=/dns/var/state' compiled by GCC 4.8.3 20140911 (Red Hat 4.8.3-9) compiled with OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013 linked to OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
Una configuración básica de rate-limit, la añadimos dentro del bloque «options» o de una vista «view» del archivo de configuración named.conf
rate-limit { responses-per-second 15; log-only yes; };
Se puede jugar con los siguientes parámetros:
rate-limit { [ domain domain-name ; ] [ responses-per-second [size number] [ratio fixedpoint] number ; ] [ referrals-per-second number ; ] [ nodata-per-second number ; ] [ nxdomains-per-second number ; ] [ errors-per-second number ; ] [ all-per-second number ; ] [ window number ; ] [ log-only yes_or_no ; ] [ qps-scale number ; ] [ ipv4-prefix-length number ; ] [ ipv6-prefix-length number ; ] [ slip number ; ] [ exempt-clients { address_match_list } ; ] [ max-table-size number ; ] [ min-table-size number ; ] };
Gracias por el consejo!