sexta-feira, 14 de fevereiro de 2014

Bloqueio de Sites e Nomes FQDN via ACL/NBAR

Olá Pessoal.

Esse artigo apresenta a solução para um problema comum nas empresas que é o bloqueio de determinados sites na Internet. A maioria das empresas utiliza um proxy para esse fim, o que é recomendado e torna as coisas bem mais fáceis. No entanto, nem sempre esse equipamento está disponível e pode ser interessante utilizar o próprio roteador de borda, responsável por prover acesso à Internet, para realizar esse serviço de filtragem, afinal todo roteador de borda é um firewall natural. 

A princípio a escrita de ACLs no roteador de borda para bloquear um determinado site através do seu endereço IP de destino é realmente bastante simples, mas acontece que muitas vezes é necessário escrever regras dessa natureza informando como destino os nomes de domínio FQDN (fully qualified domain name), por exemplo www.labcisco.com.br.

Até então o problema parece continuar bastante simples, afinal basta substituir o endereço de destino pelo nome FQDN e tudo deve funcionar, não é? Não, nem sempre é simples assim... Os sites de serviços providos por grandes empresas, a exemplo da Google e Facebook (e vários outros) não possuem apenas um único endereço de destino, sendo acessíveis através de vários endereços para assegurar a disponibilidade em caso de falha.

Ao utilizar nomes de domínio na escrita de uma ACL, será realizado o processo de resolução de nomes apenas para o primeiro endereço válido e não para todos os endereços possíveis. Ou seja, caso o administrador queira bloquear o YouTube por completo, então seria necessário bloquear todos os endereços vinculados com o domínio youtube.com. 

Uma solução para fazer isso seria levantar previamente todos os endereços IP correspondentes ao site que deve ser bloqueado e, posteriormente, escrever regras para cada um desses destinos. O problema dessa solução é que esses endereços não são estáticos e por isso é comum eles mudarem ao longo do tempo, o que torna o trabalho de bloqueio a sites bastante complicado.

Para resolver esse problema esse artigo apresentará um recurso denominado NBAR (Network Based Application Recognition) que será utilizado em conjunto com as ACLs tradicionais. O NBAR é uma ferramenta para implementar QoS que é suportada em todos os equipamentos mais recentes, viabilizando a classificação do tráfego da rede em categorias baseadas nos protocolos e outros parâmetros. O cenário desse laboratório é ilustrado na figura abaixo.


Implementar QoS requer a configuração de (1) classes de tráfego via class-map, (2) de políticas a serem aplicadas nessas classes via policy-map e (3) a inserção das políticas nas interfaces de rede via service-policy. Então utilizaremos class-mappolicy-map e service-policy para classificar/marcar todo o tráfego destinado para youtube.com e, na sequência, utilizaremos ACLs para bloquear esse tráfego previamente marcado com a codificação DSCP (Differentiated Services Code Point) comumente utilizada para fins de QoS. Nosso objetivo nesse artigo não é aprofundar a discussão sobre QoS e nem entrar em detalhes da codificação DSCP.

Os comandos necessários para classificar o tráfego e bloqueá-lo são:

!---- Parte 1: Class-Map p/ Identificar o Site
01. Router(config)# class-map match-any Classe-YouTube
02. Router(config-cmap)# match protocol http url "*youtube.com*"
03. Router(config-cmap)# exit

!---- Parte 2: Policy-Map p/ Marcar a Classe de Tráfego
04. Router(config)# policy-map Politica-YouTube
05. Router(config-pmap)# class Classe-YouTube
06. Router(config-pmap-p)# set ip dscp 1
07. Router(config-pmap-p)# exit
08. Router(config-pmap)# exit

!---- Parte 3: Service-Policy p/ Aplicar a Marcação na Rede Local
09. Router(config)# interface f0/0
10. Router(config-if)# description "Rede Local"
11. Router(config-if)# service-policy input Politica-YouTube
12. Router(config-if)# exit

!--- Parte 4: ACL p/ Bloquear o Tráfego Marcado
13. Router(config)# ip access-list extended NegaYouTube
14. Router(config-acl-ext)# deny ip any any dscp 1
15. Router(config-acl-ext)# permit ip any any
16. Router(config-acl-ext)# exit

!--- Parte 5: Aplicação da ACL na Saída p/ Internet
17. Router(config)# interface f0/1
18. Router(config-if)# description "Internet"
19. Router(config-if)# ip access-group NegaYouTube out
20. Router(config-if)# exit

Observem na primeira parte que foi criada uma class-map para classificar todo tráfego HTTP com a URL desejada, processo realizado através da inspeção dos pacotes. Na segunda parte escrevemos uma policy-map que aplica o código DSCP=1 para todo perfil de tráfego identificado na class-map anterior. A codificação DSCP tem alguns códigos padronizados, então optamos pelo código 1 porque provavelmente esse código não estará associado com nenhuma aplicação. Na terceira parte aplicamos a política de marcação dos pacotes em todo tráfego entrante na interface do roteador que está conectada na rede interna (gateway da rede interna). Por fim é configurada uma ACL que nega acesso a todo pacote que tenha o campo DSCP=1, cabendo destacar que essa regra deve ser aplicada no sentido sainte da interface conectada à Internet.

Uma observação importante é que essa solução funciona muito bem para tráfego HTTP (80) porque o NBAR consegue fazer a inspeção do cabeçalho dos pacotes, no entanto é impossível fazer a leitura de conteúdo cifrado via HTTPS (443). Por isso o NBAR não irá funcionar para serviços que somente operam através do HTTPS. Nesse caso o jeito é fazer uso das vantagens de um proxy...

Abraço.

Samuel.

8 comentários:

  1. Obrigado por elaborar o text. Excelente artigo. Bem escrito e de fáci assimilação.

    ResponderExcluir
  2. Legal o artigo. Também é possível usar um tipo simplificado de expressão regular para comparar o endereço que se deseja bloquear.

    ResponderExcluir
  3. Olá Samuel!

    Parabéns pelo artigo e é muito útil em dias atuais e por favor me tire uma dúvida ! Utilizando DSCP para efetuar bloqueios de alguns FQDN é possível fazer o mesmo com um determinando range de IP's, VLAN ou somente um IP especifico ?

    Muito obrigado e um abraço.

    ResponderExcluir
    Respostas
    1. Olá Fernando,

      Sim, é perfeitamente possível. Para trabalhar com endereços simples não é necessário utilizar class-maps que têm uma abrangência muito maior (através do comando "match"). Nesse caso, basta você utilizar a marcação DSCP com ACLs simples.

      O link abaixo deve ajudá-lo:
      http://goo.gl/hTvRKB

      Abraço.

      Excluir
  4. Boa Noite! Esse é um exemplo de IntServ (Serviços Integrados), ou DiffServ (Serviços Diferenciados)??

    ResponderExcluir
  5. É possível fazer este bloqueio, mas liberar determinado host para não passar por ele?

    ResponderExcluir
    Respostas
    1. É claro que sim. Neste caso bastaria preceder a ACL com uma regra liberando todo tráfego de um determinado host, uma vez que a lógica das ACLs é que seu conteúdo é lido somente até que seja encontrada alguma correspondência. Ao preceder a ACL com uma regra liberando um host, as próximas regras relacionadas à marcação DSCP são desconsideradas. No exemplo deste artigo a ACL deveria ficar da seguinte forma para que o host com IP 192.168.0.1 não fosse controlado:

      !--- Parte 4: ACL p/ Bloquear o Tráfego Marcado
      13. Router(config)# ip access-list extended NegaYouTube
      14. Router(config-acl-ext)# permit ip host 192.168.0.1 any
      15. Router(config-acl-ext)# deny ip any any dscp 1
      16. Router(config-acl-ext)# permit ip any any
      17. Router(config-acl-ext)# exit

      Uma alternativa mais específica à linha 14 seria:

      14. Router(config-acl-ext)# permit tcp host 192.168.0.1 any eq 80

      Obs.: Outro detalhe importante de ser lembrado é que todo filtro via ACL aplicado em qualquer interface de rede tem precedência sobre ações de tradução NAT.

      Excluir