Abrir puertos FTP con iptables

Iniciado por Drakaris, 6 Octubre 2019, 01:05 AM

0 Miembros y 4 Visitantes están viendo este tema.

Drakaris

Hola, estoy confgurando los puertos de mi servidor. Para ello bloqueé todos los puertos. Y abrí el puerto SSH (ssh-server) y HTTP (apache2), ya que tiene el servicio apache2 y un servidor ssh. Esta es por ahora mis reglas

*filter
:INPUT DROP [9048:4904870]
:FORWARD DROP [0:0]
:OUTPUT DROP [5753:7485333]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 21 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
COMMIT


Los puertos 22,80 y 21 están abiertos. Según me he informado el puerto 21 es el puerto predeterminado del FTP (vsftpd) pero solamente permite la conexión al host, después esta el puerto 20 que permite la transferencia de los archivos, así que lo abro con estas reglas

iptables -I INPUT -p tcp --dport 20 -j ACCEPT #le digo que en el puerto de entrada si hay un paquete con el puerto de destino 20 lo acepte
iptables -I INPUT -p tcp --sport 20 -j ACCEPT #si el origen del puerto es 20
iptables -I OUTPUT -p tcp --sport 20 -j ACCEPT #si el puerto de origen es 20
iptables -I OUTPUT -p tcp --dport 20 -j ACCEPT #si el puerto de destino es 20


AL insertar estas reglas, puedo logearme al servidor pero no me carga los archivos, además cuando hago una comprobacion de puertos abiertos me dice que esta cerrado.

En que estoy fallando?

Atentamete Drakaris
Lo increible, no es lo que ves, sino como es

MinusFour

Pon la lista tal cual tienes ahora:

Código (bash) [Seleccionar]

sudo iptables -L


No abras los mismos puertos para origen y destino. Si tu eres el servidor filtras por destino (dport) en INPUT y por origen (sport) en OUTPUT (a menos que estés haciendo una conexión inversa).

engel lex

:INPUT DROP [9048:4904870]
:FORWARD DROP [0:0]
:OUTPUT DROP [5753:7485333]


cuidado con reglas complicadas...

el forward drop usualmente es solo necesario cuando tu servidor es un proxy o vpn, de resto no debe tener reglas de forward (y aun así a menos que sepas bien lo que haces no se recomienda mucho)

el output drop tampoco es muy buena idea, eso es en caso que estés evitando que un usuario saque datos mas allá de los puertos permitidos,, pero aplica mas o menos igual que con forward...

input drop sería la unica necesaria, ya que si no escucha inputs no hay outputs

CitarAL insertar estas reglas, puedo logearme al servidor pero no me carga los archivos, además cuando hago una comprobacion de puertos abiertos me dice que esta cerrado.

si puedes logearte el puerto está abierto, los escaner de puertos hay que entender que hay "bajo el capó" para entender con claridad los resultados, no hay mejor prueba que la conexión


te recomiendo limpiar esas configuraciones que te dije y puedes olvidarte de todas las reglas con --sport ya que no hay output drop, solo importan ahora las --dport, desploquea 20, 21 y 22 y luego prueba
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Drakaris

Cita de: engel lex en  6 Octubre 2019, 01:32 AM
:INPUT DROP [9048:4904870]
:FORWARD DROP [0:0]
:OUTPUT DROP [5753:7485333]


cuidado con reglas complicadas...

el forward drop usualmente es solo necesario cuando tu servidor es un proxy o vpn, de resto no debe tener reglas de forward (y aun así a menos que sepas bien lo que haces no se recomienda mucho)

el output drop tampoco es muy buena idea, eso es en caso que estés evitando que un usuario saque datos mas allá de los puertos permitidos,, pero aplica mas o menos igual que con forward...

input drop sería la unica necesaria, ya que si no escucha inputs no hay outputs

si puedes logearte el puerto está abierto, los escaner de puertos hay que entender que hay "bajo el capó" para entender con claridad los resultados, no hay mejor prueba que la conexión


te recomiendo limpiar esas configuraciones que te dije y puedes olvidarte de todas las reglas con --sport ya que no hay output drop, solo importan ahora las --dport, desploquea 20, 21 y 22 y luego prueba

Hola, he puesto la politica de INPUT en DROP y las demás en ACCEPT, y después inserté las reglas correspondiente.

Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp-data

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         


El servidor web responde, y el ssh también. El problema es que en el servidor FTP abro el puerto 21 que es de conexion y también el puerto 20, y no me funciona. Pero pasa algo currioso ya que si accedo desde el navegador o desde nautilus no puedo acceder a los archivos pero en el caso del navegador se intenta conectar y en nautilus se conecta pero no muestra los archivos se queda cargando.  Pero si lo ejecuto desde la terminal

#ftp 192.168.0.2

y pongo las credenciales si puedo acceder y editar los archivos.

Por que ocurre esto?
Además he mirado mis puertos abierto con netstat -p tcp -n | grep ftp y sale esto:
tcp6       0      0 192.168.0.2:21          192.168.0.3:49670       ESTABLISHED
Parece que el protocolo es tcp6 que en el caso de iptables no se como abrir este tipo de protocolo. y la dport es un puerto mayor a 1024 por la cual tambien probé esta regla
iptables -I INPUT -p tcp --sport 20 -j ACCEPT

y no funciona ni tampoco con -6

Que puede pasar?
Lo increible, no es lo que ves, sino como es

MinusFour

Si te funciona el cliente FTP no es problema del servidor, es problema de nautilus o desde el equipo que estás intentando conectarte con Nautilus.

Drakaris

Cita de: MinusFour en  6 Octubre 2019, 03:06 AM
Si te funciona el cliente FTP no es problema del servidor, es problema de nautilus o desde el equipo que estás intentando conectarte con Nautilus.
Si.

El servidor cuando hace una conexion FTP lo hace por el puerto 21, pero cuando debe de hacer transferencia de datos,teóricamente tendría que entrar/salir por el puerto 20, pero snifeé la red y no ocurre esto, lo que hace es que los sport y dport son puertos aleatorios mayor que 1024, (no siempre).

img: https://drive.google.com/file/d/1rfUIrP5mi1IVQa_6NKPSrD1xVCkzAYiD/view?usp=sharing

Haciendo así que se conecta pero no se muestra los archivos.
La pregunta es..¿como le digo a vsftpd que el puerto de transferencia de datos es el 20? Para ello estan estas configuraciones del vsftpd.conf

pasv_enable
pasv_max_port
pasv_min_port
ftp_data_port

pero probé con todas aquellas y no me funciona.

¿Como puedo decirle que el puerto de data sea el que yo quiera?
o sino ¿como puedo hacer una regla qcon iptables que cuando detecte un paquete con el protocolo ftp-data me lo habilite, sin importar que puerto sea el de entrada o salida?
Lo increible, no es lo que ves, sino como es

MinusFour

#6
Si, lo que pasa ahí es que estás usando el modo pasivo de FTP. Necesitas establecer un rango de puertos:

Por ejemplo: 49000-50000 (49000 es min_port y 50000 es max_port). Los puertos son puertos destinos en la cadena de INPUT:

Código (bash) [Seleccionar]

sudo iptables -A INPUT -p tcp --dport 49000:50000


La regla del puerto 20 también debería estar en OUTPUT como puerto de origen (si tienes una política de DROP, sino no tiene caso).

Edit: Por cierto, si utilizas SSH bien puedes utilizar sftp en lugar ftp. No hay modo pasivo ahí, todo va por un solo puerto (22) y encima la información va cifrada.

Drakaris

#7
Hola.Ya pude solucionar el problema.

Como previamente había dicho MinusFour, es que los puertos de los clientes a la conexion al servidor son aleatorios mayor que 1024, por la cual como lo estaba bloqueando todos pues no se hacía la transferencia.

Como comentó él, seleccioné un rango para que escoja un puerto aleatorio a ese rango y yo lo permitiera en iptables.

pasv_min_port=1025
pasv_max_port=1035
pasv_enable=YES

y después
iptables -I INPUT -p tcp --dport 1025:1035 -j ACCEPT

Por manías mias seleccione el puerto mínimo 1025 y el máximo 1025, por la cual solo le dejo un puerto para la transferencia de archivos. El resultado sería este:

Chain INPUT (policy DROP)
target     prot opt source               destination        
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:1025:1035
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:ssh
ACCEPT     icmp --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination          

Gracias por vuesto tiempo.
Lo increible, no es lo que ves, sino como es

MinusFour

Honestamente, no conozco lo suficiente del protocolo FTP para decir que un solo puerto puede manejar multiples conexiones al mismo tiempo. Si lo normal es especificar un rango de puertos yo creo que no. Como yo tengo entendido, cuando se hace la transferencia de un archivo en el modo pasivo, el servidor empieza a escuchar en un determinado puerto y le notifica al usuario el puerto en el que está escuchando. Quizás sea posible compartir la conexión pero me imagino que sería algo complicado.

Drakaris

Cita de: MinusFour en  8 Octubre 2019, 03:41 AM
Honestamente, no conozco lo suficiente del protocolo FTP para decir que un solo puerto puede manejar multiples conexiones al mismo tiempo. Si lo normal es especificar un rango de puertos yo creo que no. Como yo tengo entendido, cuando se hace la transferencia de un archivo en el modo pasivo, el servidor empieza a escuchar en un determinado puerto y le notifica al usuario el puerto en el que está escuchando. Quizás sea posible compartir la conexión pero me imagino que sería algo complicado.

Perdón, es verdad, con un puerto unicamente no puedes teenr multiples sesiones
Lo increible, no es lo que ves, sino como es