Tengo un servidor de nombres que es de acceso público ya que es el servidor de nombres autorizado para un par de dominios .
Actualmente, el servidor está inundado de ANY
solicitudes de tipo falsas para isc.org, ripe.net y similares (es un ataque DoS distribuido conocido ).
El servidor ejecuta BIND y se ha allow-recursion
configurado en mi LAN para que estas solicitudes sean rechazadas. En tales casos, el servidor responde solo con authority
y additional
secciones que hacen referencia a los servidores raíz.
¿Puedo configurar BIND para que ignore por completo estas solicitudes, sin enviar una respuesta?
fuente
iptables -t raw -S PREROUTING
. Salida:,-P PREROUTING ACCEPT
seguido de-A PREROUTING -i eth0 -p udp -m udp --dport 53 -m string --hex-string "|01000001000000000000|" --algo kmp --from 30 --to 65535 -j DROP
. Probé que funciona correctamente conhost -ar exampledomain.com dns-server.example.net
. Por supuesto, no funcionó correctamente hasta que agregué la-r
opción.-r
opción hace la diferencia. Personalmente, no me gusta que lashost
consultas simples ya no funcionen y esto puede ser muy confuso. Sin embargo, esta es probablemente una respuesta válida (la mejor hasta ahora) y le daré la recompensa, ya que está a punto de caducar, incluso si continuaré usando mi propio enfoque filtrando OUTPUT.Lo intentaré:
La zona de "redireccionamiento" controla las respuestas que remiten a los clientes a los servidores raíz. Esto debería decirle que no responda a esos.
Eso se insinúa en los documentos de Bind9: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2592674
Puede reemplazar
"none"
con su subred local.Si ya tiene una
zone "."
declaración, simplemente agréguelaallow-query "none";
.fuente
zone "." { type hint; file "/etc/bind/db.root"; };
declaración con db.root que enumera los servidores raíz. La eliminación de esa declaración detiene las respuestas para dominios extranjeros, pero el servidor responde con una "falla del servidor" y, por lo tanto, todavía se puede usar para DoS.allow-query "none";
a lazone "."
configuración?En general, sugeriría:
Active los registros de enlace y registre ips que reciban la respuesta rechazada. Instale el programa fail2ban, agregue la acción de agujero negro : http://pastebin.com/k4BxrAeG (ponga la regla en el archivo en /etc/fail2ban/actions.d)
Cree un archivo de filtro de enlace en /etc/fail2ban/filter.d con algo como esto (¡necesita depuración!)
Edite fail2ban.conf, agregue la sección:
Espero que esto ayude!
fuente
La idea básica permite vincular clasifica la respuesta DNS como rechazada y luego usa iptables para convertir la respuesta rechazada en silenciosa ignorada.
Rechazar es la parte fácil en la sección de opciones named.conf:
O, por supuesto, sus ACL favoritas para excepciones locales ...
Siguiente magia loca de iptables, ajusta o elimina "-o eth0" según sea necesario. Este comando asume el encabezado de capa IPv4 estándar de 20 bytes antes de UDP.
Estas teclas en el campo de banderas de respuesta DNS con los siguientes bits establecidos
Mensaje de registro notado que se ejecuta en enlace en la depuración "error al enviar respuesta: host inaccesible" cuando la regla coincide para tener algún comentario para la prueba.
Debo admitir que todo esto es un ejercicio algo inútil. Si no hay amplificación, un atacante podría reflejar fácilmente TCP SYN. En última instancia, el DNS está roto, simplemente no hay una solución viable que no sea el uso de TCP o la implementación de las cookies DNS de Eastlake.
fuente
¿Has intentado bloquear la cadena isc.org o bloquear la cadena hexadecimal?
Esto funcionó para mí:
fuente
iptables -A OUTPUT -p udp -m string -hex-string "|726f6f742d73657276657273|" –algo bm –to 65535 -j DROP
pero realmente preferiría una solución que se base solo en la configuración BIND, si es que es posible.'bnrexex.www.sf97.net/A/IN' 'whzpkacpxpiuycm.www.tpa.net.cn/A/IN'
Este ataque se llama Denegación de servicio amplificada. Debe configurar el enlace correctamente, pero ese tráfico no debería llegar a su enlace en primer lugar. Bloquéelo en el primer dispositivo de red que sea capaz de hacerlo en su red. Tuve el mismo problema y lo solucioné con la regla de inhalación sorda:
fuente
Primero, sé que esta es una vieja pregunta pero ...
He estado ejecutando mi propio servidor DNS autorizado, no recursivo, durante décadas, pero nunca he sido víctima de ningún ataque DDoS basado en DNS, hasta ahora, cuando me cambié a un nuevo ISP. Miles de consultas falsas de DNS inundaron mis registros y me molesté mucho, no tanto por el impacto en mi servidor, sino por el hecho de que saturaba mis registros y la incómoda sensación de abuso. Parece que el atacante intenta usar mi DNS en un " ataque autorizado del servidor de nombres ".
Entonces pensé que, aunque limito las consultas recursivas a mi red interna (negando todas las demás), prefiero pasar mis ciclos de CPU en la coincidencia de cadenas en iptables que enviar respuestas negativas a las direcciones IP falsificadas (menos desorden en mis registros, menos tráfico de red y un mayor nivel de satisfacción propio).
Comencé haciendo lo que todos los demás parecen hacer , averiguar qué nombres de dominio se consultan y crear una coincidencia de cadena en ese dominio con un DROP de destino. Pero pronto me di cuenta de que terminaría con una gran cantidad de reglas, cada una de las cuales consumía ciclos de CPU. ¿Entonces lo que hay que hacer? Como no ejecuto un servidor de nombres recursivo, pensé que podría hacer la coincidencia en las zonas reales para las que tengo autoridad y descartar todo lo demás.
Mi política predeterminada en iptables es ACEPTAR, si su política es DROP, probablemente necesite hacer algunos ajustes si desea utilizar la siguiente solución.
Mantengo mi configuración de zona en un archivo separado (/etc/bind/named.conf.local), usemos esto como ejemplo:
Tenga en cuenta el comentario "// Privado" en mis dos primeras zonas, hago uso de esto en el siguiente script para excluirlos de la lista de zonas válidas.
Ejecute el script anterior con el archivo de configuración de zona como argumento.
Guarde el resultado en un script, canalícelo a un shell o cópielo y péguelo en su terminal para crear la nueva cadena y comenzar a filtrar todas las consultas DNS no válidas.
ejecute / sbin / iptables -L DNSvalidate -nvx para ver los contadores de paquetes (y bytes) en cada regla de la nueva cadena (es posible que desee mover la zona con la mayoría de los paquetes al principio de la lista para que sea más eficiente).
Con la esperanza de que alguien pueda encontrar esto útil :)
fuente