3.2.a and 3.2.b Troubleshooting IPv4 ACLs and IPv6 Traffic Filters¶
Blueprint 3.2: Troubleshoot router security features
- 3.2.a IPv4 access control lists: standard, extended, time-based
- 3.2.b IPv6 traffic filter
uRPF (3.2.c) is on its own page: uRPF.
The verb is troubleshoot. ACL questions on ENARSI almost always show show access-lists output with match counters, or an interface with an ACL applied, and ask why a flow is (or is not) blocked. Read the counters: they tell you which line a flow hits.
The processing rules that cause most faults¶
Every ACL fault on the exam comes back to one of these rules.
- Top down, first match wins. Once a packet matches a line, the action is taken and no further lines are checked.
- Implicit deny at the end. An IPv4 ACL ends with an invisible
deny ip any any. It has no counter, so traffic dropped by it does not show inshow access-lists. - One ACL per interface, per direction, per protocol. Applying a second IPv4 ACL inbound on the same interface replaces the first.
- Direction is from the router's point of view.
infilters packets arriving on the interface before routing.outfilters packets leaving the interface after routing. - Outbound ACLs do not filter traffic the router generates itself. Pings, routing updates and syslog messages the router originates bypass an outbound interface ACL.
- An ACL applied to an interface but not defined permits everything. A typo in the ACL name on the interface silently disables filtering.
graph LR
P["Packet arrives Gi0/1"] --> IN{"Inbound ACL<br/>on Gi0/1?"}
IN -->|"deny"| D1["Drop"]
IN -->|"permit or none"| RT["Routing lookup"]
RT --> OUT{"Outbound ACL<br/>on exit Gi0/2?"}
OUT -->|"deny"| D2["Drop"]
OUT -->|"permit or none"| TX["Transmit"]
LOC["Router-generated packet"] --> RT2["Routing lookup"] --> TX2["Transmit, outbound ACL not applied"]
Standard versus extended¶
| Standard | Extended | |
|---|---|---|
| Numbers | 1 to 99, 1300 to 1999 | 100 to 199, 2000 to 2699 |
| Matches on | Source address only | Protocol, source, destination, ports, flags, DSCP, TTL and more |
| Placement guideline | Close to the destination | Close to the source |
| Typical extra use | VTY access-class, route filtering, NAT, SNMP communities |
Interface filtering, QoS and CoPP classification, PBR |
Placement follows from what each type can match. A standard ACL near the source blocks that source to every destination, which is almost never what the requirement says. An extended ACL can name the destination, so put it near the source and drop unwanted traffic before it crosses the network.
Wildcard masks¶
A wildcard mask bit of 0 means "must match", a 1 means "ignore". For a contiguous block, the wildcard is the subnet mask inverted: /24 is 0.0.0.255, /22 is 0.0.3.255, /30 is 0.0.0.3. host 10.1.1.1 equals 10.1.1.1 0.0.0.0, and any equals 0.0.0.0 255.255.255.255.
Common wildcard faults on the exam:
| Written | What it actually matches | Usually intended |
|---|---|---|
10.1.1.0 255.255.255.0 |
Any address ending in .0, from any network | 10.1.1.0 0.0.0.255 |
10.1.4.0 0.0.1.255 |
10.1.4.0 to 10.1.5.255 | Correct for a /23 |
10.1.5.0 0.0.3.255 |
IOS rewrites it to 10.1.4.0 0.0.3.255 | Check what the running config shows |
172.16.0.0 0.0.255.255 for 172.16.0.0/12 |
Only 172.16.0.0/16 | 172.16.0.0 0.15.255.255 |
Exam trap
In an extended ACL the port belongs to the address it follows. permit tcp any eq 22 host 10.0.0.1 matches packets from source port 22, which are SSH replies. A client connecting to an SSH server uses destination port 22: permit tcp any host 10.0.0.1 eq 22. Reversed ports are the most common single fault in ACL and CoPP exhibits.
Useful extended ACL keywords¶
| Keyword | Matches |
|---|---|
established |
TCP segments with ACK or RST set, which is return traffic of a session started on the other side |
eq, neq, lt, gt, range |
Port operators |
log, log-input |
Generates a syslog message on match (rate limited); log-input adds the input interface and MAC |
fragments |
Non-initial fragments, which carry no Layer 4 header |
dscp, precedence, ttl |
Header fields |
echo, echo-reply, unreachable and other ICMP types |
Specific ICMP messages |
When an ACL denies everything not explicitly permitted, it also blocks traffic people forget about: OSPF (IP protocol 89) and EIGRP (protocol 88) on an inbound routing interface, BGP (TCP 179) in both directions, DHCP (UDP 67 and 68), DNS replies, ICMP unreachables needed for path MTU discovery, and IPsec (UDP 500, UDP 4500 and ESP, protocol 50).
Configuring and editing ACLs¶
Named and numbered ACLs both accept sequence numbers when edited in ip access-list mode. Inserting a line between 10 and 20 is just 15 .... Re-entering access-list 101 ... in global configuration always appends to the end.
Verification¶
R1# show access-lists FROM-BRANCH
Extended IP access list FROM-BRANCH
10 permit ospf any any (4021 matches)
20 deny tcp host 10.20.5.25 any eq 22 (14 matches)
30 permit tcp 10.20.0.0 0.0.255.255 10.99.0.0 0.0.0.255 eq www (0 matches)
40 permit icmp 10.20.0.0 0.0.255.255 any (230 matches)
50 deny ip any any log (1882 matches)
R1# show ip interface GigabitEthernet0/1 | include access list
Outgoing access list is not set
Inbound access list is FROM-BRANCH
Line 30 is the clue in this output. The requirement was HTTPS, but IOS displays port 80 as www, so someone typed eq 80 or eq www and the line permits HTTP instead. More generally, a line that should be busy and has zero matches is mistyped, shadowed by an earlier line, or applied on the wrong interface or in the wrong direction.
A troubleshooting routine for any ACL ticket:
show ip interface <int> | include access list: is the right ACL applied, in the right direction, on the right interface?show access-lists <name>: does the ACL exist with that exact name? Which line has the counters?clear access-list counters <name>, reproduce the problem, then look again. The line whose counter moved is the line the flow hit.- If no line moved, the flow is either hitting the implicit deny (add an explicit
deny ip any any logtemporarily) or not passing this interface at all (check routing).
Exam trap
ip access-group BRANCH-IN in with an ACL actually named FROM-BRANCH is accepted without an error. The interface points to a list that does not exist, so all traffic is permitted. show ip interface shows the name you typed, so compare it letter for letter with show access-lists.
Time-based ACLs¶
A time range lets one ACL entry be active only during a window. The ACL entry references the range by name.
clock timezone EST -5 0
ntp server 10.50.1.5
!
time-range BUSINESS
periodic weekdays 8:00 to 18:00
time-range MAINT-WINDOW
absolute start 22:00 10 October 2026 end 04:00 11 October 2026
!
ip access-list extended GUEST-IN
10 permit tcp 10.50.0.0 0.0.0.255 any eq 443 time-range BUSINESS
20 permit udp 10.50.0.0 0.0.0.255 any eq 53
30 deny ip any any
| Element | Rules |
|---|---|
periodic |
Recurring window. Keywords: a day name, daily, weekdays (Monday to Friday), weekend (Saturday and Sunday). Several periodic lines are allowed. |
absolute |
One-off window with start and/or end. Only one absolute statement per time range. If both are present, a periodic window is active only inside the absolute window. |
| Clock source | The router's own clock and time zone. NTP keeps it right. |
| Display | show time-range and show access-lists mark entries (active) or (inactive) |
R1# show time-range
time-range entry: BUSINESS (inactive)
periodic weekdays 8:00 to 18:00
used in: IP ACL entry
time-range entry: MAINT-WINDOW (inactive)
absolute start 22:00 10 October 2026 end 04:00 11 October 2026
used in: IP ACL entry
R1# show clock
*03:12:44.019 UTC Sat Jan 2 2027
Two faults are visible here. The clock shows UTC with an asterisk, meaning it is not synchronised and no time zone is configured, so the business-hours window is evaluated against the wrong time. And MAINT-WINDOW is an absolute range that has already ended, so any entry using it will never be active again.
Exam trap
A time-based entry that is inactive is skipped, not denied. The packet continues down the ACL. Whether it is then dropped depends on the later lines. If the next line is deny ip any any, the effect is a deny; if it is a broad permit, the time range had no effect at all.
IPv6 traffic filters¶
IPv6 ACLs look similar but differ in ways the exam likes to test.
| IPv4 ACL | IPv6 ACL | |
|---|---|---|
| Naming | Numbered or named | Named only |
| Addresses | Address and wildcard | Prefix and length, e.g. 2001:DB8:10::/64 |
| Applied to an interface | ip access-group NAME in |
ipv6 traffic-filter NAME in |
| Applied to VTY lines | access-class NAME in |
ipv6 access-class NAME in |
| Standard versus extended | Separate types | One type, always extended |
| Implicit entries at the end | deny ip any any |
permit icmp any any nd-na, permit icmp any any nd-ns, deny ipv6 any any |
Why the implicit ND permits matter¶
IPv6 has no ARP. Neighbor Solicitation (NS) and Neighbor Advertisement (NA) messages replace it, and they are ICMPv6. The two implicit permits keep address resolution working under a restrictive ACL. Any explicit deny ipv6 any any that you add is placed above the implicit lines and removes that protection. Neighbor cache entries then age out, and the link fails a few minutes after the ACL was applied.
The implicit permits cover only NS and NA. They do not cover:
| Traffic | Why you might need it | Match |
|---|---|---|
| Router Solicitation and Router Advertisement | A router interface that learns its address or default route by SLAAC from upstream, or hosts sending RS to the router | permit icmp any any router-advertisement, permit icmp any any router-solicitation |
| Packet Too Big | Path MTU discovery. IPv6 routers do not fragment, so blocking it breaks large transfers | permit icmp any any packet-too-big |
| OSPFv3 | Hellos to FF02::5 from link-local addresses | permit 89 FE80::/10 any |
| EIGRP for IPv6 | Hellos to FF02::A from link-local addresses | permit 88 FE80::/10 any |
| DHCPv6 | Client to server on UDP 547, server to client on UDP 546 | permit udp any any eq 547 |
ipv6 access-list LAN-IN
sequence 10 permit icmp any any nd-ns
sequence 20 permit icmp any any nd-na
sequence 30 permit icmp any any router-solicitation
sequence 40 permit udp any any eq 547
sequence 50 permit tcp 2001:DB8:10::/64 any eq 443
sequence 60 permit icmp 2001:DB8:10::/64 any
sequence 70 deny ipv6 any any log
!
interface GigabitEthernet0/1
ipv6 address 2001:DB8:10::1/64
ipv6 traffic-filter LAN-IN in
!
line vty 0 15
ipv6 access-class MGMT6 in
R1# show ipv6 access-list LAN-IN
IPv6 access list LAN-IN
permit icmp any any nd-ns (311 matches) sequence 10
permit icmp any any nd-na (296 matches) sequence 20
permit icmp any any router-solicitation (4 matches) sequence 30
permit udp any any eq 547 (12 matches) sequence 40
permit tcp 2001:DB8:10::/64 any eq 443 (9120 matches) sequence 50
permit icmp 2001:DB8:10::/64 any (88 matches) sequence 60
deny ipv6 any any log (41 matches) sequence 70
R1# show ipv6 interface GigabitEthernet0/1 | include access list
Input features: Access List
Inbound access list LAN-IN
Exam trap
An IPv6 ACL on an interface that runs OSPFv3 must allow traffic from link-local sources. A line such as permit 89 2001:DB8::/32 any looks right but matches nothing, because OSPFv3 packets are sourced from FE80:: addresses. The adjacency never forms, and show ospfv3 neighbor is empty.
Lab: ACL break/fix¶
Topology
graph LR
LAN1["Lo10 10.10.10.1/24<br/>2001:db8:10::1/64"] --- R1
R1 -- "Gi0/0 .1 10.1.2.0/30 .2 Gi0/0<br/>2001:db8:1:2::/64" --- R2
R2 -- "Gi0/1 .1 10.2.3.0/30 .2 Gi0/1<br/>2001:db8:2:3::/64" --- R3
R3 --- SRV["Lo30 10.3.30.1/24<br/>2001:db8:30::1/64"]
Run OSPFv2 and OSPFv3 area 0 on every interface. R1's loopback stands in for a user LAN, R3's loopback for a server LAN. Enable ip http server and ip http secure-server on R3 so TCP 80 and 443 answer, and enable SSH on R3. Generate traffic from R1 with telnet 10.3.30.1 80 /source-interface Loopback10 and ping 10.3.30.1 source Loopback10.
Requirement: from the user LAN to the server LAN, permit HTTPS and ICMP only. SSH to the servers is allowed from the user LAN only during business hours. Routing must stay up.
Steps
- Configure NTP or set the clock and time zone on R2 so
show clockis correct. -
On R2, build and apply the baseline policy inbound on Gi0/0:
time-range BUSINESS periodic weekdays 8:00 to 18:00 ip access-list extended USERS-IN 10 permit ospf any any 20 permit tcp 10.10.10.0 0.0.0.255 10.3.30.0 0.0.0.255 eq 443 30 permit tcp 10.10.10.0 0.0.0.255 10.3.30.0 0.0.0.255 eq 22 time-range BUSINESS 40 permit icmp 10.10.10.0 0.0.0.255 10.3.30.0 0.0.0.255 50 deny ip any any log interface GigabitEthernet0/0 ip access-group USERS-IN in -
Verify: OSPF to R1 stays FULL,
telnet 10.3.30.1 443 /source-interface Loopback10connects, port 80 is refused, andshow access-lists USERS-INshows counters on lines 10, 20 and 50. Save a baseline. - Break 1: remove line 10. Wait for the dead interval (40 seconds on Ethernet). Expected:
%OSPF-5-ADJCHG ... Dead timer expiredon R2, and line 50 counters climb with log messages for protocol 89 from 10.1.2.1 to 224.0.0.5. Restore line 10. - Break 2: on Gi0/0 replace the access-group with
ip access-group USER-IN in(missing S). Expected: everything is permitted, including port 80.show ip interface Gi0/0names an ACL thatshow access-listsdoes not have. Fix the name. - Break 3: change the router clock so it is a Saturday (
clock setwith NTP disabled). Expected: line 30 shows(inactive)and SSH falls through to line 50. Restore the clock. -
IPv6 part: apply this on R2 Gi0/0 and observe the result over five minutes:
ipv6 access-list USERS6-IN sequence 10 permit tcp 2001:DB8:10::/64 2001:DB8:30::/64 eq 443 sequence 20 deny ipv6 any any log interface GigabitEthernet0/0 ipv6 traffic-filter USERS6-IN inExpected: the OSPFv3 adjacency to R1 drops (link-local protocol 89 denied), and after the neighbor cache ages out even permitted HTTPS fails (NS and NA denied). Fix by adding
permit 89 FE80::/10 any,permit icmp any any nd-nsandpermit icmp any any nd-naahead of sequence 20.
Expected verification output when fixed
R2# show ipv6 access-list USERS6-IN
IPv6 access list USERS6-IN
permit 89 FE80::/10 any (52 matches) sequence 5
permit icmp any any nd-ns (6 matches) sequence 6
permit icmp any any nd-na (6 matches) sequence 7
permit tcp 2001:DB8:10::/64 2001:DB8:30::/64 eq 443 (24 matches) sequence 10
deny ipv6 any any log (17 matches) sequence 20
R2# show ospfv3 neighbor
OSPFv3 1 address-family ipv6 (router-id 10.255.255.2)
Neighbor ID Pri State Dead Time Interface ID Interface
10.255.255.1 1 FULL/DR 00:00:36 3 GigabitEthernet0/0
Quick check¶
An extended ACL is applied outbound on R1 Gi0/2 to block ICMP to a server. Pings from hosts behind R1 are blocked, but a ping from R1 itself still reaches the server. Why?
Outbound interface ACLs do not filter packets the router originates. The router's own ping is not subject to the ACL. This is expected behaviour, not a fault.
An IPv4 ACL has a permit entry that references a periodic time range. Outside the window, what happens to a packet that would have matched that entry?
The entry is inactive and is skipped. The packet is compared with the following entries. If nothing else matches, the implicit deny drops it.
Which IPv6 traffic is still permitted by the implicit entries at the end of an IPv6 ACL, and which common traffic is not?
Neighbor Solicitations and Neighbor Advertisements are permitted. Router Solicitations, Router Advertisements, Packet Too Big, routing protocols and DHCPv6 are not, and must be permitted explicitly when the ACL ends in a deny.
References¶
- Cisco IOS XE Security Configuration Guide: Access Control Lists (search on cisco.com for "IP Access List Overview" and "IPv6 Access Control Lists")
- Cisco IOS XE: "Time-Based Access Lists" feature guide (search on cisco.com)
- RFC 4861: Neighbor Discovery for IPv6
- RFC 4890: Recommendations for Filtering ICMPv6 Messages in Firewalls
- Cisco Live On-Demand Library: search "IPv6 security" and "infrastructure ACL"
- Related practice: ENARSI bank questions 61 to 66, diagram N29
Unlock the full question banks and cram sheets
A free account opens every question bank, the timed practice exams, the printable cram sheets, all the simulations and the lab files. Without one you see a 5-question sample of each.
No card needed. Study tips by email are optional and off unless you tick the box. Your address is never sold or shared. Privacy policy ยท Terms
Signed in as . Your account
You're on the free account, so lessons after the first module, question banks, exams and cram sheets show a sample. See Track Pass and All-Access
Also from NetManager Systems: NetManager, network monitoring for multi-vendor networks. Try the NetManager, NetDiag, PCAP Analyzer and OpsDash demos: every new account gets a free 7-day read-only login to each.