2012-05-01 8 views
11

Ho un PC su cui è installato un server FTP. Voglio impostare le regole di iptables per consentire sia l'FTP attivo che passivo. Ho provato il seguente codice che le persone riportano sta lavorando, ma sembra bloccare tutto il traffico per me (pagine non verranno caricati più etc)Linux Bash: impostazione delle regole di iptables per consentire l'FTP sia attivo che passivo

#!/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 

risposta

5

Questo codice consente solo le connessioni FTP in entrata e in uscita. Non consente nient'altro in/out.

$IPT -P INPUT DROP 

Elimina tutto il traffico in entrata. Quindi, se inizi con questo, ti consigliamo di abilitare il traffico in tutti gli altri servizi che hai in esecuzione e che desideri autorizzare.

$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 

Questa regola consente il traffico FTP in ingresso.

Una spiegazione di ciò che questo script è/non fa altro che cancella tutte le tue catene Tabelle IP esistenti, allora aggiunge regole per consentire tutto il traffico in uscita e bloccare tutto il traffico in entrata ad eccezione di FTP.

+1

porta 80 per FTP ?! – machineaddict

+0

l'INGRESSO deve essere NUOVO, STABILITO. Non l'OUTPUT. –

+0

Grazie per le correzioni. Fisso. L'ho appena scritto e non gli ho dato più di una seconda occhiata. – hsanders

5

Gli argomenti per le linee INPUT e OUTPUT devono essere invertiti nella sezione # Allow FTP @ port 21 altrimenti nuove (attive) connessioni FTP verranno bloccate.

# 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

dalla tua domanda mi si supponga di avere un host banale con set comune di applicazioni come browser web, client di posta elettronica, può essere telnet e | o ssh-client, può essere ftp-client troppo, può essere alcuni IM, ecc. Avendo tutte queste app funzionanti, vuoi anche consentire a un server FTP su questo host di lavorare sia in modalità attiva che passiva per i client che si connetteranno. Qui ci sono 3 blocchi di regole applicabili in questo caso. Il blocco di regole comuni è il set di regole minimalistico applicabile per la maggior parte degli host client. Il prossimo è un blocco di regole per ftp-client, se ne hai uno sul tuo host. Le regole per ftp-client sono leggermente diverse dalle regole per gli altri client: ci sono sempre due connessioni per abilitare il trasferimento dei dati: ftp-control (porta 21) e ftp-data (porta 20 in modalità attiva o porta casuale in modalità passiva). Molto probabilmente non avrai mai bisogno di regole client per la modalità attiva perché la modalità passiva è una scelta singola per le reti NATed.

Le regole per il server FTP si trovano nell'ultimo blocco.

, controllare che siano ip_conntrack_ftp (può essere chiamato nf_conntrack_ftp) nel kernel:

> lsmod | grep conn 

Se non si dispone di questo modulo del kernel, le regole 'RELATIVA' non funziona e, molto probabilmente, separata la connessione ftp-data non verrà avviata mentre la connessione di controllo ftp primaria si bloccherà da qualche parte dopo il comando "PORT" mentre . In questo caso è ancora possibile applicare la connessione ftp-data, ma al costo della sicurezza degradante fornita dalle regole ottimizzate. Le modifiche sono nei commenti che precedono le regole.

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

ho trovato un grosso errore nello script di cui sopra!

Le regole sono misstyped, dovrebbe essere così:

$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 e cambio Sport posti! Stai andando a una destinazione, se ti connetti a un server, il sourceport è dinamico e clientide specifico e non è noto, tuttavia viene stabilita una connessione!

Imho la seconda linea è per nulla ambigua, perché non si conoscono le porte che un client lato server sta per utilizzare per stabilire una connessione ftp. Meglio sarebbe una regola come questa, se il traffico in uscita è bloccato da 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 

Ma questo è necessaria solo se la regola

$IPT -P OUTPUT DROP 

è in cima al set di regole.

Saluti

Marcus

1

consultare questo sito per Spiegazione: http://slacksite.com/other/ftp.html

FTP Client:

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 

server 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 --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 

Per passare dalla modalità passiva e attiva sul lato client

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