Para proporcionar resolución de nombres a las máquinas de mi centro utilizo el balanceador de carga dnsdist que se encarga de distribuir las peticiones a powerdns server o a powerdns recursor, según corresponda.
En la configuración heredada de DebianEdu venimos usando desde hace años powerdns con el backpend ldap.
Pues bien. Observando los logs, me di cuenta de que había una serie de errores que se reproducían con frecuencia:
oct 30 22:40:30 infra01 pdns_server[142872]: [LdapBackend] Failed to get next result: No connection to LDAP server
oct 30 22:40:30 infra01 pdns_server[142872]: [LdapBackend] Failed to get next result: No connection to LDAP server
oct 30 22:40:30 infra01 pdns_server[142872]: Backend reported permanent error which prevented lookup (Get next result impossible), aborting
oct 30 22:40:30 infra01 pdns_server[142872]: Backend error (retry once): Get next result impossible
Y como no me gusta ver errores en los logs, comencé a investigar el tema revisando configuraciones y realizando algunas pruebas, llegando a la conclusión de que la causa principal de los errores en PowerDNS era el olcIdleTimeout:
- El servidor OpenLDAP tiene definido un olcIdleTimeout: 30 segundos activo en la configuración global (cn=config).
- Eso significa que cualquier conexión LDAP inactiva por más de 30 segundos se cierra automáticamente.
- PowerDNS, cuando usa ese backend LDAP, no tolera que la conexión se cierre mientras está leyendo resultados.
Ante ésto caben dos posibilidades:
- Eliminar olcIdleTimeout
- Aumentar en gran medida el valor de olcIdleTimeout
Primera alternativa: Eliminar olcIdleTimeout
Creamos un archivo remove-idle.ldif:
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcIdleTimeout
Lo aplicamos ejecutando el comando:
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f remove-idle.ldif
Segunda alternativa: Aumentar en gran medida el valor de olcIdleTimeout
Si prefieres no eliminarlo del todo, puedes poner un valor muy alto (por ejemplo 28800s, es decir, 8 horas) creando un fichero set-idle.ldif:
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcIdleTimeout
olcIdleTimeout: 3600
Y aplicarlo:
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f set-idle.ldif
Una vez aplicada la alternativa que más os guste, reiniciad los servicios y listo:
sudo systemctl restart slapd
sudo systemctl restart pdns
Recomendación final
Mantén TCP keepalive activo en el sistema:
sudo sysctl -w net.ipv4.tcp_keepalive_time=60
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30
sudo sysctl -w net.ipv4.tcp_keepalive_probes=5
Añade estas líneas a /etc/sysctl.conf para persistencia:
grep -q 'net.ipv4.tcp_keepalive' /etc/sysctl.conf || cat <<EOT >> /etc/sysctl.conf
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=5
EOT
Be the first to comment