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-map, policy-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
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.
Obrigado por elaborar o text. Excelente artigo. Bem escrito e de fáci assimilação.
ResponderExcluirLegal o artigo. Também é possível usar um tipo simplificado de expressão regular para comparar o endereço que se deseja bloquear.
ResponderExcluirOlá Samuel!
ResponderExcluirParabé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.
Olá Fernando,
ExcluirSim, é 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.
Boa Noite! Esse é um exemplo de IntServ (Serviços Integrados), ou DiffServ (Serviços Diferenciados)??
ResponderExcluirDiffServ (DSCP)
ExcluirÉ possível fazer este bloqueio, mas liberar determinado host para não passar por ele?
ResponderExcluirÉ 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:
Excluir!--- 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.