Inoltra FTP con IPTables


9

Sto cercando di inoltrare un server FTP con IPTables. Il server FTP è in esecuzione su un box Windows 2008 (Cerberus).

Immagine

Dettagli Win Box:

  • IP: 192.168.220.51
  • Porta FTP: 21
  • Porte PASV: 11000-13000

Il server FTP funziona alla grande in LAN.

Il router funziona bene per altri client (serve NAT, DHCP, Firewall, ...). Devo inoltrare il servizio FTP al mondo esterno, ma non posso usare le porte 20-21 (già prese).

Ho provato questo, ma non ha funzionato:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Configurazione corrente IPTables:

[root@router ~]# service iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
2    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  127.0.0.1            0.0.0.0/0           
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
10   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
11   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 
12   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
13   ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
14   DROP       udp  --  0.0.0.0/0            0.0.0.0/0           
15   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Qualsiasi aiuto sarebbe grande :-).

Bounty-Edit : non sono stato in grado di capirlo, qualsiasi aiuto sarebbe molto apprezzato.

EDIT2

Sono in grado di telnet nel mio server FTP ora, dopo aver eseguito lì i comandi:

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Sto iniziando ad arrivarci ... Penso di dover solo far funzionare le mie porte PASV ora ...

EDIT3: Informazioni extra

[root@router ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 3251 packets, 154K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  540 48534 ACCEPT     all  --  *      *       127.0.0.1            0.0.0.0/0           
4270K 5625M ACCEPT     all  --  *      *       192.168.220.0/24     0.0.0.0/0           
    0     0 DROP       all  --  eth1   *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
   65  8487 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
    8   404 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
63870   81M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
  974  224K DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           
  638 34956 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT 3578K packets, 3355M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 2275K packets, 703M bytes)
 pkts bytes target     prot opt in     out     source               destination  



[root@router ~]# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 33954 packets, 2595K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2121 to:192.168.220.51:21 

Chain POSTROUTING (policy ACCEPT 5925 packets, 699K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           
27170 1785K MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 5777 packets, 457K bytes)
 pkts bytes target     prot opt in     out     source               destination  

Soluzione

È così che ho fatto, potrebbe non essere molto carino, ma funziona.

[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 11000:13000 -j DNAT --to 192.168.220.51:11000-13000
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 11000:13000 -j ACCEPT

Alcune note extra: il server FTP è in ascolto sui bot 21 e 2121 e l'intervallo PASV è impostato da 11000 a 13000


I moduli ftp conntrack e nat kernel sono caricati? Qual è l'output di lsmod | grep -i ftp?
Steven lunedì

Vuoto, non ho caricato alcun modulo kernel aggiuntivo. Ne ho bisogno?
Bart De Vos,

1
@TiZon: Sì. Iptables ha bisogno dei moduli conntrack per tenere traccia dei numeri di porta e degli indirizzi utilizzati da FTP nei comandi PASV e PORT. Inoltre, quando si esegue NAT, i moduli NAT sono necessari per riscrivere i numeri di porta e gli indirizzi in modo che il protocollo FTP possa funzionare correttamente.
Steven lunedì

2
+1 per una spiegazione valida e completa.
Gopoi,

3
@TiZon: come già accennato da Steven Monai, affinché FTP funzioni correttamente dietro un gateway NAT, avrai bisogno ip_conntrack_ftpe ip_nat_ftpmoduli del kernel caricati. FTP è un protocollo interessante da gestire dietro un firewall / gateway NAT. Potrebbe essere più semplice utilizzare semplicemente sftp (SSH FTP) che utilizza solo la porta 22 ed è crittografato (molto più sicuro). FileZilla è un ottimo client FTP gratuito che supporta SFTP.
Sean C.

Risposte:


7

Per far funzionare il supporto passivo, dovrai inoltrare le porte passive al server ftp interno con gli stessi numeri di porta .

Soluzione semplice: inoltra sempre tutti

InternetIP: 11000-13000 -> 192.168.220.51:11000-13000

Soluzione più dura:

Avrai bisogno di un agente di tracciamento delle connessioni per scopi speciali che legga il protocollo FTP e realizzi le giuste mappature NAT appena in tempo. Sembra che ip_conntrack_ftp potrebbe farlo.


L'ho fatto così. Ho inoltrato permanentemente tutte le porte. Potrebbe non essere la soluzione migliore, ma funziona. Primo post modificato con howto.
Bart De Vos,


0
iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
modprobe nf_conntrack_ftp 
modprobe nf_nat_ftp

dovrebbe essere abbastanza


Il numero di porta non deve 2121essere sostituito con 21? In che modo i moduli ftp riconoscono una connessione come controllo ftp? Verrà applicato a ogni connessione che utilizza la porta 21 prima o dopo NAT?
Kasperd,

Qualche spiegazione sarebbe buona, quindi sappiamo che non stai solo caricando a fondo la risposta
Tom O'Connor,

Scegli quale porta di origine a quale porta di destinazione inoltrare. Potrebbe essere adatto a te. Verrà applicato a ogni connessione alla porta specificata, nel nostro caso 2121, nella tabella "PREROUTING" nat. Come funziona il modulo ftp netfilter puoi leggere qui en.wikipedia.org/wiki/Netfilter#Connection_tracking_helpers
Yalok Iy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.