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