| 
	
		|  Autor | Tema: Abrir puertos FTP con iptables  (Leído 6,801 veces) |  
	| 
			| 
					
						| Drakaris 
								
								 Desconectado 
								Mensajes: 286
								
								 
								Todo lo que puedas imaginar, lo puedes crear.
								
								
								
								
								
								   | 
 
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 acepteiptables -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
 
 |  
						| 
								|  |  
								| « Última modificación:  8 Octubre 2019, 00:10 am por Drakaris » |  En línea | 
 
 Lo increible, no es lo que ves, sino como es |  |  |  | 
			| 
					
						| MinusFour | 
 
Pon la lista tal cual tienes ahora: 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).
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| 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 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. 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 |  
						| 
								|  |  
								|  |  En línea | 
 
 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 
								
								 Desconectado 
								Mensajes: 286
								
								 
								Todo lo que puedas imaginar, lo puedes crear.
								
								
								
								
								
								   | 
 
: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 pruebaHola, 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 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? |  
						| 
								|  |  
								|  |  En línea | 
 
 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. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Drakaris 
								
								 Desconectado 
								Mensajes: 286
								
								 
								Todo lo que puedas imaginar, lo puedes crear.
								
								
								
								
								
								   | 
 
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_enablepasv_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? |  
						| 
								|  |  
								|  |  En línea | 
 
 Lo increible, no es lo que ves, sino como es |  |  |  | 
			| 
					
						| MinusFour | 
 
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: 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. |  
						| 
								|  |  
								| « Última modificación:  7 Octubre 2019, 00:48 am por MinusFour » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Drakaris 
								
								 Desconectado 
								Mensajes: 286
								
								 
								Todo lo que puedas imaginar, lo puedes crear.
								
								
								
								
								
								   | 
 
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=1025pasv_max_port=1035
 pasv_enable=YES
 
y después iptables -I INPUT -p tcp --dport 1025:1035 -j ACCEPTPor 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. |  
						| 
								|  |  
								| « Última modificación: 15 Noviembre 2019, 16:29 pm por Drakaris » |  En línea | 
 
 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. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Drakaris 
								
								 Desconectado 
								Mensajes: 286
								
								 
								Todo lo que puedas imaginar, lo puedes crear.
								
								
								
								
								
								   | 
 
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 |  
						| 
								|  |  
								|  |  En línea | 
 
 Lo increible, no es lo que ves, sino como es |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | [Solucionado] Abrir puerto en firewall con iptables Redes
 | Riudo | 6 | 8,773 |  30 Septiembre 2010, 10:58 am por madpitbull_99
 |  
						|   |   | duda bloquear puertos con con squid e iptables Redes
 | danielo- | 2 | 9,389 |  14 Mayo 2011, 17:28 pm por danielo-
 |  
						|   |   | Permitir solo algunos puertos con iptables Seguridad
 | matiasramos | 0 | 2,809 |  28 Junio 2013, 22:25 pm por matiasramos
 |  
						|   |   | Denegar acceso a todos los puertos menos uno en iptables
							« 1 2 » GNU/Linux
 | WHK | 12 | 9,718 |  10 Mayo 2015, 04:22 am por WHK
 |  
						|   |   | iptables puertos redireccionado lan GNU/Linux
 | fabiancorreo | 1 | 2,886 |  1 Junio 2015, 19:49 pm por xv0
 |    |