En el trabajo han montado un servidor windows para compartir ficheros e impresoras, y como la mayoría de los servidores de este tipo, utiliza el protocolo SMB de Microsoft.
Acceder a estos servicios desde Linux parecía tan sencillo como abrir Lugares->Red y navegar gracias a SAMBA; pero, como de costumbre, las cosas nunca son tan sencillas. En efecto, el firewall que utilizo no me dejaba acceder, así que tras rebuscar en Internet encontré que tenía que abrir los puertos 135, 137, 138, 139 y 445. Me parecía extraño que, queriendo trabajar sólo como cliente (sin compartir yo nada) tuviese que abrir puertos, pero de todas formas lo probé. El resultado: ni con esas funcionaba, aunque si quitaba el firewall entonces iba como la seda.
Bastante mosqueado volví a buscar en Internet, pero no encontré absolutamente nada, así que me armé de paciencia y de Wireshark y empecé a ver qué demonios pasaba con los paquetes. Así fue como descubrí que el problema estaba en la resolución de nombres. En efecto, cuando un recurso no está en el DNS (un servidor, una impresora), SAMBA utiliza su propio servicio para descubrir su dirección IP, para lo que envía una petición UDP a toda la red usando la dirección de broadcast. El problema es que la respuesta no viene de la dirección de broadcast, sino de un equipo concreto (el buscado), por lo que el firewall la bloquea.
Pensando que era un bug del módulo ip_conntrack escribí a los desarrolladores para avisarles. Su respuesta, sin embargo, fue que cargase el módulo nf_conntrack_netbios_ns. Y efectivamente, con dicho módulo, y sin necesidad de abrir ningún puerto, todo ha funcionado perfectamente.
Bailando Samba por A cuadros está licenciado bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.