[Anterior: Rendimiento] [Contenido] [Siguiente: Shell de usuario para pasarelas de autentificación]
Se puede usar FTP de dos modos: pasivo o activo. Generalmente, la elección entre el modo activo o el pasivo se toma para determinar quién tiene el problema con los cortafuegos. La realidad es que para mantener a los usuarios contentos tendrá que dar soporte para ambos modos.
Con FTP activo, cuando un usuario se conecta a un servidor de FTP remoto y requiere información o un fichero de este, el servidor de FTP abre una nueva conexión de vuelta al cliente para transferir los datos que le ha requerido. Esto se conoce como la conexión de datos. Para empezar, el cliente de FTP escoge un puerto aleatorio por el que recibirá la conexión de datos. El cliente envía al servidor de FTP el número de puerto que ha escogido, y permanece a la espera de recibir una conexión entrante por este puerto. Entonces el servidor de FTP inicia una conexión a la dirección del cliente por el puerto elegido, y da comienzo a la transferencia de los datos. Esto supone un problema para los usuarios que intenten obtener acceso a servidores de FTP que se encuentren detrás de una pasarela de NAT. Debido al funcionamiento propio de NAT, el servidor de FTP inicia la conexión de datos conectándose a la dirección externa de la pasarela de NAT por el puerto elegido. La máquina de NAT recibe esta conexión, pero como no tiene asignación para el paquete en su tabla de estado, lo bloquea y no lo entrega al cliente.
Con el modo pasivo de FTP (el modo predeterminado con el cliente de ftp(1) de OpenBSD), el cliente envía un requerimiento al servidor para que éste escoja un puerto aleatorio en el que permanezca a la escucha en espera de la conexión de datos. El servidor informa al cliente sobre el puerto que ha escogido, y el cliente se conecta a este puerto para la transferencia de datos. Desafortunadamente, esto no es siempre posible o deseable debido a la posiblidad de que exista un cortafuegos delante del servidor de FTP bloqueando la conexión de datos entrante. En OpenBSD, ftp(1) está configurado para usar el modo pasivo de forma predeterminada; para forzar el modo activo de FTP, hay que usar el indicador -A de la orden ftp, o desactivar el modo pasivo mediante la orden passive off desde el punto de inserción (prompt) de ftp>.
Como se ha indicado anteriormente, FTP no va demasiado bien a través de NAT y cortafuegos.
PF dispone de una solución para esta situación, redireccionando el tráfico de FTP a través de un servidor proxy de FTP. Este proceso actúa como «guía» para el tráfico de FTP a través de la pasarela/cortafuegos de NAT, añadiendo activamente las reglas necesarias y eliminándolas cuando ya no sean necesarias a través del sistema de anclajes de PF. El proxy de FTP que usa PF es ftp-proxy(8).
Para activarla, añada una línea parecida a la siguiente en la sección de reglas de pf.conf:
pass in quick on $int_if proto tcp to port 21 rdr-to 127.0.0.1 port 8021
Esto redirecciona el FTP de nuestros clientes hacia el programa ftp-proxy(8), que está a la escucha en nuestra máquina por el puerto 8021.
También se necesita un anclaje en la sección de reglas:
anchor "ftp-proxy/*"Evidentemente, el servidor proxy debe estar iniciado y ejecutándose en la máquina OpenBSD. Esto se hace incluyendo la siguiente línea en /etc/rc.conf.local:
ftpproxy_flags=""
El programa ftp-proxy puede arrancarse como root para activarlo a fin de evitar un reinicio del sistema.
ftp-proxy está a la escucha en el puerto 8021, el mismo puerto al que la línea rdr-to precedente estaba enviando el tráfico de FTP.
Para soportar el modo de conexiones activas de determinados clientes (quisquillosos), es posible que necesite utilizar el parámetro '-r' en ftp-proxy(8).
Para este caso, PF estaría funcionando en el mismo servidor de FTP, en lugar de hacerlo en una máquina separada de cortafuegos. Cuando dé servicio a una conexión de FTP pasiva, FTP usará un puerto TCP alto, aleatorio, para los datos entrantes. El servidor de FTP nativo de OpenBSD ftpd(8) está configurado para usar de forma predeterminada un puerto en el rango entre 49152 y 65535. Obviamente, es necesario permitir el paso para estos puertos, junto con el puerto 21 (el puerto de control de FTP):
pass in on $ext_if proto tcp to port 21
pass in on $ext_if proto tcp to port > 49151
Nótese que, si lo desea, es posible restringir el rango de puertos de forma considerable. En el caso del programa ftpd(8) de OpenBSD, esto se hace usando las variables net.inet.ip.porthifirst y net.inet.ip.porthilast de sysctl(8).
ftp-proxy(8) se puede ejecutar en un modo que hace que se redireccionen toda las conexiones FTP a un determinado servidor FTP. Básicamente configuramos el proxy para que escuche en el puerto 21 del cortafuegos y redireccionamos las conexiones al servidor final.
Edite el fichero /etc/rc.conf.local y añada lo siguiente:
ftpproxy_flags="-R 10.10.10.1 -p 21 -b 192.168.0.1"Aquí 10.10.10.1 es la dirección IP del servidor FTP real, 21 es el puerto en el que queremos que ftp-proxy (8) escuche y 192.168.0.1 es la dirección en el cortafuegos para el proxy. Ahora, para las reglas de pf.conf:
ext_ip = "192.168.0.1"
ftp_ip = "10.10.10.1"
match out on $ext_if inet from $int_if nat-to ($ext_if)
anchor "ftp-proxy/*"
pass in on $ext_if inet proto tcp to $ext_ip port 21
pass out on $int_if inet proto tcp to $ftp_ip port 21 user proxy
Aquí permitimos la conexión entrante al puerto 21 en el interfaz externo, así como la conexión de salida correspondiente al servidor de FTP. La adición de "user proxy" a la regla de salida garantiza que solo se permiten las conexiones iniciadas por ftp-proxy(8).
Tenga en cuenta que si usted desea ejecutar ftp-proxy(8) para proteger un servidor FTP sin impedir a los clientes salir fuera del firewall, son necesarias dos instancias de ftp-proxy.
Se puede encontrar más información sobre el filtrado y el funcionamiento de FTP en el siguiente documento:
El Protocolo TFTP (Trivial File Transfer Protocol, «Protocolo de Transferencia de Ficheros Trivial») sufre el mismo tipo de limitaciones que FTP cuando trata de atravesar un cortafuegos. Por suerte, PF dispone de un proxy de ayuda para TFTP llamado tftp-proxy(8).
tftp-proxy(8) se configura de una manera similar a como se hizo con ftp-proxy(8) en la sección anterior Cliente de FTP detrás de un cortafuegos.
match out on $ext_if from $int_if nat-to ($ext_if)
anchor "tftp-proxy/*"
pass in quick on $int_if proto udp from $int_if to port tftp \
rdr-to 127.0.0.1 port 6969
anchor "tftp-proxy/*"
Las reglas anteriores autorizan la salida del tráfico TFTP de la red interna a los servidores TFTP en la la red externa.
El último paso es la activación de tftp-proxy en inetd.conf(5) a fin de que escuche en el mismo puerto que la regla rdr-to mencionada anteriormente, en este caso 6969.
127.0.0.1:6969 dgram udp wait root /usr/libexec/tftp-proxy tftp-proxy
A diferencia de ftp-proxy(8), tftp-proxy(8) se invoca vía inetd.
[Anterior: Rendimiento] [Contenido] [Siguiente: Siguiente: Shell de usuario para pasarelas de autentificación]