Aprendí a la mala que docker tiene su propio CHAIN de iptables

Screenshot at 2019-03-18 15-53-23

Dependiendo de la configuración de red docker este tiene sus propios CHAIN de iptables como DOCKER, DOCKER-USER, DOCKER-ISOLATION-STAGE-1, DOCKER-ISOLATION-STAGE-2, etc. Hoy lo aprendí y no por las buenas.

Mi monitoreo me alertó que el container con pihole dejó de responder a las consultas DNS. Al ingresar a la administración de los containers pude ver que el pihole se encontraba “unhealthy”.

Después de revisar la configuración, logs, versión de la imagen y no encontrar nada relevante identifiqué un ataque DNS (si, como lo pasé por alto antes) usando tcpdump. El target era dfafacts.gov y había una oleada de consultas de tipo ANY que no paraban.

Screenshot at 2019-03-18 15-57-24

El hecho de que Pihole sea susceptible a ataques de amplificación DNS tiene que ver con que este trabaja como un OpenDNS, es decir responde consultas DNS por cualquier dominio y en este caso el cliente desea ofrecer el servicio de manera pública.

Según yo ya estaba protegido por un par unas conocidas reglas de iptables que detectan las consultas DNS de tipo ANY con el módulo “recent” y bloquean cuando se viola el “hitcount” especificado:

/sbin/iptables -A INPUT -p udp --dport 53 -m string \
 --from 40 --algo bm --hex-string '|0000FF0001|' -m recent \
 --set --name dnsanyquery ;
/sbin/iptables -A INPUT -p udp --dport 53 -m string \
 --from 40 --algo bm --hex-string '|0000FF0001|' -m recent \
 --name dnsanyquery --rcheck --seconds 60 --hitcount 1 -j DROP ;
/sbin/iptables -A INPUT -p tcp --dport 53 -m string \
 --from 52 --algo bm --hex-string '|0000FF0001|' -m recent \
 --set --name dnsanyquery ;
/sbin/iptables -A INPUT -p tcp --dport 53 -m string \
 --from 52 --algo bm --hex-string '|0000FF0001|' -m recent \
 --name dnsanyquery --rcheck --seconds 60 --hitcount 1 -j DROP ;

 

Lo que no tenía en cuenta es que estas reglas solo se aplicaban a los paquetes que iban destinados al host donde se ejecuta docker y no a los containers. Luego de darme cuenta que el problema no estaba en los parámetros de las reglas, sino en el CHAIN actualicé las reglas:

############ DOCKER CHAIN
/sbin/iptables -A DOCKER -p udp --dport 53 -m string \
 --from 40 --algo bm --hex-string '|0000FF0001|' \ 
 -m recent --set --name dnsanyquery ;
/sbin/iptables -A DOCKER -p udp --dport 53 -m string \
 --from 40 --algo bm --hex-string '|0000FF0001|' \
 -m recent --name dnsanyquery --rcheck --seconds 60 --hitcount 1 -j DROP ;
/sbin/iptables -A DOCKER -p tcp --dport 53 -m string \
 --from 52 --algo bm --hex-string '|0000FF0001|' \
 -m recent --set --name dnsanyquery ;
/sbin/iptables -A DOCKER -p tcp --dport 53 -m string \
 --from 52 --algo bm --hex-string '|0000FF0001|' \ 
 -m recent --name dnsanyquery --rcheck --seconds 60 --hitcount 1 -j DROP ;
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: