[OpenBSD]

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

PF: Problemas com FTP


Conteúdo


Modos FTP

FTP é um protocolo que data dos primórdios da Internet, quando esta era uma pequena a 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 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ê precisará 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. Esta é 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. Isto 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 receberá o pedido, mas como não possui mapeamento para o pacote na tabela de estado, descartará o pacote sem entrega-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, isto 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 modo passivo por padrão; para forçar o modo ativo, use a opção -A para o ftp, ou defina modo passivo para "off" usando o comando "passive off" no prompt do "ftp>".

Cliente FTP Atrás de um Firewall

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

PF fornece uma solução para esta situação redirecionando tráfego FTP para um servidor proxy FTP. Este processo age "guiando" o 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 FTP usado pelo OpenBSD 4.0 e PF é o ftp-proxy(8). (nota: Versões anteriores do OpenBSD usam um proxy diferente, com o mesmo nome, que é descrito na documentação do OpenBSD 3.8 em ftp-proxy(8)v3.8).

Para ativa-lo, insira algo assim na seção NAT do 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

As primeiras duas linhas são âncoras as quais são usadas pelo ftp-proxy para adicionar regras em tempo de execução para gerenciar seu tráfego FTP. A última linha redireciona tráfego FTP de seus clientes para o programa ftp-proxy(8), que está escutando na sua máquina na porta 8021.

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

anchor "ftp-proxy/*"

O servidor proxy tem que ser iniciado e estar rodando na máquina OpenBSD. Isto é 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 reiniciar.

O ftp-proxy escuta na porta 8021, a mesma porta que o rdr acima está enviando tráfego FTP.

Para habilitar conexões ativas, você precisa da opção '-r' no ftp-proxy(8) (para isto, no proxy antigo, você usava a opção "-u root").

PF "Auto-Protegendo" um Servidor FTP

Neste caso, PF está rodando no próprio servidor FTP ao invés de um firewall dedicado. Quando servindo uma conexão FTP passiva, FTP usará uma porta alta TCP aleatória para os dados. Por padrão, o servidor FTP nativo do OpenBSD ftpd(8) utiliza a faixa de portas de 49152 a 65535. Obviamente, esta 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 from any to any port 21 keep state
pass in on $ext_if proto tcp from any to any port > 49151 \
   keep state

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

Servidor FTP Protegido por um Firewall PF Externo Fazendo NAT

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

O ftp-proxy(8) pode rodar 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 no firewall e redirecionamos todas as conexões de volta para o servidor.

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

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

Aqui 10.10.10.1 é o endereço IP do atual servidor FTP, 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 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/*"

Aqui nós permitimos a conexão 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 rodar o ftp-proxy(8) para proteger um servidor FTP bem como permitir clientes fazer FTP para fora do firewall, duas instâncias do ftp-proxy serão necessarias.

Mais Informações sobre FTP

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

TFTP Proxy

Trivial File Transfer Protocol (TFTP) sofre das mesmas limitações que o FTP quando tenta passar através de um firewall. Felizmente o PF tem um proxy 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 de Firewall acima.

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/*"

As regras acima permitem saída 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 rdr especificada acima, neste caso 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 do inetd.

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


[voltar] www@openbsd.org
$OpenBSD: ftp.html,v 1.7 2007/12/01 10:39:11 tobias Exp $