miércoles, 29 de agosto de 2007

¿Problemas de red en Linux?

En las últimas distribuciones de Linux es cada vez más frecuente encontrarse con problemas a la hora de conseguir que la red funcione. Además se trata de problemas un tanto atípicos, como que "la red me funciona en casa pero no en el trabajo" o "puedo ver páginas de Google pero no de Barrapunto".

Los problemas se presentan en distribuciones que utilizan la versión 2.6.17 o posteriores del kernel Linux. El origen del problema es ya antiguo, pero no ha empezado a manifestarse hasta que las distribuciones recientes han empezado a incluir los kernels con modificaciones en el manejo de la pila TCP.

En algunos casos, los usuarios optan por mantener sus equipos con versiones no actualizadas del kernel, cosa que si bien permite salir del paso presenta muchos inconvenientes. Afortunadamente con esta ayuda espero que los problemas puedan ser subsanados (como ocurrió en mi caso).

El origen del problema hay que buscarlo en el manejo de los paquetes TCP, en particular en el concepto de TCP window scaling. Se trata de una optimización orientada a mejorar el rendimiento en la transferencia de grandes volúmenes de datos (videos online, descarga de imágenes .iso, redes p2p), pero que desgraciadamente algunos fabricantes de hardware no implementan correctamente, a pesar de estar reflejado en el documento RFC1323 (TCP Extensions for High Performance), que data del año 1992.

Una forma de evitar el problema es deshabilitar estas extensiones de alto rendimiento y seguir funcionando tal y como se hacía hasta la versión anterior. Basta con modificar el fichero (como usuario root) que contiene el valor de la ventana. El nombre de este fichero varía según distribuciones (tcp_window_scaling, tcp_default_win_scale). Ejemplo:

Fedora core / Red Hat:

su -
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

Debian / Ubuntu:
sudo bash
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

Para hacer los cambios permanentes de manera que en el siguiente arranque la red siga funcionando sin problemas , añadimos la línea:
net.ipv4.tcp_window_scaling = 0


al fichero /etc/sysctl.conf

La solución óptima sería poder aprovechar unas optimizaciones que fueron pensadas hace 15 años, pero como han sido ignoradas por algunos fabricantes, la solución más sencilla para el usuario final es renunciar a dichas optimizaciones.

3 comentarios:

Ludwig dijo...

Muchas gracias.
Lo probaré en mi Ubuntu.

Anónimo dijo...

Con mi portátil (Dell, Ubuntu 7.04) podía navegar por la red interna de mi empresa, pero no me funcionaba la red para atravesar el firewall / NAT. He hecho lo que indicas y ahora mi red funciona sin ningún problema.

pingvino dijo...

Se puede evitar hacer el "sudo" antes y tener que hacerlo interactivamente.

sudo sh -c "echo 0 | sudo tee /proc/sys/net/ipv4/tcp_window_scaling"

Las comillas son necesarias para que la redirección se realice como root. Como es un poco pesado, aunque no es exactamente lo mismo se puede conseguir algo parecido con:

echo 0 | sudo tee /proc/sys/net/ipv4/tcp_window_scaling

El inconveniente? Que te saca un cero. No parece tan grave ;)