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

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 vira0.0.0.15. - Aplique com
ip access-group NOME inououtna interface e comaccess-class NOME innaline 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.

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.
| Tipo | Faixa numerada | Compara | Onde aplicar |
|---|---|---|---|
| Standard | 1-99 e 1300-1999 | Só o endereço de origem | Perto do destino, porque não sabe para onde o pacote vai. Bom para VTY, SNMP e listas de rota |
| Extended | 100-199 e 2000-2699 | Protocolo, origem, destino, portas e flags TCP | Perto 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.
| Prefixo | Máscara | Wildcard |
|---|---|---|
| /32 (um host) | 255.255.255.255 | 0.0.0.0 ou a palavra host |
| /30 | 255.255.255.252 | 0.0.0.3 |
| /29 | 255.255.255.248 | 0.0.0.7 |
| /28 | 255.255.255.240 | 0.0.0.15 |
| /27 | 255.255.255.224 | 0.0.0.31 |
| /26 | 255.255.255.192 | 0.0.0.63 |
| /24 | 255.255.255.0 | 0.0.0.255 |
| /22 | 255.255.252.0 | 0.0.3.255 |
| Qualquer endereço | 0.0.0.0 | 255.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 anyna 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
outpassa 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 vtyo 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.0no lugar de0.0.0.255casa com algo completamente diferente do que você queria. - Mexer na VTY de longe sem rede de segurança. Use
reload inantes ereload canceldepois 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.
