[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 redirecionamento 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 na seção de 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 o 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 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 rdr acima está enviando o tráfego FTP.
Para habilitar conexões de modo ativo, você precisa do comutador '-r' no ftp-proxy(8) (para isso você tem que executar o proxy antigo com "-u root").
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, 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"
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 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.
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 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 rdr 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]