GNU/Linux >> Tutoriales Linux >  >> Linux

FTP activo frente a FTP pasivo

Introducción

Una de las preguntas más comunes cuando se trata de firewalls y otros problemas de conectividad a Internet es la diferencia entre FTP (Protocolo de transferencia de archivos) activo y pasivo y cuál es la mejor manera de admitir uno o ambos. Con suerte, el siguiente texto ayudará a aclarar parte de la confusión sobre cómo admitir FTP en un entorno con firewall.

Esta publicación incluye ejemplos de sesiones FTP de línea de comando activas y pasivas. Estos ejemplos de sesión deberían ayudar a aclarar un poco las cosas. También brindan una buena imagen de lo que sucede detrás de escena durante una sesión de FTP. Ahora, a la información...

Lo básico

FTP es un servicio basado exclusivamente en TCP. No hay componente UDP para FTP. FTP es un servicio inusual en el sentido de que utiliza dos puertos, un puerto de "datos" y un puerto de "comando" (también conocido como puerto de control). Tradicionalmente, estos son el puerto 21 para el puerto de comando y el puerto 20 para el puerto de datos. Sin embargo, la confusión comienza cuando encontramos que dependiendo del modo, el puerto de datos no siempre está en el puerto 20.

FTP activo

En el modo FTP activo, el cliente se conecta desde un puerto aleatorio sin privilegios (N> 1024) al puerto de comando del servidor FTP, el puerto 21. Luego, el cliente comienza a escuchar el puerto N+1 y envía el comando FTP PORT N+1 al FTP. servidor. Luego, el servidor se volverá a conectar al puerto de datos especificado del cliente desde su puerto de datos local, que es el puerto 20.

Desde el punto de vista del servidor de seguridad del lado del servidor, para admitir FTP en modo activo, es necesario abrir los siguientes canales de comunicación:

  • Puerto 21 del servidor FTP desde cualquier lugar (el cliente inicia la conexión)
  • Puerto 21 del servidor FTP a puertos> 1024 (El servidor responde al puerto de control del cliente)
  • Puerto 20 del servidor FTP a puertos> 1024 (el servidor inicia la conexión de datos al puerto de datos del cliente)
  • Puerto 20 del servidor FTP desde puertos> 1024 (el cliente envía ACK al puerto de datos del servidor)

Cuando se extrae, la conexión aparece de la siguiente manera:

  • Del puerto de cliente 1026 (Cmd) al puerto de servidor 21 (Cmd)
  • Desde el puerto 21 del servidor (Cmd) al puerto 1026 del cliente (Cmd)
  • Desde el puerto 20 del servidor (datos) al puerto 1027 del cliente (datos)
  • Del puerto 1027 del cliente (datos) al puerto 20 del servidor (datos)

En el paso 1, el puerto de comando del cliente contacta el puerto de comando del servidor y envía el comando PUERTO 1027. Luego, el servidor envía un ACK al puerto de comando del cliente en el paso 2. En el paso 3, el servidor inicia una conexión en su puerto de datos local para el puerto de datos que el cliente especificó anteriormente. Finalmente, el cliente envía un ACK como se muestra en el paso 4.

El principal problema con el FTP en modo activo en realidad recae en el lado del cliente. El cliente FTP no realiza la conexión real al puerto de datos del servidor, simplemente le dice al servidor en qué puerto está escuchando y el servidor se conecta de nuevo al puerto especificado en el cliente. Desde el firewall del lado del cliente, esto parece ser un sistema externo que inicia una conexión con un cliente interno, algo que generalmente está bloqueado.

Ejemplo de FTP activo

A continuación se muestra un ejemplo real de una sesión FTP activa. Lo único que se ha cambiado son los nombres de los servidores, las direcciones IP y los nombres de usuario. En este ejemplo, se inicia una sesión FTP desde user01 (192.0.0.1), una caja solaris que ejecuta el cliente de línea de comandos FTP estándar, hasta dest_serv (192.0.0.2), una caja solaris que ejecuta solaris[TM] 9 ftpd . El indicador de depuración (-d) se usa con el cliente FTP para mostrar lo que sucede detrás de escena. Todo lo que está en cursiva es el resultado de la depuración que muestra los comandos FTP reales que se envían al servidor y las respuestas generadas a partir de esos comandos.

Hay algunas cosas interesantes a considerar acerca de este diálogo. Tenga en cuenta que cuando se emite el comando PORT, especifica un puerto en el sistema del cliente (192.0.0.1), en lugar del servidor. Veremos el comportamiento contrario cuando usemos FTP pasivo. Mientras estamos en el tema, una nota rápida sobre el formato del comando PORT. Como puede ver en el siguiente ejemplo, tiene el formato de una serie de seis números separados por comas. Los primeros cuatro octetos son la dirección IP, mientras que los segundos dos octetos comprenden el puerto que se utilizará para la conexión de datos. Para encontrar el puerto real, multiplique el quinto octeto por 256 y luego agregue el sexto octeto al total. Por lo tanto, en el siguiente ejemplo, el número de puerto es ((256*188) + 231), o 48359. Una verificación rápida con netstat debería confirmar esta información.

$ ftp -d dest_serv
Connected to dest_serv.
220 dest_serv FTP server ready.
Name (dest_serv:boqueron): root
---> USER root
331 Password required for root.
Password:
---> PASS XXXX
230 User root logged in.
---> SYST
215 UNIX Type: L8 Version: SUNOS
Remote system type is UNIX.
---> TYPE I
200 Type set to I.
Using binary mode to transfer files.
ftp> ls
---> PORT 192,0,0,1,188,231
200 PORT command successful.
---> TYPE A
200 Type set to A.
---> NLST
150 Opening ASCII mode data connection for file list.
TT_DB
bin
(...)
var
vol
xfn
226 Transfer complete.
191 bytes received in 0.03 seconds (6.16 Kbytes/s)
---> TYPE I
200 Type set to I.
ftp> quit
---> QUIT
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 599 bytes in 1 transfers.
221-Thank you for using the FTP service on dest_serv.
221 Goodbye.
# netstat -a | grep 48359
dest_serv.ftp-data       user01.48359 33580      0 49640      0 TIME_WAIT

FTP Pasivo

Para resolver el problema del servidor que inicia la conexión con el cliente, se desarrolló un método diferente para las conexiones FTP. Esto se conocía como modo pasivo, o PASV, por el comando utilizado por el cliente para decirle al servidor que está en modo pasivo.

En modo pasivo FTP, el cliente inicia ambas conexiones con el servidor, resolviendo el problema de los cortafuegos que filtran la conexión del puerto de datos entrante al cliente desde el servidor. Al abrir una conexión FTP, el cliente abre localmente dos puertos aleatorios sin privilegios (N> 1024 y N+1). El primer puerto se comunica con el servidor en el puerto 21, pero en lugar de emitir un comando PORT y permitir que el servidor se vuelva a conectar a su puerto de datos, el cliente emitirá el comando PASV. El resultado de esto es que el servidor abre un puerto aleatorio sin privilegios (P> 1024) y envía el comando PORT P al cliente. Luego, el cliente inicia la conexión desde el puerto N+1 al puerto P en el servidor para transferir datos.

Desde el punto de vista del cortafuegos del lado del servidor, para admitir el FTP en modo pasivo, es necesario abrir los siguientes canales de comunicación:

  • Puerto 21 del servidor FTP desde cualquier lugar (el cliente inicia la conexión)
  • Puerto 21 del servidor FTP a puertos> 1024 (El servidor responde al puerto de control del cliente)
  • Puertos del servidor FTP> 1024 desde cualquier lugar (el cliente inicia la conexión de datos al puerto aleatorio especificado por el servidor)
  • Puertos del servidor FTP> 1024 a puertos remotos> 1024 (el servidor envía ACK (y datos) al puerto de datos del cliente)

Cuando se dibuja, una conexión FTP en modo pasivo se ve así:

  • Del puerto de cliente 1026 (Cmd) al puerto de servidor 21 (Cmd)
  • Desde el puerto 21 del servidor (Cmd) al puerto 1026 del cliente (Cmd)
  • Del puerto de cliente 1027 (datos) al puerto de servidor 2024
  • Desde el puerto del servidor 2024 (Cmd) al puerto del cliente 1027 (Datos)

En el paso 1, el cliente contacta al servidor en el puerto de comando y emite el comando PASV. Luego, el servidor responde en el paso 2 con el PUERTO 2024, diciéndole al cliente qué puerto está escuchando para la conexión de datos. En el paso 3, el cliente inicia la conexión de datos desde su puerto de datos al puerto de datos del servidor especificado. Finalmente, el servidor devuelve un ACK en el paso 4 al puerto de datos del cliente.

Mientras que el FTP en modo pasivo resuelve muchos de los problemas del lado del cliente, abre una amplia gama de problemas en el lado del servidor. El mayor problema es la necesidad de permitir cualquier conexión remota a puertos con números altos en el servidor. Afortunadamente, muchos demonios FTP, incluido el demonio solaris in.ftpd, permiten al administrador especificar un rango de puertos que utilizará el servidor FTP. Consulte el Apéndice 1 para obtener más información.

El segundo problema consiste en admitir y solucionar problemas de clientes que admiten (o no) el modo pasivo. Como ejemplo, la utilidad FTP de la línea de comandos proporcionada con el demonio ftp de Solaris admite el modo pasivo desde Solaris 9 (a partir de sccs v1.20). Eche un vistazo a las páginas man (in.ftpd), opción -p.

Con la enorme popularidad de la World Wide Web, muchas personas prefieren usar su navegador web como cliente FTP. La mayoría de los navegadores solo admiten el modo pasivo al acceder a las URL de ftp://. Esto puede ser bueno o malo dependiendo de lo que los servidores y firewalls estén configurados para soportar.

Ejemplo de FTP pasivo

A continuación se muestra un ejemplo real de una sesión FTP pasiva. Lo único que se ha cambiado son los nombres de los servidores, las direcciones IP y los nombres de usuario. En este ejemplo, se inicia una sesión FTP desde user01 (192.0.0.1), una caja solaris que ejecuta el cliente de línea de comandos FTP estándar, hasta dest_serv (192.0.0.2), una caja solaris que ejecuta solaris 9 ftpd. El indicador de depuración (-d) se usa con el cliente FTP para mostrar lo que sucede detrás de escena. Todo lo que está en cursiva es el resultado de la depuración que muestra los comandos FTP reales que se envían al servidor y las respuestas generadas a partir de esos comandos. La salida normal del servidor se muestra en negro y la entrada del usuario está en negrita.

Observe la diferencia en el comando PORT en este ejemplo en comparación con el ejemplo de FTP activo. Aquí, vemos que se abre un puerto en el sistema del servidor (192.0.0.2), en lugar del cliente. Consulte la discusión sobre el formato del comando PORT anterior, en la sección Ejemplo de FTP activo.

$ ftp -d dest_serv
Connected to dest_serv.
220 dest_serv FTP server ready.
Name (dest_serv:boqueron): root
---> USER root
331 Password required for root.
Password:
---> PASS XXXX
230 User root logged in.
---> SYST
215 UNIX Type: L8 Version: SUNOS
Remote system type is UNIX.
---> TYPE I
200 Type set to I.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
---> PASV
227 Entering Passive Mode (192,0,0,2,7,176)
---> TYPE A
200 Type set to A.
---> NLST
150 Opening ASCII mode data connection for file list.
TT_DB
bin
cdrom
(...)
vol
xfn
226 Transfer complete.
191 bytes received in 0.027 seconds (7.04 Kbytes/s)
---> TYPE I
200 Type set to I.
ftp> quit
---> QUIT
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 599 bytes in 1 transfers.
221-Thank you for using the FTP service on dest_serv.
221 Goodbye.

Resumen

El siguiente cuadro debería ayudar a los administradores a recordar cómo funciona cada modo FTP:

Active FTP : 
command : client >1024 -> server 21 
data :    client >1024 <- server 20 
Passive FTP : 
command : client >1024 -> server 21 
data :    client >1024 -> server >1024

Un breve resumen de los pros y los contras del FTP activo frente al pasivo también está en orden:

Active FTP es beneficioso para el administrador del servidor FTP, pero perjudicial para el administrador del lado del cliente. El servidor FTP intenta realizar conexiones a puertos altos aleatorios en el cliente, lo que casi con certeza estaría bloqueado por un firewall en el lado del cliente. El FTP pasivo es beneficioso para el cliente, pero perjudicial para el administrador del servidor FTP. El cliente realizará ambas conexiones al servidor, pero una de ellas será a un puerto alto aleatorio, que casi seguramente estará bloqueado por un firewall en el lado del servidor.

Afortunadamente, hay algo de un compromiso. Dado que los administradores que ejecutan servidores FTP deberán hacer que sus servidores sean accesibles para la mayor cantidad de clientes, es casi seguro que necesitarán admitir FTP pasivo. La exposición de los puertos de alto nivel en el servidor se puede minimizar especificando un rango de puertos limitado para que lo use el servidor FTP. Por lo tanto, todo excepto este rango de puertos puede protegerse con firewall en el lado del servidor. Si bien esto no elimina todos los riesgos para el servidor, los disminuye enormemente. Consulte el Apéndice 1 para obtener más información.


Linux
  1. nc:comando no encontrado

  2. Gitlab en el puerto 8080

  3. Descripción de las asignaciones de puertos de la ventana acoplable

  4. Jenkins activo (salido)

  5. ¿Es posible hacer ping a una dirección:puerto?

RHEL 8/CentOS 8 puerto FTP abierto 21 con firewalld

Abrir un puerto en Linux

Cómo transferir un archivo en modo pasivo por FTP

Comando FTP no encontrado

Túnel HTTPS SSH

Cómo deshabilitar el modo pasivo en el comando ftp de Linux