Cisco

ACL no Cisco IOS: standard, extended e named na prática

Peneira vermelha filtrando pacotes, com linhas permit e deny de uma ACL no Cisco IOS

Uma ACL no Cisco parece simples: meia dúzia de linhas com permit e deny. O susto vem depois. Alguém aplica a lista na interface errada, esquece que existe um deny invisível no fim ou apaga uma linha de uma ACL numerada e descobre que a lista inteira sumiu. Quase todo problema com access-list nasce de três detalhes: a ordem das linhas, o deny implícito e a forma de editar.

Este guia monta as listas que costumam aparecer na borda de um provedor e no CPE de cliente corporativo, testadas em laboratório com IOS e IOS XE: filtro anti-spoofing na porta do cliente, proteção da gerência pela VTY e bloqueio de portas na entrada da internet. Para cada uma, explico o porquê de cada linha. Os exemplos usam o roteador R1 e endereços de documentação. Se você ainda não se acha no prompt do IOS, comece pelos comandos Cisco IOS básicos.

Resposta rápida: como funciona uma ACL no Cisco

  • O roteador compara o pacote com as linhas de cima para baixo e para na primeira que bate. As linhas seguintes nem são lidas.
  • No fim de toda lista existe um deny implícito. Pacote que não bateu em nada é descartado.
  • Standard (1-99 e 1300-1999) olha só a origem. Extended (100-199 e 2000-2699) olha protocolo, origem, destino e portas.
  • Prefira named: ip access-list extended NOME. Dá para inserir e apagar linhas pelo número de sequência.
  • A wildcard é o inverso da máscara: /24 vira 0.0.0.255, /28 vira 0.0.0.15.
  • Aplique com ip access-group NOME in ou out na interface e com access-class NOME in na line vty.
  • Confira com show ip access-lists: cada linha mostra quantos pacotes bateram nela.

Lógica top-down e deny implícito

A documentação da Cisco descreve a regra em uma frase: o software testa o pacote contra cada linha na ordem em que elas foram criadas e, quando acha uma correspondência, não olha mais nenhuma. Cada linha da lista é uma ACE (access control entry). A primeira ACE que bate decide o destino do pacote, seja permit ou deny.

Por isso a ordem importa mais do que o conteúdo. Uma lista com permit ip any any na linha 10 e uma dúzia de deny embaixo libera tudo: nenhum pacote chega aos deny. A regra prática é colocar o mais específico em cima e o mais genérico embaixo.

Depois da última linha existe uma linha que você não vê, equivalente a deny ip any any. Ela não aparece no show running-config nem no show access-lists, mas descarta tudo o que passou pela lista sem bater em nada. Uma ACL no Cisco feita só de deny bloqueia todo o tráfego da interface, inclusive o que você queria liberar.

Dois pacotes percorrendo as linhas de uma ACL no Cisco de cima para baixo até a primeira correspondência
O pacote do cliente bate na linha 10 e passa. O pacote com origem falsa não bate na 10 nem na 15 e cai no deny com log da linha 20.

Vale terminar as listas com um deny explícito, como deny ip any any log. O efeito é o mesmo do implícito, mas a linha ganha contador e, com log, gera mensagem no syslog. Quando o cliente diz que algo não passa, o contador dessa linha responde se o filtro está descartando ou não. A própria Cisco sugere o deny explícito pelo mesmo motivo: contar os pacotes negados.

Standard x extended: o que cada uma enxerga

A diferença entre os dois tipos de ACL no Cisco é o que a lista consegue comparar. A standard só enxerga quem mandou o pacote. A extended enxerga a conversa inteira: protocolo, origem, destino e, em TCP e UDP, as portas.

TipoFaixa numeradaComparaOnde aplicar
Standard1-99 e 1300-1999Só o endereço de origemPerto do destino, porque não sabe para onde o pacote vai. Bom para VTY, SNMP e listas de rota
Extended100-199 e 2000-2699Protocolo, origem, destino, portas e flags TCPPerto da origem, para descartar cedo o tráfego indesejado

A regra de posição vem da própria documentação. Como a standard filtra só pela origem, se você colocar a lista perto da origem acaba bloqueando aquele host para todos os destinos, quando talvez quisesse bloquear só um. A extended pode ficar em qualquer lugar, e o melhor lugar é o mais perto possível de onde o tráfego entra: o pacote descartado ali não gasta banda nem CPU no resto do caminho.

ACL numerada x named

Existem duas formas de escrever a mesma ACL no Cisco. A numerada é a mais antiga: cada linha é um comando access-list no modo de configuração global, e o número define o tipo. A named nasce com ip access-list standard ou ip access-list extended, entra num submodo próprio e aceita um nome que diz para que a lista serve.

Standard numerada

R1(config)# access-list 10 remark NOC pode gerenciar o roteador
R1(config)# access-list 10 permit 198.51.100.0 0.0.0.63
R1(config)# access-list 10 deny any log

O remark é um comentário, com até 100 caracteres, que fica gravado junto da lista. O permit 198.51.100.0 0.0.0.63 libera a rede do NOC, um /26. O deny any log repete o deny implícito, agora com contador e log. Note que a lista ainda não faz nada: ela só filtra quando é aplicada em algum lugar.

Standard named

R1(config)# ip access-list standard GERENCIA
R1(config-std-nacl)# remark redes autorizadas a abrir SSH no R1
R1(config-std-nacl)# permit 198.51.100.0 0.0.0.63
R1(config-std-nacl)# permit host 192.0.2.10
R1(config-std-nacl)# deny any log
R1(config-std-nacl)# end

Mesma lógica, com duas vantagens. O nome GERENCIA explica a função de longe, no show running-config. E o prompt muda para (config-std-nacl), onde cada linha ganha um número de sequência, de 10 em 10, que depois permite inserir e apagar entradas. O permit host 192.0.2.10 libera um único endereço, o servidor de backup que coleta a configuração.

Extended numerada e named

R1(config)# access-list 110 remark mesmo filtro no formato numerado
R1(config)# access-list 110 permit ip 203.0.113.0 0.0.0.15 any
R1(config)# access-list 110 deny ip any any log

A lista 110 faz o mesmo que a CLIENTE-A-IN da seção de aplicação. Funciona, mas numa borda com dezenas de clientes ninguém lembra o que é a 110 e o que é a 112. A Cisco lista as vantagens da named: apagar linhas individuais, filtrar por flags TCP e por portas não contíguas. Para lista nova, prefira named.

Wildcard mask sem decorar

A ACL no Cisco não usa máscara de sub-rede, usa wildcard. A regra é bit a bit: 0 quer dizer que o bit precisa ser igual, 1 quer dizer que tanto faz. O jeito rápido de calcular é subtrair a máscara de 255.255.255.255. A máscara 255.255.255.240 vira 0.0.0.15.

PrefixoMáscaraWildcard
/32 (um host)255.255.255.2550.0.0.0 ou a palavra host
/30255.255.255.2520.0.0.3
/29255.255.255.2480.0.0.7
/28255.255.255.2400.0.0.15
/27255.255.255.2240.0.0.31
/26255.255.255.1920.0.0.63
/24255.255.255.00.0.0.255
/22255.255.252.00.0.3.255
Qualquer endereço0.0.0.0255.255.255.255 ou a palavra any

O endereço que vai antes da wildcard precisa ser o início do bloco. 203.0.113.0 0.0.0.15 cobre de .0 a .15. Um 203.0.113.5 0.0.0.15 descreve o mesmo bloco, mas confunde quem lê o modelo guardado no repositório e parece apontar para um host. Escreva sempre o endereço de rede.

Aplicar a ACL no Cisco: in, out e na VTY

A lista só filtra quando está aplicada. Na interface, o comando é ip access-group com a direção. in filtra o que chega pela interface, antes da consulta à tabela de rotas. out filtra o que sai por ela, depois da consulta. Cada interface aceita uma ACL de IPv4 por direção.

Anti-spoofing na porta do cliente

O primeiro filtro que faz sentido num cliente corporativo com bloco próprio é o anti-spoofing: pela porta dele só entra pacote com origem no bloco dele. Isso impede que uma máquina infectada na rede do cliente mande tráfego com origem falsa para a internet, a prática do BCP 38.

R1(config)# ip access-list extended CLIENTE-A-IN
R1(config-ext-nacl)# remark so aceita origem no bloco do cliente A
R1(config-ext-nacl)# permit ip 203.0.113.0 0.0.0.15 any
R1(config-ext-nacl)# deny ip any any log
R1(config-ext-nacl)# exit
R1(config)# interface GigabitEthernet0/0/1
R1(config-if)# ip access-group CLIENTE-A-IN in
R1(config-if)# end

Linha a linha: o permit ip 203.0.113.0 0.0.0.15 any libera qualquer protocolo com origem no /28 do cliente e qualquer destino. O deny ip any any log descarta o resto e conta. O ip access-group ... in aplica a lista no sentido cliente para roteador. A lista é curta de propósito: menos linhas, menos chance de erro.

Proteger a gerência pela VTY

Na line vty o comando é outro: access-class. Ele controla quem pode abrir sessão de Telnet ou SSH no próprio roteador. Aplicar a lista GERENCIA com ip access-group numa interface não teria o mesmo efeito.

R1# reload in 10
System configuration has been modified. Save? [yes/no]: no
Proceed with reload? [confirm]
R1# configure terminal
R1(config)# line vty 0 4
R1(config-line)# access-class GERENCIA in
R1(config-line)# end
R1# reload cancel

O reload in 10 é a rede de segurança. Ele agenda um reinício para daqui a 10 minutos. Se a ACL te trancar para fora, o roteador volta com a configuração salva, que ainda não tem a restrição. Se a configuração tiver mudanças não salvas, o IOS pergunta antes se quer salvar: responda que não, senão a rede de segurança perde o sentido. Depois de aplicar, abra uma sessão nova de SSH a partir da rede do NOC. Funcionou? reload cancel, e só então grave a configuração.

Para quem quer ir além da VTY e proteger a CPU contra qualquer tráfego destinado ao roteador, o passo seguinte é o CoPP no Cisco IOS-XE, que usa ACLs extended para classificar o tráfego do plano de controle.

Filtro na entrada da internet

R1(config)# ip access-list extended INTERNET-IN
R1(config-ext-nacl)# remark nosso proprio bloco nao entra pela internet
R1(config-ext-nacl)# deny ip 203.0.113.0 0.0.0.255 any
R1(config-ext-nacl)# remark SMB e NetBIOS vindos de fora
R1(config-ext-nacl)# deny tcp any any eq 445
R1(config-ext-nacl)# deny tcp any any eq 139
R1(config-ext-nacl)# deny udp any any range 137 138
R1(config-ext-nacl)# permit ip any any
R1(config-ext-nacl)# exit
R1(config)# interface GigabitEthernet0/0/0
R1(config-if)# ip access-group INTERNET-IN in
R1(config-if)# end

Esta lista entra no uplink, no sentido da internet para dentro. A primeira linha descarta pacotes que chegam de fora com origem no nosso próprio bloco: isso é falsificação, porque esse tráfego nunca deveria vir pela internet. As três seguintes bloqueiam SMB (TCP 445) e NetBIOS (TCP 139 e UDP 137 e 138), portas que não têm motivo para atravessar a internet até um cliente. O permit ip any any no fim é obrigatório: sem ele, o deny implícito derrubaria todo o tráfego da internet.

Repare no contraste com a lista do cliente. A do cliente é uma lista de permissão: libera pouco e nega o resto. A da internet é uma lista de bloqueio: nega pouco e libera o resto. Antes de escrever a primeira linha, decida qual das duas você está montando.

Editar uma ACL no Cisco pelo número de sequência

Na named, cada linha tem um número. Sem número explícito, a primeira linha recebe 10 e as seguintes sobem de 10 em 10. Uma linha nova digitada sem número vai para o fim, com o último número mais 10. Para colocar a linha em outro ponto, basta digitar o número antes do permit ou do deny.

Inserir uma linha no meio

O cliente A recebeu um segundo bloco, 198.51.100.128/27. A linha nova precisa entrar antes do deny da linha 20, senão nunca será lida:

R1# configure terminal
R1(config)# ip access-list extended CLIENTE-A-IN
R1(config-ext-nacl)# 15 permit ip 198.51.100.128 0.0.0.31 any
R1(config-ext-nacl)# end
R1# show ip access-lists CLIENTE-A-IN
Extended IP access list CLIENTE-A-IN
    10 permit ip 203.0.113.0 0.0.0.15 any (1520 matches)
    15 permit ip 198.51.100.128 0.0.0.31 any
    20 deny ip any any log (37 matches)

A linha 15 entrou entre a 10 e a 20, sem remover a lista da interface e sem janela sem filtro. É o motivo para usar named. Se o número já existir, o IOS recusa com a mensagem Duplicate sequence number. Se a linha for idêntica a uma existente, nada muda.

Remover uma linha e renumerar

R1# configure terminal
R1(config)# ip access-list extended CLIENTE-A-IN
R1(config-ext-nacl)# no 15
R1(config-ext-nacl)# exit
R1(config)# ip access-list resequence CLIENTE-A-IN 10 10
R1(config)# end

O no 15 apaga só a linha 15. O ip access-list resequence CLIENTE-A-IN 10 10 renumera a lista a partir de 10, de 10 em 10, e abre espaço quando você já usou todos os números entre duas linhas. A documentação avisa ainda que, depois de um reload, os números podem voltar à numeração padrão. Por isso não escreva no seu procedimento algo como “mexa na linha 15”: descreva o conteúdo da linha.

E a ACL numerada?

Aqui está a armadilha mais conhecida de ACL no Cisco. Na numerada, o comando no access-list 110 apaga a lista inteira. Se ela estiver aplicada numa interface, a interface continua apontando para a 110, que agora não existe, e passa a deixar tudo passar. Para editar uma numerada linha por linha, entre nela pelo modo named, usando o número como nome:

R1(config)# ip access-list extended 110
R1(config-ext-nacl)# 5 permit ip 198.51.100.128 0.0.0.31 any
R1(config-ext-nacl)# no 5
R1(config-ext-nacl)# end

O IOS trata a lista 110 como uma named, com sequência. O 5 permit entra antes da primeira linha, e o no 5 remove só essa entrada. A documentação da Cisco mostra exatamente esse caminho para inserir linhas em ACL numerada.

show access-lists: os contadores da ACL no Cisco

Depois de aplicar ou editar, três comandos respondem quase tudo. O último zera os contadores, o que ajuda a medir o efeito de uma mudança.

R1# show access-lists
R1# show ip access-lists CLIENTE-A-IN
R1# show ip interface GigabitEthernet0/0/1 | include access list
R1# clear ip access-list counters CLIENTE-A-IN

O show access-lists mostra todas as listas, de IPv4 e de outros tipos. O show ip access-lists com o nome mostra só uma, com o contador de cada linha entre parênteses. Uma standard com entrada host costuma aparecer assim:

Standard IP access list GERENCIA
    20 permit 192.0.2.10 (3 matches)
    10 permit 198.51.100.0, wildcard bits 0.0.0.63 (12 matches)
    30 deny   any log (2 matches)

A linha 20 aparece antes da 10. Não é erro: a documentação explica que, na standard, entradas com endereço de host completo vão para uma tabela hash, e as de sub-rede ficam numa lista ordenada pela sequência. O resultado do filtro não muda, só a ordem de exibição. A partir do IOS XE 17.5.1, nos switches Catalyst, as linhas passaram a aparecer em ordem crescente de sequência.

Dois cuidados com os contadores. Em switches que filtram em hardware, o show ip access-lists pode não contar os pacotes tratados pelo ASIC, então contador zerado ali não prova que nada bateu. E o log não registra cada pacote: o primeiro gera mensagem na hora, e os seguintes são agrupados e informados em intervalos de cinco minutos.

Erros comuns com ACL no Cisco

  • Esquecer o permit final numa lista de bloqueio. A ACL da internet com três deny e nenhum permit derruba o link inteiro.
  • Linha genérica acima da específica. Um permit ip any any na linha 10 torna inúteis todas as linhas abaixo. Os contadores denunciam: as linhas de baixo ficam com zero.
  • Direção trocada. O anti-spoofing do cliente aplicado em out passa a filtrar o tráfego que vai para o cliente, com a origem na internet, e derruba tudo.
  • ip access-group na VTY. Na line vty o comando é access-class.
  • Apagar uma linha da numerada com no access-list. O comando leva a lista inteira. Edite pelo modo named, com o número de sequência.
  • Wildcard de máscara. Escrever 255.255.255.0 no lugar de 0.0.0.255 casa com algo completamente diferente do que você queria.
  • Mexer na VTY de longe sem rede de segurança. Use reload in antes e reload cancel depois de testar uma sessão nova.

Perguntas frequentes

Qual a diferença entre ACL standard e extended no Cisco?

A standard compara só o endereço de origem e usa as faixas 1-99 e 1300-1999. A extended compara protocolo, origem, destino e portas, nas faixas 100-199 e 2000-2699. Use standard para VTY, SNMP e filtros de rota, e extended para tráfego que atravessa o roteador.

Como apagar uma única linha de uma ACL no Cisco?

Entre na lista com ip access-list extended NOME e digite no seguido do número de sequência da linha. Isso vale também para listas numeradas, usando o número como nome. Evite no access-list N, que apaga a lista inteira.

Uma ACL no Cisco aplicada que não existe bloqueia o tráfego?

Não. Uma interface que aponta para uma lista vazia ou removida deixa todo o tráfego passar. O deny implícito só existe quando a lista tem pelo menos uma linha. Por isso, depois de recriar uma lista, confira com show ip access-lists que as linhas estão lá.

Posso aplicar duas ACLs na mesma interface?

Uma por direção e por protocolo: uma de IPv4 em in e outra em out. Se você aplicar uma segunda lista na mesma direção, ela substitui a primeira. Para filtrar mais coisas, acrescente linhas à lista existente.

A ACL de IPv4 também filtra IPv6?

Não. IPv6 tem listas próprias, criadas com ipv6 access-list, sempre com nome. Numa interface dual stack, uma ACL de IPv4 deixa o IPv6 livre. Se o seu filtro precisa valer nos dois protocolos, monte as duas listas.

Conclusão

Montar uma ACL no Cisco que faz o que você espera se resume a três hábitos: pensar na ordem, lembrar do deny implícito e editar pelo número de sequência. Comece pelas listas mais simples, como o anti-spoofing do cliente e a GERENCIA da VTY, sempre com um deny explícito com log no fim. Os contadores do show ip access-lists passam a responder sozinhos se o filtro está fazendo o que você espera.

Se a configuração ainda é nova para você, guarde um modelo de cada tipo de lista no repositório de configurações do provedor e copie dele. A próxima ACL no Cisco sai do modelo revisado, e não da memória de quem está de plantão.

Compartilhar:

Sobre o autor

Ivan Alves

Especialista em redes de provedores (ISP)

Ivan Alves trabalha há mais de 15 anos com redes de provedores de internet, do NOC ao backbone e à borda BGP. Coordena infraestrutura e tecnologia em um provedor regional e escreve aqui os tutoriais que gostaria de ter encontrado quando começou: comandos testados, cenário explicado e o porquê de cada linha.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *