[Precedente: Prestazioni] [Indice] [Successivo: Authpf: Shell utente per autenticazione di Gateways]
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>".
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").
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.
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.
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]