[OpenBSD]

[Precedente: Prestazioni] [Indice] [Successivo: Authpf: Shell utente per autenticazione di Gateways]

PF: Considerazioni con l'FTP


Indice


Modalità FTP

FTP è un vecchio protocollo che risale a quando Internet era un piccolo, gruppo di computer fidati e ognuno conosceva gli altri. A quel tempo la necessità di filtrare o di ottenere una sicurezza impenetrabile non era necessaria. FTP non era progettato per il filtraggio, attraversare firewall, o lavorare con NAT.

FTP si può usare in uno dei due seguenti modi: passivo o attivo. In genere la scelta di attivo o passivo è fatta per determinare chi ha problemi con il firewall. Realisticamente, occorre supportare entrambi per far felici gli utenti.

Con l'FTP attivo, quando un utente si connette a un server remoto FTP e richiede informazioni o un file, l'FTP server effettua una nuova connessione con il client per trasferire i dati richiesti. Questa è chiamata data connection. Per iniziare l'FTP client sceglie una porta casuale sulla quale ricevere i dati della connessione. Il client invia il numero di porta scelto al server FTP e resta in ascolto su quella porta in attesa di possibili connessioni. Il server FTP inizia quindi una connessione con la porta scelta all'indirizzo del client e trasferisce i dati. Questo è un problema per gli utenti che cercano di ottenere un accesso a un server FTP da dietro un gateway NAT. Proprio per come lavora la NAT, il server FTP inizia la connessione di dati collegandosi alla porta scelta all'indirizzo esterno del gateway NAT. La NAT riceverà questa connessione, ma non avendo mappato il pacchetto nella sua tabella di stato, getterà via il pacchetto e non lo consegnerà al client.

Con la modalità passiva l'FTP (modalità di default con l'OpenBSD ftp(1) client), il client richiede che il server scelga una porta a caso per ascoltare la connessione di dati. Il server informa il client della porta scelta, e il client si connette a questa porta per trasferire i dati. Sfortunatamente questo non è sempre possibile o desiderabile per l'eventuale presenza di un firewall davanti al server FTP che blocca la connessione dati in ingresso. L'ftp(1) di OpenBSD usa di default la modalità passiva; per forzare la modalità attiva dell'FTP, usare il flag -A all'ftp o configurare la modalità passiva a "off" con il comando "passive off" al prompt "ftp>".

Client FTP dietro un firewall

Come visto precedentemente, l'FTP non funziona molto bene attraverso la NAT e i firewall.

Packet Filter fornisce una soluzione per queste situazioni effettuando il reindirizzamento del traffico FTP attraverso un server proxy FTP. Questo processo agisce per "guidare" il tuo traffico FTP attraverso gateway NAT e firewall aggiungendo le regole necessarie al sistema PF e rimuovendole quando necessario per mezzo delle ancore di sistema di PF. Il proxy FTP utilizzato da PF in OpenBSD 3.9 e successive è ftp-proxy(8). (nota: precedenti versioni di OpenBSD usavano un differente proxy con lo stesso nome documentato in OpenBSD 3.8 ftp-proxy(8)v3.8).

Per attivarlo, scrivere nella sezione NAT di pf.conf:

nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
   port 8021

Le prime due righe sono una coppia di ancore usate da ftp-proxy per aggiungere le regole al momento, quando necessario, per gestire il tuo traffico. L'ultima riga reindirizza FTP dai tuoi client al ftp-proxy(8) che ascolta sulla tua macchina sulla porta 8021.

Inoltre hai bisogno di un ancora nella sezione delle regole:

anchor "ftp-proxy/*"

Il proxy server deve essere eseguito e deve funzionare nel box OpenBSD. Questo può essere ottenuto inserendo la seguente regola in /etc/rc.conf.local:

ftpproxy_flags=""

Il programma ftp-proxy può essere avviato come root e attivato senza riavviare.

Ftp-proxy ascolta sulla porta 8021, la stessa porta inserita nella regola rdr dove viene inviato il traffico FTP.

Per abilitare connessioni in modalità attiva, è necessario '-r' sul ftp-proxy(8) (per questo è necessario aver attivato il vecchio proxy con "-u root").

PF "Self-Protecting" di un server FTP

In questo caso, PF funziona su un server FTP stesso piuttosto che su un computer dedicato al firewall. Quando ci si serve di una connessione FTP passiva, FTP utilizzerà una porta TCP con numero elevato scelta a caso per l'ingresso dei dati. Di default il server FTP ftpd(8) usa il range tra 49152 e 65535. Ovviamente queste devono essere passate attraverso le regole di filtraggio, insieme con la porta 21 (la porta di controllo FTP):
pass in on $ext_if proto tcp from any to any port 21 keep state
pass in on $ext_if proto tcp from any to any port > 49151 \
   keep state

Da notare che se si desidera, si può chiudere al traffico quel range di porte. Nel caso di OpenBSD ftpd(8) ciò si ottiene usando le variabili di sysctl(8), net.inet.ip.porthifirst e net.inet.ip.porthilast.

Server FTP protetto da un Firewall PF esterno con NAT

In questo caso, il firewall deve reindirizzare il traffico al server FTP per non bloccare le richieste. Per ottenere cio' torniamo al ftp-proxy(8).

ftp-proxy(8) puo' essere avviato in un modo che causa il reindirizzamento di tutte le connessioni FTP a un server FTP. Semplicemente configureremo il proxy sulla porta 21 del firewall e il reindirizzamento di tutte le connessioni a un server di backup.

Editare /etc/rc.conf.local e aggiungere la seguente riga:

ftpproxy_flags="-R 10.10.10.1 -p 21 -b 192.168.0.1"

Qui 10.10.10.1 e' l'indirizzo IP del server attuale FTP, 21 e' la porta sulla quale ftp-proxy(8) deve ascoltare e 192.168.0.1 è l'indirizzo sul firewall che noi vogliamo che il proxy effettui il bind.

Ora per le regole di pf.conf:

ext_ip = "192.168.0.1"
ftp_ip = "10.10.10.1"

nat-anchor "ftp-proxy/*"
nat on $ext_if inet from $int_if -> ($ext_if)
rdr-anchor "ftp-proxy/*"

pass in on $ext_if inet proto tcp to $ext_ip port 21 \
    flags S/SA keep state
pass out on $int_if inet proto tcp to $ftp_ip port 21 \
    user proxy flags S/SA keep state
anchor "ftp-proxy/*"

Saranno permesse le connessioni in ingresso alla porta 21 sull'interfaccia esterna all'FTP server. L'aggiunta del "user proxy" sulle regole esterne assicurano che solo le connessioni iniziate da ftp-proxy(8) saranno permesse.

Da notare che se si vuole avviare ftp-proxy(8) per proteggere un FTP server e permettere a client FTP da dietro al firewall di funzionare sono richieste entrambe le istanze ftp-proxy.

Ulteriori informazioni sull'FTP

Ulteriori informazioni sul filtraggio FTP e come l'FTP funziona può essere trovato in generale in queste pagine bianche:

Proxy di TFTP

Trivial File Transfer Protocol (TFTP) soffre delle stesse limitazioni di FTP quando deve attraversare un firewall. Fortunatamente, PF ha in aiuto un proxy per TFTP chiamato tftp-proxy(8).

tftp-proxy(8) è configurato allo stesso modo di come ftp-proxy(8) e' stato configurato nella sezione Client FTP dietro un firewall.

nat on $ext_if from $int_if -> ($ext_if)
rdr-anchor "tftp-proxy/*"
rdr on $int_if proto udp from $int_if to port tftp -> \
    127.0.0.1 port 6969

anchor "tftp-proxy/*"

Le regole precedenti permettono il TFTP di network interne verso server TFTP su reti esterne.

L'ultimo passo e' di abilitare il tftp-proxy in inetd.conf(5) così che possa ascoltare sulla stessa porta la regola rdr specificata precedentemente, in questo caso 6969.

127.0.0.1:6969 dgram udp wait root /usr/libexec/tftp-proxy tftp-proxy

A differenza di ftp-proxy(8), tftp-proxy(8) e' avviato da inetd.

[Precedente: Prestazioni] [Indice] [Successivo: Authpf: Shell utente per autenticazione di Gateway]


[back] www@openbsd.org
$OpenBSD: ftp.html,v 1.2 2008/03/09 13:37:13 tobias Exp $