[Anterior: Desempenho] [Conteúdo] [Próximo: Authpf: Shell de Usuário para Gateways de Autenticação]
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>".
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).
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.
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.
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]