Tengo un nodo en nuestro clúster que recibe muchos mensajes "nf_conntrack: tabla llena, paquete descartado" en el syslog. Revisé nf_conntrack_count y se estaba ejecutando directamente con nf_conntrack_max. Al mirar la tabla, vi que la mayoría de las entradas eran solicitudes de DNS, así que agregué estas reglas a la tabla de netfilter "sin procesar".
$ sudo iptables -t raw -vnL
Chain PREROUTING (policy ACCEPT 146M packets, 19G bytes)
pkts bytes target prot opt in out source destination
33M 4144M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
33M 2805M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
Chain OUTPUT (policy ACCEPT 73M packets, 8311M bytes)
pkts bytes target prot opt in out source destination
10785 882K CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
0 0 CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
Eso dejó el recuento rondando los 13000 aproximadamente, y nf_conntrack_max está configurado en 65535. Sin embargo, sigo recibiendo los mensajes de paquetes descartados. La mayoría del resto de los paquetes son UDP, y configuré nf_conntrack_udp_timeout en tan solo 1 segundo, dejando nf_conntrack_count alrededor de 1000. Sin embargo, todavía recibo el mensaje empaquetado descartado.
A partir de aquí, si elevo el máximo, se detendrán los mensajes de paquetes descartados, sin embargo, no veo por qué es necesario.
Estoy ejecutando Docker y hay un contenedor de elasticsearch (este problema parece ocurrir en cualquier nodo que esté ejecutando elasticsearch). No estoy seguro si es relevante, pero el nodo tiene 48 núcleos.
$ uname -a
Linux qtausc-pphd0128 3.19.0-26-generic #28~14.04.1-Ubuntu SMP Wed Aug 12 14:09:17 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Entonces, ¿por qué descarta paquetes cuando el recuento es mucho menor que el máximo?
Respuesta1
Tuve el mismo problema hace un tiempo en un sistema Squid.
Una de las formas más efectivas que encontré para reducir el tamaño de conntrack fue reducir el tiempo de espera de TCP predeterminado en el kernel.
Está net.netfilter.nf_conntrack_tcp_timeout_established
configurado en 432000 de forma predeterminada. Así es... son 5 días.
Para establecer el valor, puede emitir el siguiente comando;
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=X
Y si desea que ese cambio sea persistente, debe agregar la línea a /etc/sysctl.conf
.
Después de reducir ese valor a 600, el recuento de conexiones disminuyó constantemente durante un par de días.
Utilicé sysctl net.netfilter.nf_conntrack_max
y sysctl net.netfilter.nf_conntrack_count
para obtener los valores.