[OpenBSD]

[Anterior: Desempenho] [Conteúdo] [Próximo: Authpf: Shell de Usuário para Gateways de Autenticação]

PF: Problemas com FTP


Conteúdo


Modos do FTP

FTP é um protocolo que data dos primórdios da Internet, quando esta era uma pequena e amigável coleção de computadores onde todo mundo se conhecia. Naquele tempo não havia necessidade de filtragem e altos requisitos de segurança. O FTP não foi desenvolvido para ser filtrado, atravessar firewalls, ou trabalhar com NAT.

Você pode usar o FTP em dois modos: passivo e ativo. Geralmente a escolha de modo passivo ou ativo é feita para determinar de quem será o problema com o firewall. Na verdade, você precisa suportar ambos para deixar seus usuários contentes.

Com FTP ativo, quando um usuário se conecta ao servidor FTP remoto e solicita informações ou um arquivo, o servidor FTP abre uma nova conexão com o cliente para transferir os dados. Essa é a chamada conexão de dados. Para iniciar, o cliente FTP escolhe uma porta aleatória para receber a conexão de dados. O cliente envia o número da porta escolhida para o servidor FTP e fica esperando uma conexão nessa porta. Então o servidor FTP inicia a conexão com o endereço do cliente na porta escolhida e transfere os dados. Isso se torna um problema para usuários atrás de um gateway NAT tentando se conectar a servidores FTP. Por causa da forma como NAT funciona, o servidor FTP inicializa a conexão de dados se conectando ao endereço externo do gateway NAT na porta escolhida. A máquina fazendo NAT recebe o pedido, mas como não possui mapeamento para o pacote na tabela de estados, descarta o pacote sem entregá-lo ao cliente.

No modo FTP passivo (o modo padrão no cliente ftp(1) do OpenBSD), o cliente pede ao servidor que escolha uma porta aleatória para ouvir, esperando a conexão de dados. O servidor informa ao cliente a porta escolhida e o cliente se conecta na porta para transferir os dados. Infelizmente, isso nem sempre é possível ou desejável, por causa da possibilidade do firewall em frente ao servidor FTP bloquear a conexão de dados. O ftp(1) do OpenBSD usa o modo passivo por padrão; para forçar o modo ativo, use o sinalizador -A no ftp, ou defina o modo passivo para "off" usando o comando "passive off" no prompt "ftp>".

Cliente FTP Atrás do Firewall

Como explicado anteriormente, o FTP não se dá muito bem com NAT e firewalls.

O Packet Filter fornece uma solução para essa situação através do desvio do tráfego FTP para um servidor proxy de FTP. Esse processo age como "guia" do tráfego FTP através do gateway/firewall NAT, adicionando as regras necessárias e removendo-as do sistema quando não forem mais necessárias através do sistema de âncoras. O proxy de FTP usado pelo PF é o ftp-proxy(8).

Para ativá-lo, insira algo assim no início da sessão de regras do pf.conf:

pass in quick on $int_if inet proto tcp to port 21 divert-to 127.0.0.1 port 8021

Isso desvia o tráfego FTP de seus clientes para o ftp-proxy(8), que está ouvindo na porta 8021 em sua máquina.

Você também precisa de uma âncora na seção de regras:

anchor "ftp-proxy/*"

O servidor proxy tem que ser iniciado e estar em execução na máquina OpenBSD. Isso é feito inserindo a linha abaixo em /etc/rc.conf.local:

ftpproxy_flags=""

O programa ftp-proxy pode ser iniciado como root, para ativá-lo sem precisar reinicializar.

O ftp-proxy escuta na porta 8021, a mesma porta que a instrução divert-to acima está enviando o tráfego FTP.

Para suportar conexões de modo ativo a partir de certos (diferentíssimos) clientes, você pode precisar utilizar '-r' em conjunto com o ftp-proxy(8).

Servidor FTP Protegido pelo PF

Nesse caso, o PF está em execução no próprio servidor FTP em vez de um firewall dedicado. Ao servir uma conexão FTP passiva, o FTP usa uma porta TCP alta e escolhida aleatoriamente para os dados que chegam. Por padrão, o servidor FTP ftpd(8) nativo do OpenBSD utiliza a faixa de portas de 49152 a 65535. Obviamente, essa faixa de portas deve ter permissão de passar pelas regras de filtragem, junto com a porta 21 (a porta de controle FTP):
pass in on $ext_if proto tcp to port 21
pass in on $ext_if proto tcp to port > 49151

Perceba que se você quiser, pode restringir consideravelmente a faixa de portas. No caso do programa ftpd(8) do OpenBSD, isso é feito utilizando as variáveis do sysctl(8) net.inet.ip.porthifirst e net.inet.ip.porthilast.

Servidor FTP Protegido por um Firewall PF Externo Fazendo NAT

Nesse caso, o firewall deve redirecionar o tráfego para o servidor FTP além de não bloquear as portas necessárias. Para conseguir isso, voltamos para o ftp-proxy(8).

O ftp-proxy(8) pode executar em um modo que faz com que ele redirecione todas as conexões FTP para um servidor FTP específico. Basicamente, configuramos o proxy para escutar na porta 21 do firewall e redirecionamos todas as conexões de volta para o servidor.

Edite o arquivo /etc/rc.conf.local e adicione o seguinte:

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

Aqui o 10.10.10.1 é o endereço IP do servidor FTP real, 21 é a porta que queremos que o ftp-proxy(8) escute e 192.168.0.1 é o endereço no firewall para o proxy.

Agora para as regras do pf.conf:

ext_ip = "192.168.0.1"
ftp_ip = "10.10.10.1"

+match out on $ext_if inet from $int_if nat-to ($ext_if)

anchor "ftp-proxy/*"
pass in on $ext_if inet proto tcp to $ext_ip port 21
pass out on $int_if inet proto tcp to $ftp_ip port 21 user proxy

Aqui nós permitimos a conexão vindo para a porta 21 na interface externa, bem como a conexão de saída correspondente para o servidor FTP. O "user proxy" na regra de saída garante que apenas as conexões iniciadas pelo ftp-proxy(8) sejam permitidas.

Note que se você quer executar o ftp-proxy(8) para proteger um servidor FTP, bem como permitir que clientes façam FTP para fora do firewall, duas instâncias do ftp-proxy serão necessárias.

Mais Informações sobre FTP

Mais informações sobre filtragem de tráfego FTP e funcionamento geral do FTP podem ser encontradas neste documento:

Proxy de TFTP

O Protocolo de Transferência de Arquivos Trivial (TFTP - "Trivial File Transfer Protocol") sofre algumas das mesmas limitações que o FTP quando tenta passar através de um firewall. Felizmente, o PF tem um proxy de TFTP chamado tftp-proxy(8).

O tftp-proxy(8) é configurado da mesma forma que o ftp-proxy(8) foi configurado na seção Cliente FTP Atrás do Firewall acima.

match out on $ext_if from $int_if nat-to ($ext_if)
anchor "tftp-proxy/*"
pass in quick on $int_if inet proto udp from $int_if to port tftp \
    divert-to 127.0.0.1 port 6969

anchor "tftp-proxy/*"

As regras acima permitem a saída de tráfego TFTP da rede interna para servidores TFTP na rede externa.

O último passo é habilitar o tftp-proxy no inetd.conf(5) para que ele escute na mesma porta que a regra divert-to especificada acima, nesse caso a porta 6969.

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

Diferentemente do ftp-proxy(8), o tftp-proxy(8) é chamado a partir do inetd.

[Anterior: Desempenho] [Conteúdo] [Próximo: Authpf: Shell de Usuário para Gateways de Autenticação]


[voltar] www@openbsd.org
$OpenBSD: ftp.html,v 1.12 2013/01/05 15:19:49 ajacoutot Exp $