Iptables para permitir FTP entrante

32

Quiero permitir el tráfico FTP entrante.

CentOS 5.4:

Este es mi /etc/sysconfig/iptablesarchivo

# Generated by iptables-save v1.3.5 on Thu Oct  3 21:23:07 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [133:14837]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Oct  3 21:23:07 2013

Además, de forma predeterminada, el módulo ip_conntrack_netbios_n se está cargando.

#service iptables restart

Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

Pero el problema no es con ese módulo, ya que intenté descargarlo y todavía no tuve suerte.

Si desactivo iptables, puedo transferir mi copia de seguridad de otra máquina a FTP. Si se aplica iptables, la transferencia falló.

Ser gokul
fuente

Respuestas:

27

Su servidor ftp necesita un canal para transferir datos. El puerto 21se usa para establecer la conexión. Entonces, para hacer posible la transferencia de datos, también necesitará habilitar el puerto 20. Ver la siguiente configuración

Primero cargue el siguiente módulo para asegurarse de que no se rechacen las conexiones pasivas de ftp

modprobe ip_conntrack_ftp

Permitir conexiones FTP en el puerto 21entrante y saliente

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

Permitir puerto FTP 20para conexiones activas entrantes y salientes

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

Finalmente permitir el tráfico entrante pasivo FTP

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"

Para obtener más información sobre los problemas de FTP y firewall, consulte: http://slacksite.com/other/ftp.html#active

Editar: agregado NEWa la regla de entrada del puerto 21.

Valentin Bajrami
fuente
2
Olvidé mencionar que eso --sport 1024: and --dport 1024:significa que estamos incluyendo todos los puertos en el rango 1024:32535que son puertos sin privilegios, lo que significa que los usuarios sin acceso de privilegios pueden usar estos puertos para probar sus aplicaciones.
Valentin Bajrami
@Ser Gokul, eso es correcto. Podemos controlar nuestro servidor en qué puertos debería escuchar las conexiones del cliente. Sin embargo, en un modo pasivo, debemos usar --sportun modo sin privilegios para solucionar problemas de firewall y permitir que los clientes se conecten al servidor.
Valentin Bajrami
2
Bueno, puedes agregar NEW,ESTABLISHEDpero eso no debería importar. Primero, una conexión siempre está en un NEWestado y luego salta, lo RELATEDque indica que esta conexión está relacionada con una conexión ya permitida. Cuando la conexión cambia al ESTABLISHEDestado, nos informa que se ha establecido una conexión en ambos lados (servidor / cliente). Podrías intentarlo en su -m state --state ...lugar.
Valentin Bajrami
1
El NEWrealmente importa. No parece funcionar sin él.
Leandros
1
@ val0x00ff No entiendo la necesidad de --sport 1024:. ¿Por qué el puerto del cliente sería útil para la regla? Si se conecta desde un puerto 80 a los puertos pasivos del servidor, también se le debe permitir que se conecte.
Yvan
15

Ya vi reglas tan extensas en varios blogs, etc., y me pregunté por qué no simplemente usar

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

junto con el nf_conntrack_ftpmódulo Esto es más conciso y legible, lo que generalmente es algo bueno, especialmente con firewalls ...

FWIW, parece que hubo un cambio en el kernel 4.7, por lo que es necesario configurar a net.netfilter.nf_conntrack_helper=1través de sysctl(por ejemplo, ponerlo /etc/sysctl.d/conntrack.conf) o usar

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

(ver aquí para más detalles)

Jakob
fuente
1
La información sobre el kernel 4.7 me salvó la vida, estaba intentando durante horas hacer que esto funcionara. Un simple echo "1" > /proc/sys/net/netfilter/nf_conntrack_helpery todo funciona como se esperaba.
Guardián
1
¡Excelente! 4.7 fue un problema que no pude resolver en el kernel 4.9 de Jessie.
Arunas Bartisius
@Jakob hay un problema con las conexiones RELACIONADAS que se pueden utilizar para acceder a otros servicios: home.regit.org/wp-content/uploads/2011/11/… y github.com/rtsisyk/linux-iptables-contrack-exploit
Yvan
6

Cliente FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

SERVIDOR FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Para alternar entre modo pasivo y activo en el lado del cliente

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.
Sathish
fuente
3
Definitivamente mereces algunos votos a favor por esto. Olvidar cargar el módulo nf_conntrack_ftp es una fuente de dolores de cabeza al solucionar problemas de conexiones FTP pasivas y el seguimiento de conexiones iptables. El uso de este módulo le permite eliminar el tipo "NUEVO" para que estos puertos estén protegidos de conexiones arbitrarias sin que se establezca una sesión FTP previa.
Ryan Griggs
5

Agregar NUEVO lo arregló, creo.

Ahora, mi archivo iptables se ve así ...

# Generated by iptables-save v1.3.5 on Thu Oct  3 22:25:54 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [824:72492]

-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Oct  3 22:25:54 2013

Escribiéndolo como respuesta, ya que no se permiten demasiados caracteres en los comentarios. Muchas gracias por su ayuda.

Ser gokul
fuente
2
Genial, funcionó y me alegro de haberte indicado la dirección correcta. Marque su propia respuesta como resuelta para que pueda ayudar a otras personas que buscan la respuesta correcta.
Valentin Bajrami
Creo que hay un error tipográfico en la respuesta aceptada. Creo que --dport 20:65535está dejando todos los puertos del 20 al 65535 abiertos desde cualquier puerto de origen entre 1024: 65535, lo que deja expuestos muchos servicios que probablemente no deberían, a menos que se permita explícitamente. Creo que lo que se pretendía es--dport 1024:65535
itnAAnti
0

Si necesita conexiones activas y pasivas, y ya acepta ESTABLISHEDconexiones, como:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Entonces solo necesita abrir el puerto 21 y agregar una regla especial para puertos pasivos. No se necesita ninguna regla para el puerto 20, ya que la ESTABLISHEDregla anterior ya la acepta .

Primero acepte nuevas conexiones en port 21:

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Luego agregue el ayudante CT para puertos pasivos 1024::

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -m helper --helper ftp --dport 1024: -j ACCEPT

Ver también:

Nota: debe configurar el1024: como en su servidor FTP: busque los puertos pasivos predeterminados en su configuración FTP. De lo contrario, abriría demasiados puertos que pueden no ser relativos a FTP.

Nota importante: no agregué OUTPUTreglas ya que mis valores predeterminados van coniptables -P OUTPUT ACCEPT . Lo que significa que confío en lo que sale de mi caja. Esa puede no ser una buena opción, especialmente en una configuración NAT.

Nota muy importante: FTPS no funcionará con dicha configuración, ya que el puerto pasivo está oculto (encriptado), por lo tanto, no hay forma de iptablesadivinar el buen puerto. Consulte Cambiar las tablas IP para permitir FTP a través de TLS mediante puertos pasivos y https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

Yvan
fuente