nf_conntrack: table full, dropping packet

20 marzo 2013 at 22:52 by Adrián Pérez

NetworkingEsta semana me he encontrado con un servidor CentOS con varios mensajes de error como el que sigue, en su fichero de logs messages:

Mar 14 18:55:48 localhost kernel: nf_conntrack: table full, dropping packet.

Ya había visto antes este error, que se solucionaría de forma radical, reiniciando el server, pero por suerte un compañero ya había hecho algo de investigación sobre este mismo problema.

Para empezar, ¿a qué se refiere este problema? Aquí lo explican bastante bien. El Connection Tracking le permite al kernel mantener un seguimiento de todas las conexiones (o sesiones) abiertas con el servidor, y poder así relacionar los paquetes con su correspondiente conexión. Así, Connection Tracking puede entender que dos o más conexiones distintas están "relacionadas". Por ejemplo, cuando se abre una sesión FTP, primero se abre una conexión contra el puerto 21 para iniciar la sesión FTP, y después se abre otra conexión contra el 20 o contra un puerto aleatorio en función de como tengamos configurado el servidor FTP. En cualquier caso, el Connection Tracking se encargaría de marcar ambas conexiones como relacionadas (RELATED).

Bien, para poder trabajar, el Connection Tracking tiene reservado un espacio en RAM, que usa para gestionar las conexiones. Podemos ver este valor con la siguiente instrucción (por defecto 65535 para sistemas con más de 1GB de RAM):

cat /proc/sys/net/netfilter/nf_conntrack_max
65535

Sinceramente no he sido capaz de confirmar si este número corresponde a un contador o corresponde con el tamaño en bytes, del espacio reservado en RAM.

En cualquier caso, el problema, es que según el número de conexiones que esté gestionando la máquina de forma concurrente (que podemos ver con "netstat -nat | wc -l"), el Connection Tracking necesitará gestionar más o menos conexiones, y llegado al máximo de su capacidad (definido, como hemos visto, en /proc/sys/net/netfilter/nf_conntrack_max) no aceptará más conexiones.

[root@MyServer]# netstat -nat | wc -l
17754

Podemos ver el número que está gestionando el conntrack en este mismo instante, consultando el siguiente parámetro:

[root@MyServer]# cat /proc/sys/net/netfilter/nf_conntrack_count

Cálculo del nf_conntrack_max

Así pues, hemos de intentar asegurarnos de que los parámetros que tenemos para el Connection Tracking son los óptimos. Para ello, podemos usar la siguiente fórmula, sacada de aquí:

CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32)

donde x será 64 o 32 según la arquitectura del servidor. De esta forma, mi interpretación es que el paréntesis quedará (64/32 = 2) o (32/32 =1) según el caso.

Por ejemplo, para saber el número de bytes, podemos ejecutar lo siguiente:

cat /proc/meminfo
MemTotal:       49521980 kB

Así, con 48GB d RAM (49521980 kB), sobre una arquitectura de x64 (ésto lo podemos ver con el comando "uname -m") la fórmula quedaría así:

CONNTRACK_MAX =  (49521980 x 1024) / 16384 / (64 / 32) = 1547561,875 => 1547561

Modificar nf_conntrack_max

De esta manera podemos adaptar este parámetro a nuestro server. Podemos modificar este  valor "en vivo", símplemente ejecutando:

[root@MyServer]# echo 1048576 > /proc/sys/net/netfilter/nf_conntrack_max

Sin embargo, para que los cambios sean persistentes, deberemos añadir la siguiente línea en el /etc/sysctl.conf:

[root@MyServer]# vi /etc/sysctl.conf
net.netfilter.nf_conntrack_max=1048576

Otros parámetros

Además de este parámetro, hay otros relacionados que nos podrían interesar, para mejorar el rendimiento general de la gestión de las conexiones:

  • /proc/sys/net/netfilter/nf_conntrack_max
  • /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
  • /proc/sys/net/netfilter/nf_conntrack_expect_max
  • /proc/sys/net/core/somaxconn
  • /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait

 

Después de todo ésto, he visto en este artículo de la wikipedia, que actualmente existen las conntrack-tools (instalables desde yum) que permiten gestionar el netfilter connection tracking desde línea de comandos.

Fuentes:
http://wiki.khnet.info/index.php/Conntrack_tuning
http://en.wikipedia.org/wiki/Netfilter#Connection_Tracking
http://ernestogamez.es/nf_conntrack-table-full-dropping-packet-en-centos-6-kernel-2-6-32/
http://pc-freak.net/blog/resolving-nf_conntrack-table-full-dropping-packet-flood-message-in-dmesg-linux-kernel-log/

Flickr!Foto por Brian Smithson (Old Geordie)