2012-05-01 6 views
11

Tengo una PC en la que tengo instalado un servidor FTP. Quiero establecer las reglas de iptables para permitir FTP activo y pasivo. He intentado el siguiente código que la gente informe está trabajando, pero parece bloquear todo el tráfico para mí (las páginas no se cargarán más etc)Linux Bash: Establecer reglas de iptables para permitir FTP activo y pasivo

#!/bin/bash 

IPT=/sbin/iptables 
$IPT -F 
$IPT -X 
$IPT -t nat -F 
$IPT -t nat -X 
$IPT -t mangle -F 
$IPT -t mangle -X 
/sbin/modprobe ip_conntrack 
/sbin/modprobe ip_conntrack_ftp 

# Setting default filter policy 
$IPT -P INPUT DROP 
$IPT -P OUTPUT ACCEPT 

# Allow FTP connections @ port 21 
$IPT -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 

# Allow Active FTP Connections 
$IPT -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 

# Allow Passive FTP Connections 
$IPT -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT 

Respuesta

5

Ese código sólo permite conexiones FTP entrantes y salientes. No permite ninguna otra entrada o salida.

$IPT -P INPUT DROP 

Elimina todo el tráfico entrante. Por lo tanto, si comienza con eso, querrá habilitar el tráfico en cualquier otro servicio que tenga en ejecución y que quiera permitir.

$IPT -A INPUT -p tcp --sport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT 

Esta regla permitiría el tráfico FTP entrante.

Una explicación de lo que es/hace esta secuencia de comandos es que borra todas las cadenas de tablas IP existentes, luego agrega reglas para permitir todo el tráfico saliente y bloquear todo el tráfico entrante excepto FTP.

+1

puerto 80 para FTP ?! – machineaddict

+0

la ENTRADA debe ser NUEVA, ESTABLECIDA. No es la SALIDA. –

+0

Gracias por las correcciones. Fijo. Lo escribí y no lo miré por segunda vez. – hsanders

5

Los argumentos para las líneas ENTRADA y SALIDA deben voltearse en el # Permitir conexiones FTP @ puerto 21 sección de lo contrario se bloquearán las conexiones FTP (activas).

# Allow FTP connections @ port 21 
$IPT -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
6

de su pregunta supongo que tienes alguna anfitrión trivial con un conjunto común de aplicaciones tales como el navegador web, cliente de correo, puede ser telnet y | o ssh-cliente, puede ser ftp-cliente también puede ser algunos mensajes instantáneos, etc. Y teniendo todas estas aplicaciones funcionando, también desea permitir que un servidor FTP en este host funcione tanto en modo activo como pasivo para los clientes que se conectarán. Aquí hay 3 bloques de reglas aplicables en este caso. El bloque de reglas comunes es el conjunto minimalista de reglas aplicables para la mayoría de los hosts de los clientes. El siguiente es un bloque de reglas para ftp-client, si lo tiene en Su host. Las reglas para ftp-client son ligeramente diferentes de las reglas para otros clientes: siempre hay dos conexiones para habilitar la transferencia de datos: ftp-control (puerto 21) y ftp-data (puerto 20 en modo activo o puerto aleatorio en modo pasivo). Probablemente nunca necesitará reglas de cliente para el modo Activo porque el modo Pasivo es una opción única para redes NAT.

Las reglas para el servidor FTP están en el último bloque.

, compruebe que dispone ip_conntrack_ftp (puede ser identificado nf_conntrack_ftp) en el kernel:

> lsmod | grep conn 

Si usted no tiene este módulo del núcleo, las reglas del 'vinculado' no funcionará y, muy probablemente, por separado La conexión de ftp-datos no se iniciará mientras que la conexión de control de ftp principal se colgará en algún lugar después del comando 'PORT'. Aún puede hacer cumplir la conexión de datos ftp en este caso, pero con el gasto de degradación de la seguridad proporcionado por las reglas modificadas. Los ajustes están en comentarios que preceden las reglas.

Pro

#!/bin/bash 
IPT=/sbin/iptables 

$IPT -F 
$IPT -t nat -F 
$IPT -t mangle -F 

$IPT -X 
$IPT -t nat -X 
$IPT -t mangle -X 

/sbin/modprobe ip_conntrack 
/sbin/modprobe ip_conntrack_ftp 

$IPT -P INPUT DROP 
$IPT -P FORWARD DROP 
$IPT -P OUTPUT DROP 

# Block of common rules ##################################################### 
$IPT -A OUTPUT -o lo -j ACCEPT 
$IPT -A INPUT -i lo -j ACCEPT 

$IPT -A OUTPUT -p icmp -j ACCEPT 
$IPT -A INPUT -p icmp -j ACCEPT 

# allow DNS queries and replies 
$IPT -A OUTPUT -p udp --dport 53 -j ACCEPT 
$IPT -A INPUT -p udp --sport 53 -j ACCEPT 

# allow all Your possible client applications to work 
$IPT -A OUTPUT -p tcp -m multiport --dports ssh,telnet,http,https,xmpp-client,aol,smtp,pop3,imap2,imap3 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -p tcp -m multiport --sports ssh,telnet,http,https,xmpp-client,aol,smtp,pop3,imap2,imap3 -m state --state RELATED,ESTABLISHED -j ACCEPT 
# End of block of common rules ############################################## 


# If You have ftp-client too, this block of rules 
# will allow it to work with external ftp servers in both modes. 
# 
# First, allow ftp-control at client side: 
$IPT -A OUTPUT -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -p tcp -m tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
# 
# Then allow ftp-data Active Mode at client side: 
# Client accepts RELATED connection from server port 20 
# to client port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED at client host 
# to pick up this client port number from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED'. 
# And in the case of 'NEW' You allow connection to ANY port of Your host! 
$IPT -A INPUT -p tcp -m tcp --sport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp -m tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 
# 
# Finally, allow ftp-data Passive Mode at client side: 
# Client starts RELATED connection from random own high port number 
# to server fixed high port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED again at client host 
# to pick up this client port number from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED' ! 
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT  

#######[ Block of rules needed for Local FTP Server ]####### 
# This block of rules allows clients to access Your FTP server at this host 
# either in Active or Passive mode. 
# You may need to enable Passive mode in FTP server config file, 
# e.g. with pasv_enable=yes in /etc/vsftpd.conf if vsftpd is Your choice. 
# 
# Ftp-control at server side: 
# (some example rules are given below just to show 
# how You can selectively restrict access to Your FTP server): 
$IPT -A INPUT -s 1.2.3.0/24 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -s 5.6.7.8/32 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp -m tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
# 
# Ftp-data Active Mode at server side: 
# Server starts RELATED connection from server port 20 
# to client port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED to pick up this client port number 
# from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED' ! 
$IPT -A OUTPUT -p tcp -m tcp --sport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -p tcp -m tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 
# 
# Ftp-data Passive Mode at server side: 
# Server accepts RELATED client connection from random client high port number 
# to own fixed high port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED to pick up this own fixed high port number 
# from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED'. 
# And in the case of 'NEW' You allow connection to ANY high port of Your server! 
$IPT -A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT 
###### 
0

He encontrado un gran error en el script de arriba!

Las reglas se misstyped, debe ser así:

$IPT -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 

$IPT -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED -j ACCEPT 

DPORT y cambio Deporte lugares! Si va a un destino, si se conecta a un servidor, el puerto de origen es dinámico y está especifico para el cliente y no se conoce, ¡sin embargo, se establece una conexión!

Imho la segunda línea es ambigua en absoluto, porque usted no sabe qué puertos usará un cliente del lado del servidor para establecer una conexión ftp. Mejor habría una norma de este tipo, si el tráfico de salida está bloqueada por defalut:

$IPT -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 

Pero esto sólo es necesario si la regla

$IPT -P OUTPUT DROP 

es en la parte superior del conjunto de reglas.

Saludos

Marcus

1

Consulte este sitio para Explicación: http://slacksite.com/other/ftp.html

Cliente FTP:

lsmod | grep ftp 
modprobe nf_conntrack_ftp  or modprobe ip_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 --dport 1024: -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 

FTP SERVER:

lsmod | grep ftp 
modprobe nf_conntrack_ftp  or modprobe ip_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 --sport 1024:-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 el modo pasivo y activo en el lado del cliente

ftp> passive 
Passive mode on. 
ftp> passive 
Passive mode off. 
Cuestiones relacionadas