Encaminhar FTP com IPTables

9

Estou tentando encaminhar um servidor FTP com IPTables. O servidor FTP está sendo executado em uma caixa do Windows 2008 (Cerberus).

Imagem

Detalhes Win Box:

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

O servidor FTP funciona muito bem na LAN.

O roteador está funcionando bem para outros clientes (servindo NAT, DHCP, firewall, ...). Preciso encaminhar o serviço FTP para o mundo exterior, mas não consigo usar as portas 20-21 (já ocupadas).

Eu tentei isso, mas não funcionou:

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

Configuração atual do 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         

Qualquer ajuda seria ótimo :-).

Bounty-Edit : Eu não consegui descobrir isso, qualquer ajuda seria muito apreciada.

EDIT2

Eu sou capaz de telnet no meu servidor FTP agora, depois de executar os comandos lá:

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

Estou começando a chegar lá ... acho que só preciso que minhas portas PASV funcionem agora ...

EDIT3: Informações 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  

Solução

Foi assim que eu fiz, pode não ser muito bonito, mas funciona.

[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

Algumas notas extras: O servidor FTP está escutando os bot 21 e 2121 e o intervalo PASV é definido de 11000 a 13000

Bart De Vos
fonte
Os módulos ftp conntrack & nat kernel estão carregados? Qual é a saída de lsmod | grep -i ftp?
Steven segunda-feira
Vazio, não carreguei nenhum módulo extra do kernel. Preciso de alguns?
Bart De Vos
1
@TiZon: Sim. O Iptables precisa dos módulos conntrack para rastrear os números de porta e os endereços que o FTP usa nos comandos PASV e PORT. Além disso, quando você está executando o NAT, os módulos NAT são necessários para reescrever números e endereços de portas, para que o protocolo FTP possa funcionar corretamente.
Steven segunda-feira
2
+1 para uma explicação boa e completa.
Gopoi 28/03
3
@TiZon: como Steven Monai já mencionado, a fim de FTP para funcionar corretamente atrás de um gateway NAT, você vai precisar ip_conntrack_ftpe ip_nat_ftpmódulos do kernel carregado. O FTP é um protocolo interessante a ser tratado por trás de um firewall / gateway NAT. Você pode achar mais fácil simplesmente usar sftp (SSH FTP), que usa apenas a porta 22 e é criptografado (muito mais seguro). O FileZilla é um ótimo cliente de FTP gratuito que suporta SFTP.
Sean C.

Respostas:

7

Para que o suporte passivo funcione, você precisará encaminhar as portas passivas para o servidor ftp interno com os mesmos números de porta .

Solução fácil: encaminhe todos eles o tempo todo

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

Solução mais difícil:

Você precisará de um agente de rastreamento de conexão para fins especiais que leia o protocolo FTP e faça os mapeamentos NAT corretos na hora certa. Parece que ip_conntrack_ftp pode fazer isso.

e_tothe_ipi
fonte
Eu fiz assim. Encaminhei permanentemente todas as portas. Pode não ser a melhor solução, mas funciona. Primeiro post editado com o 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

deve ser suficiente

Yalok Iy
fonte
O número da porta não deve 2121ser substituído por 21? Como os módulos ftp reconhecem uma conexão como controle ftp? Será aplicado a todas as conexões usando a porta 21 antes ou depois do NAT?
precisa saber é o seguinte
Alguma explicação seria bom, por isso sabemos que você não é apenas carga culting a resposta
Tom O'Connor
Você escolhe qual porta de origem para qual porta de destino encaminhar. Pode ser adequado para você. Será aplicado a todas as conexões à porta que você especificar, no nosso caso 2121, na tabela "PREROUTING" nat. Como o módulo netfilter ftp funciona, você pode ler aqui en.wikipedia.org/wiki/Netfilter#Connection_tracking_helpers
Yalok Iy