El protocolo FTP usa dos canales TCP: uno de control, que se abre desde un puerto efímero del cliente (llamémosle TCP/xxxx) hacia el puerto TCP/21 del servidor, y uno de datos, que por defecto se abre desde el puerto TCP/20 del servidor hacia el cliente, al mismo puerto efímero (TCP/xxxx) .
Normalmente con el canal de control no hay problemas: puedes abrir conexión y lanzar comandos.
El problema del FTP con el NAT y con los firewall viene a la hora de abrir el canal de datos (por donde se transmite un fichero, y tb. por donde se transmite un DIR).
El protocolo FTP tiene dos comandos, PORT y PASV, que no son de uso obligado, pero la mayoría de clientes FTP envía sin participación del usuario. En ambos comandos (en un caso en el paquete de ida, y en el otro en la respuesta), se comunica al interlocutor la dirección IP de la máquina y un puerto escogido aleatoriamente, para abrir el canal de datos. Ya no se usa por tanto el puerto TCP/20. Esto puede ser un problema para los firewall's, porque no saben, en un momento dado, que puerto deben abrir para un canal de datos.
El problema del NAT está en que los mecanismos de NAT traducen direcciones de la cabecera IP, pero no miran dentro del paquete. Si como hemos dicho, los comandos PORT y PASV comunican una dirección IP, ésta será una IP privada, previa al NAT, y llegará al otro extremo sin traducir, por lo que este otro extremo intentará abrir el canal de datos contra una IP equivocada.
Por lo general, en routers y firewalls buenos, estos problemas se solucionan con ALG's (Application Level Gateway), que son capaces de reconocer tráfico FTP (entre otros), buscar dentro de los paquetes los comandos PORT y PASV, abrir el puerto que ahí se diga, y traducir convenientemente la dirección IP. De esta forma, sí funcionará el FTP en entornos donde hay firewalls y NAT's.
¿Queda suficientemente claro?
Un saludo