elgio
(usa OpenSuSE)
Enviado em 29/05/2008 - 13:29h
FTP é um protocolo TINHOSO que é MUITO complicado em NAT. Ele envolve diversas portas, não apenas a 20 e 21 o que necessita que o firewall faça verdadeiros marabalismos para deixar passar. No iptables, basicamente, a diretiva RELATED do modulo state consegue seguir uma conexão FTP e abrir as portas necessárias.
O NAT precisa ALTERAR OS DADOS do cabeçalho FTP para funcionar. SIM, ISTO MESMO, alterar OS DADOS, ao menos no modo ativo (e o iptables FAZ isto se tiver com o modulo ftp ativo).
Duas formas básicas de FTP:
1) Ativo: esta é a forma clássica de operação. Nela o cliente (quem se conectou na porta 21 do servidor) abre uma porta alta para escuta. O servidor faz um início de conexão no cliente! É a forma mais complicada pois o firewall precisa abrir esta porta alta e permitir entrada de SYN.
O cliente informa qual porta está escutando através do comando PORT, exemplo:
PORT 10,1,4,3,165,98
Observe a sintaxe! Cada octeto separado por virgula!
No caso temos que pegar os decimais 165,98 para descobrir que o cliente está na porta 42338.
Duas coisas o firewall nat precisa fazer neste caso:
a) Liberar acesso VINDO DO SERVIDOR para a porta 42338 do cliente (diretiva RELATED do iptables faz isto)
b) Mexer, EDITAR, o comando PORT, pois ao passar pelo NAT, o ip privado mudará para um IP público, podendo INCLUSIVE mudar a porta. Supondo que não mudou a porta, como exemplo, o nat precisa EDITAR o comando PORT para:
PORT 200,200,200,1,165,98
Isto é um HORROR e me admira que os desenvolvedores do iptables tomaram coragem para implementar. Horror porque os dados ficaram MAIORES! O nat vai agora ficar a vida toda (durante a conexão) brincando de ajustar sequencial number e ack number dos cabeçalhos!! Mas o Iptables FAZ ISTO SE ESTIVER COM O MODULO ftp ativo!
2) Passivo: nesta forma o servidor NÃO SE CONECTA de volta no cliente, mas sim o cliente é quem se conecta novamente em uma porta do servidor.
O firewall agora não precisa abrir uma porta a mais no cliente. Veja este exemplo de uma conexão FTP passiva sniffada:
PASV
227 Entering Passive Mode (200,200,200,1,238,26).
Agora é o servidor quem informa o cliente que a porta de conexão é 51226. E mais, como o nat é apenas no cliente, o nat também não precisará converter dados, o HORROR que falei (bom, se o servidor estiver atrás de um nat estático, ele informaria o seu ip privado no Passive Mode e tem-se o mesmo problema. Mas servidores terem ips privados é incomum).
RESUMO DA OPERA: será que teu firewall está com o modulo ftp ativo? Está com a diretiva RELATED? (RELATED + modulo ftp é necessário para ftp ATIVO).
modprobe ip_nat_ftp
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT