IPtables y el MTU

Un problema que podemos encontrarnos al configurar un gateway para realizar source NAT es que, como resultado del proceso, el tamaño de los paquetes salientes superen los 1500 bytes, que es el valor establecido de MTU para Ethernet.
Nota: No debemos confundir MSS con MTU. El primero indica el tamaño máximo para el campo de datos de cada datagrama mientras que el segundo es el valor de todo el datagrama (incluyendo las cabeceras TCP e IP). Como las cabeceras TCP e IP generalmente no superan los 20 bytes cada una, un valor de MSS típico es el valor máximo de MTU menos 40 bytes (que podrían tener las cabeceras) esto es 1500 – 40 = 1460.
Cuando nuestro gateway envía paquetes de un tamaño superior genera problemas de navegación y acceso a servicios web en los hosts de la red ya que es posible que algún router por el cual pasa cada paquete los descarte. El resultado de esto es muy aleatorio: se puede navegar en algunas páginas y en otras no, cuando se acceden a servicios de escritorio remoto (RDP) o secuestro de sesión (VNC) no se visualizan los refrescos de pantalla, no conectan algunas cuentas de mensajeros y otras si lo hacen, etc.
Una de las opciones es cambiar a mano en cada host de la red el tamaño del MTU. Esto podemos hacerlo tocando el registro o con algún programa como DRTCP (ver este post). Pero en redes con muchos hosts quizás sea mejor hacerlo de manera centralizada y para quienes utilizamos gateways GNU/Linux y firewalls perimetrales con IPTables tenemos a nuestra disposición el destino TCPMSS.
El destino TCPMSS puede ser utilizado para cambiar el valor MSS de los paquetes TCP SYN que ve el firewall. Solo será necesario cambiar el MSS en el paquete SYN ya que el host se encarga del tamaño luego del establecimiento de la conexión. El destino TCPMSS puede tomar dos opciones:
--set-mss XXXX
Con éste argumento se especifica el valor deseado de cada paquete TCP SYN saliente. Un ejemplo de utilización:
# iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --set-mss 1460
La otra forma setea automáticamente el MSS al valor más adecuado con la opción:
--clamp-mss-to-pmtu
Como verán en esta opción no es necesario especificar el tamaño deseado ya que el sistema intentará mediante el descubrimiento PMTU (Path Maximum Transfer Unit) encontrar el valor indicado. Un ejemplo de utilización:
# iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu
Queda a vuestro criterio en que sección de un script de firewalling llamar a una de estas opciones.

January 28th, 2010 at 4:17 pm
muy bien explicado.