Cisco ACL Cheat Sheet
Access-List từ cơ bản đến nâng cao — Cisco IOS
Standard
Extended
Named
IPv6
Time-based
Reflexive
Tổng quan
Standard ACL
Extended ACL
Named ACL
Wildcard Mask
Kịch bản thực tế
Nâng cao
IPv6 ACL
Verify & Debug
Giải phẫu một dòng ACL Extended — Extended ACL Anatomy
Cú pháp đầy đủ:
Keywordaccess-list
Number100
Actionpermit
Protocoltcp
Source IP192.168.1.0
Wildcard0.0.0.255
Dest IPany
Porteq 443
→ access-list 100 permit tcp 192.168.1.0 0.0.0.255 any eq 443
Nghĩa: Cho phép traffic TCP từ mạng 192.168.1.0/24 đến bất kỳ đích nào, port đích 443 (HTTPS)
Nghĩa: Cho phép traffic TCP từ mạng 192.168.1.0/24 đến bất kỳ đích nào, port đích 443 (HTTPS)
Cú pháp Standard ACL:
Keywordaccess-list
Number10
Actionpermit
Source IP192.168.1.0
Wildcard0.0.0.255
Standard ACL chỉ lọc theo địa chỉ nguồn — không kiểm tra protocol hay port đích.
Luồng xử lý ACL
Packet
đến
đến
Interface
nhận
nhận
ACL
gán IN?
gán IN?
Yes →
kiểm tra
kiểm tra
Quá trình kiểm tra từng entry (top-down):
Match + permit
→
Cho packet đi qua tiếp tục xử lý
Match + deny
→
Drop packet, gửi ICMP unreachable
No match
→
Kiểm tra entry tiếp theo
Hết entries
→
Implicit deny any — drop tất cả!
Các loại ACL — Phân loại
| Theo số (Numbered) | ||
| 1 – 99 | Standard | Chỉ lọc theo Source IP |
| 100 – 199 | Extended | Lọc src/dst IP, protocol, port |
| 1300 – 1999 | Standard | Standard mở rộng (IOS mới) |
| 2000 – 2699 | Extended | Extended mở rộng (IOS mới) |
| Theo tên (Named) — khuyến nghị | ||
| ip access-list standard NAME | Named Std | Dễ đặt tên, sửa từng entry |
| ip access-list extended NAME | Named Ext | Linh hoạt nhất, dùng sequence |
| Loại đặc biệt | ||
| ip access-list extended | Reflexive | Dynamic — tự tạo entry trả lời |
| time-range + ACL | Time-based | Lọc theo thời gian |
| ipv6 access-list NAME | IPv6 ACL | Named only, không có numbered |
Quy tắc vàng — ACL Golden Rules
| ① | Top-down processing — Khớp entry đầu tiên là dừng, không kiểm tra tiếp |
| ② | Implicit deny any — Cuối mỗi ACL luôn có deny any ẩn — phải có ít nhất 1 permit |
| ③ | Standard → gần đích — Standard ACL chỉ lọc src → đặt gần destination tránh chặn nhầm |
| ④ | Extended → gần nguồn — Extended ACL lọc cụ thể → đặt gần source tiết kiệm băng thông |
| ⑤ | Chỉ 1 ACL/interface/direction — 1 interface = 1 ACL in + 1 ACL out tối đa |
| ⑥ | Specific trước, general sau — host cụ thể → subnet → any |
| ⑦ | Log deny — Luôn thêm deny any log để theo dõi traffic bị chặn |
| ⑧ | Test trước khi áp — Kiểm tra logic ACL bằng show access-lists trước khi gán vào interface |
Chiều áp dụng ACL — IN vs OUT
| ACL inbound (in) | |
| ip access-group ACL_NAME in | Lọc packet trước khi router xử lý/định tuyến — packet bị drop không vào routing table |
| Ưu điểm | Tiết kiệm tài nguyên — drop sớm, không tốn CPU routing |
| Dùng khi | Bảo vệ router, lọc traffic đến từ untrusted network |
| ACL outbound (out) | |
| ip access-group ACL_NAME out | Lọc packet sau khi router định tuyến xong, trước khi gửi ra interface |
| Ưu điểm | Có thể dùng 1 ACL cho nhiều nguồn đến cùng đích |
| Dùng khi | Kiểm soát traffic rời khỏi network cụ thể |
| Lưu ý quan trọng | |
| Router's own traffic | ACL inbound không ảnh hưởng traffic do chính router tạo ra (OSPF hello, ping từ router...) |
| VTY access-class | access-class cho VTY — chỉ áp dụng chiều in để kiểm soát ai SSH được vào |
Nhớ nhanh vị trí đặt ACL: Standard ACL số nhỏ (1–99) → đặt gần đích (destination). Extended ACL số lớn (100–199) → đặt gần nguồn (source). Named ACL → linh hoạt, chỉnh sửa được từng sequence entry.
Standard ACL — Numbered (1–99)
| Cú pháp cơ bản | |
| access-list 10 permit host 192.168.1.5 | Permit một host cụ thể (/32) |
| access-list 10 permit 192.168.1.0 0.0.0.255 | Permit cả subnet /24 |
| access-list 10 permit 10.0.0.0 0.255.255.255 | Permit toàn bộ 10.x.x.x (/8) |
| access-list 10 permit any | Permit tất cả = permit 0.0.0.0 255.255.255.255 |
| access-list 10 deny host 192.168.1.99 | Deny một host cụ thể |
| access-list 10 deny 192.168.2.0 0.0.0.255 | Deny một subnet |
| access-list 10 deny any | Deny tất cả (tường minh hóa implicit deny) |
| Gán vào interface | |
| int gi0/1 ip access-group 10 in | Lọc traffic đến router từ gi0/1 |
| int gi0/1 ip access-group 10 out | Lọc traffic rời router qua gi0/1 |
| int gi0/1 no ip access-group 10 in | Gỡ ACL khỏi interface |
| Gán vào VTY (quản lý truy cập) | |
| line vty 0 4 access-class 10 in | Chỉ IP trong ACL 10 mới SSH/Telnet được |
| line vty 0 4 access-class 10 out | Giới hạn router telnet ra ngoài |
Standard ACL — Named
| Tạo Named Standard ACL | |
| ip access-list standard MGMT_ACCESS | Tạo named standard ACL |
| 10 permit host 10.0.0.5 | Seq 10: permit host quản trị |
| 20 permit 172.16.0.0 0.0.255.255 | Seq 20: permit toàn bộ 172.16/16 |
| 30 permit 192.168.100.0 0.0.0.255 | Seq 30: permit subnet quản lý |
| 40 deny any log | Seq 40: deny tất cả + ghi log |
| Chỉnh sửa Named ACL (không xóa toàn bộ) | |
| ip access-list standard MGMT_ACCESS no 30 | Xóa sequence 30 |
| 25 permit 192.168.200.0 0.0.0.255 | Thêm entry mới giữa seq 20 và 30 |
| 30 permit 192.168.100.0 0.0.0.255 | Thêm lại seq 30 mới |
| Resequence (đánh lại số thứ tự) | |
| ip access-list resequence MGMT_ACCESS 10 10 | Bắt đầu từ 10, bước nhảy 10 (10,20,30...) |
| Gán vào interface / VTY | |
| int gi0/0 ip access-group MGMT_ACCESS in | Gán named ACL vào interface |
| line vty 0 15 access-class MGMT_ACCESS in | Gán named ACL vào VTY |
Ví dụ Standard ACL thực tế
Ví dụ 1: Chỉ cho phép mạng IT quản lý router
! Chỉ subnet IT 10.1.1.0/24 được SSH vào router
ip access-list standard SSH_ALLOWED
10 permit 10.1.1.0 0.0.0.255
20 deny any log
!
line vty 0 15
access-class SSH_ALLOWED in
transport input ssh
Ví dụ 2: Chặn user cụ thể ra Internet
! Chặn PC của nhân viên thực tập (192.168.1.50)
access-list 15 deny host 192.168.1.50
access-list 15 permit 192.168.1.0 0.0.0.255
access-list 15 deny any log
!
interface gi0/1 ! WAN interface
ip access-group 15 out
Cẩn thận khi sửa Numbered ACL: Numbered ACL (
access-list 10 ...) không sửa từng dòng được — phải no access-list 10 xóa toàn bộ rồi viết lại. Named ACL cho phép xóa/thêm từng sequence entry → luôn nên dùng Named ACL trong production.Extended ACL — Numbered (100–199)
| Cú pháp: access-list [100-199] [permit|deny] [protocol] [src] [wildcard] [dst] [wildcard] [operator port] | |
| Lọc theo Protocol | |
| access-list 100 permit ip any any | Cho phép tất cả IP traffic |
| access-list 100 permit tcp any any | Cho phép tất cả TCP |
| access-list 100 permit udp any any | Cho phép tất cả UDP |
| access-list 100 permit icmp any any | Cho phép ICMP (ping) |
| access-list 100 deny ospf any any | Deny OSPF protocol |
| access-list 100 deny eigrp any any | Deny EIGRP protocol |
| Lọc theo Port (TCP/UDP) | |
| ... eq 80 | eq equal — bằng đúng port 80 |
| ... gt 1023 | gt greater than — lớn hơn 1023 |
| ... lt 1024 | lt less than — nhỏ hơn 1024 |
| ... neq 23 | neq not equal — khác port 23 |
| ... range 8080 8090 | range — từ 8080 đến 8090 |
| Từ khóa đặc biệt | |
| ... established | TCP established — ACK hoặc RST set (return traffic) |
| ... fragments | Áp dụng cho fragment packet |
| ... log | Ghi log khi khớp entry |
| ... log-input | Log kèm theo interface input |
| ... ttl eq 1 | Lọc theo TTL value |
| ... dscp ef | Lọc theo DSCP marking (QoS) |
| ... tos 16 | Lọc theo ToS byte |
Well-Known Ports — Tham chiếu nhanh
| Protocol | Port | Keyword IOS | Dùng trong ACL |
|---|---|---|---|
| FTP Data | TCP 20 | ftp-data | eq ftp-data |
| FTP Control | TCP 21 | ftp | eq ftp |
| SSH | TCP 22 | 22 | eq 22 |
| Telnet | TCP 23 | telnet | eq telnet |
| SMTP (Mail) | TCP 25 | smtp | eq smtp |
| DNS | UDP/TCP 53 | domain | eq domain |
| DHCP Server | UDP 67 | bootps | eq bootps |
| TFTP | UDP 69 | tftp | eq tftp |
| HTTP | TCP 80 | www | eq www hoặc eq 80 |
| POP3 (Mail) | TCP 110 | pop3 | eq pop3 |
| NTP | UDP 123 | ntp | eq ntp |
| SNMP | UDP 161 | snmp | eq snmp |
| HTTPS | TCP 443 | 443 | eq 443 |
| SMB (Windows) | TCP 445 | 445 | eq 445 |
| IMAP | TCP 143 | imap4 | eq 143 |
| RDP | TCP 3389 | 3389 | eq 3389 |
| MySQL | TCP 3306 | 3306 | eq 3306 |
| Syslog | UDP 514 | 514 | eq 514 |
Extended ACL — Ví dụ thực tế đầy đủ
Ví dụ 1: Firewall ACL cho LAN ra Internet
! LAN 192.168.1.0/24 ra Internet qua gi0/1
access-list 100 permit tcp 192.168.1.0 0.0.0.255 any eq 80
access-list 100 permit tcp 192.168.1.0 0.0.0.255 any eq 443
access-list 100 permit tcp 192.168.1.0 0.0.0.255 any eq 22
access-list 100 permit udp 192.168.1.0 0.0.0.255 any eq 53
access-list 100 permit icmp 192.168.1.0 0.0.0.255 any
access-list 100 permit tcp any any established
access-list 100 deny ip any any log
!
interface gi0/0 ! LAN interface
ip access-group 100 in
Ví dụ 2: Bảo vệ server trong DMZ
! Chỉ cho phép traffic cần thiết vào Web Server
access-list 110 permit tcp any host 10.0.1.10 eq 80
access-list 110 permit tcp any host 10.0.1.10 eq 443
! Chỉ admin 10.0.0.5 được SSH vào server
access-list 110 permit tcp host 10.0.0.5 host 10.0.1.10 eq 22
access-list 110 deny ip any host 10.0.1.10 log
access-list 110 permit ip any any
!
interface gi0/2 ! DMZ interface
ip access-group 110 out
Ví dụ 3: Phân cách giữa các VLAN
! VLAN 10 (HR) không được truy cập VLAN 20 (Finance)
access-list 120 deny ip 192.168.10.0 0.0.0.255 192.168.20.0 0.0.0.255 log
! Nhưng Finance có thể ra Internet
access-list 120 permit ip 192.168.10.0 0.0.0.255 any
!
interface vlan 10
ip access-group 120 in
Ví dụ 4: Chặn Telnet, cho phép SSH
! Chặn Telnet (port 23), cho phép SSH (port 22)
access-list 130 deny tcp any any eq telnet log
access-list 130 permit tcp 10.0.0.0 0.0.0.255 any eq 22
access-list 130 permit ip any any
!
interface gi0/0
ip access-group 130 in
TCP established:
permit tcp any any established cho phép return traffic của các kết nối TCP đã được khởi tạo từ bên trong. Đây là cơ chế stateless "pseudo-stateful" — chỉ kiểm tra ACK/RST bit, không theo dõi session như stateful firewall.Named ACL — Cú pháp đầy đủ
| Tạo Named Standard ACL | |
| ip access-list standard ACL_NAME | Vào config mode của named standard ACL |
| [seq] permit|deny [src] [wildcard] | Thêm entry (sequence tự động 10, 20, 30...) |
| Tạo Named Extended ACL | |
| ip access-list extended ACL_NAME | Vào config mode của named extended ACL |
| [seq] permit|deny [proto] [src] [wc] [dst] [wc] [port] [options] | Entry với đầy đủ tùy chọn |
| Quản lý sequence numbers | |
| 10 permit host 192.168.1.1 | Entry với sequence 10 |
| no 10 | Xóa entry có sequence 10 |
| 15 permit host 192.168.1.2 | Thêm entry giữa 10 và 20 |
| ip access-list resequence FIREWALL 5 5 | Resequence: bắt đầu 5, bước 5 → 5,10,15,20... |
| Remarks (chú thích) | |
| remark === SECTION: Web Traffic === | Thêm chú thích vào ACL |
| remark Allow HTTP from LAN | Giải thích mục đích entry tiếp theo |
| Xóa Named ACL | |
| no ip access-list extended FIREWALL | Xóa toàn bộ named ACL |
| no ip access-list standard MGMT | Xóa named standard ACL |
Named vs Numbered — So sánh
| Tiêu chí | Numbered ACL | Named ACL |
|---|---|---|
| Cấu hình | ||
| Syntax | access-list 100 permit... | ip access-list extended NAME |
| Đặt tên mô tả | Chỉ có số | Tên rõ ràng (FIREWALL, DMZ_IN...) |
| Xóa từng entry | Phải xóa toàn bộ | no [sequence_number] |
| Thêm entry giữa | Không thể | Dùng sequence trung gian |
| Resequence | Không hỗ trợ | ip access-list resequence |
| Remark/comment | Hạn chế | remark trong ACL |
| Ứng dụng | ||
| Interface | ip access-group 100 in | ip access-group NAME in |
| VTY | access-class 10 in | access-class NAME in |
| NAT | ip nat inside source list 1 | ip nat inside source list NAME |
| Route-map | match ip address 100 | match ip address NAME |
| Khuyến nghị | ||
| Production | Hạn chế — khó quản lý | Nên dùng — linh hoạt, rõ ràng |
| Lab/học tập | Nhanh gọn | Cũng dùng được |
Named ACL thực tế — Production-grade Firewall
Named Extended ACL đầy đủ với remarks và sequence
! ========================================
! Named Extended ACL: INTERNET_FIREWALL
! Applied: interface gi0/0 (LAN) in
! ========================================
ip access-list extended INTERNET_FIREWALL
!
remark === DNS Traffic ===
10 permit udp 192.168.0.0 0.0.255.255 any eq domain
15 permit tcp 192.168.0.0 0.0.255.255 any eq domain
!
remark === Web Traffic ===
20 permit tcp 192.168.0.0 0.0.255.255 any eq www
30 permit tcp 192.168.0.0 0.0.255.255 any eq 443
!
remark === Email ===
40 permit tcp 192.168.0.0 0.0.255.255 any eq smtp
50 permit tcp 192.168.0.0 0.0.255.255 any eq pop3
60 permit tcp 192.168.0.0 0.0.255.255 any eq 143
!
remark === Return Traffic (TCP established) ===
70 permit tcp any any established
80 permit udp any 192.168.0.0 0.0.255.255 gt 1023
!
remark === ICMP ===
90 permit icmp any 192.168.0.0 0.0.255.255 echo-reply
95 permit icmp any 192.168.0.0 0.0.255.255 unreachable
!
remark === Deny Everything Else ===
100 deny ip any any log
!
interface gi0/0
ip access-group INTERNET_FIREWALL in
Best practice sequence numbering: Dùng bước nhảy 10 (10, 20, 30...) để luôn có chỗ chèn entry mới giữa. Dùng
remark để nhóm và mô tả logic của từng section. Resequence định kỳ khi sequence bị phân mảnh.Wildcard Mask — Nguyên tắc tính
| Quy tắc | |
| Bit 0 | Phải khớp — bit này của địa chỉ phải giống nhau |
| Bit 1 | Bỏ qua — bit này không cần kiểm tra |
| Wildcard = ? | Wildcard = 255.255.255.255 − Subnet Mask |
| Ví dụ tính wildcard | |
| /24 → 255.255.255.0 | 255.255.255.255 − 255.255.255.0 = 0.0.0.255 |
| /16 → 255.255.0.0 | 255.255.255.255 − 255.255.0.0 = 0.0.255.255 |
| /8 → 255.0.0.0 | 255.255.255.255 − 255.0.0.0 = 0.255.255.255 |
| /25 → 255.255.255.128 | 255.255.255.255 − 255.255.255.128 = 0.0.0.127 |
| /26 → 255.255.255.192 | 255.255.255.255 − 255.255.255.192 = 0.0.0.63 |
| /27 → 255.255.255.224 | 255.255.255.255 − 255.255.255.224 = 0.0.0.31 |
| /28 → 255.255.255.240 | 255.255.255.255 − 255.255.255.240 = 0.0.0.15 |
| /29 → 255.255.255.248 | 255.255.255.255 − 255.255.255.248 = 0.0.0.7 |
| /30 → 255.255.255.252 | 255.255.255.255 − 255.255.255.252 = 0.0.0.3 |
Wildcard Mask — Ví dụ đặc biệt
| Từ khóa đặc biệt | |
| host 192.168.1.5 | = 192.168.1.5 0.0.0.0 — chính xác 1 IP |
| any | = 0.0.0.0 255.255.255.255 — tất cả IP |
| Wildcard cho IP lẻ không phải subnet chuẩn | |
| Chẵn/Lẻ — odd/even | 192.168.1.0 0.0.0.1 → khớp .0 và .1 (bit cuối bỏ qua) |
| Bội số 4 | 192.168.1.0 0.0.0.3 → khớp .0, .1, .2, .3 |
| Bội số 8 | 192.168.1.0 0.0.0.7 → khớp .0 đến .7 |
| Summarize nhiều subnet | |
| 192.168.0.0 + 192.168.1.0 | → 192.168.0.0 0.0.1.255 (2 subnet /24) |
| 10.1.0.0 đến 10.1.3.0 | → 10.1.0.0 0.0.3.255 (4 subnet /24) |
| 10.1.0.0 đến 10.1.7.0 | → 10.1.0.0 0.0.7.255 (8 subnet /24) |
| Wildcard với OSPF network statement | |
| network 192.168.1.1 0.0.0.0 area 0 | Chính xác interface có IP .1 (host wildcard) |
| network 0.0.0.0 255.255.255.255 area 0 | Tất cả interface (any wildcard) |
Bảng tham chiếu nhanh Wildcard Mask
0.0.0.0
= host
Chính xác 1 địa chỉ IP/32
0.0.0.1
2 hosts
Chỉ 2 IP (chẵn + lẻ liền kề)/31
0.0.0.3
4 hosts
4 địa chỉ liên tiếp/30
0.0.0.7
8 hosts
8 địa chỉ liên tiếp/29
0.0.0.15
16 hosts
16 địa chỉ liên tiếp/28
0.0.0.31
32 hosts
32 địa chỉ liên tiếp/27
0.0.0.63
64 hosts
64 địa chỉ liên tiếp/26
0.0.0.127
128 hosts
128 địa chỉ liên tiếp/25
0.0.0.255
256 hosts
Subnet /24 đầy đủ/24
0.0.1.255
512 hosts
2 subnet /24 liên tiếp/23
0.0.3.255
1024 hosts
4 subnet /24 liên tiếp/22
0.0.7.255
2048 hosts
8 subnet /24 liên tiếp/21
0.0.15.255
4096 hosts
16 subnet /24/20
0.0.255.255
65536 hosts
Subnet /16 đầy đủ/16
0.255.255.255
16M hosts
Subnet /8 đầy đủ/8
255.255.255.255
= any
Tất cả địa chỉ IP/0
Công thức nhớ: Wildcard = 255.255.255.255 – Subnet Mask. Ví dụ /26 = mask 255.255.255.192 → wildcard = 255.255.255.255 – 255.255.255.192 = 0.0.0.63. Wildcard bit 0 = phải khớp, bit 1 = bỏ qua (ngược với subnet mask).
Kịch bản 1: Mạng doanh nghiệp văn phòng
Topology: LAN (192.168.1.0/24) → Router → Internet
Yêu cầu: LAN được ra web, email. Server 192.168.1.10 được SSH từ ngoài. Chặn tất cả còn lại.
! ── Cho LAN ra Internet ──
ip access-list extended LAN_TO_INTERNET
remark Web & Email
10 permit tcp 192.168.1.0 0.0.0.255 any eq 80
20 permit tcp 192.168.1.0 0.0.0.255 any eq 443
30 permit tcp 192.168.1.0 0.0.0.255 any eq smtp
40 permit udp 192.168.1.0 0.0.0.255 any eq domain
50 permit tcp any any established
60 deny ip any any log
!
! ── Cho Internet vào Web Server ──
ip access-list extended INTERNET_TO_LAN
10 permit tcp any host 203.0.113.10 eq 22
20 permit tcp any any established
30 deny ip any any log
!
int gi0/0 ! LAN
ip access-group LAN_TO_INTERNET in
int gi0/1 ! WAN
ip access-group INTERNET_TO_LAN in
Kịch bản 2: Bảo vệ DMZ (3-legged firewall)
DMZ: 10.0.1.0/24 · LAN: 192.168.1.0/24 · WAN: gi0/2
Yêu cầu: Internet vào được Web/Mail server trong DMZ. LAN admin SSH vào server. DMZ không được vào LAN.
! ── Internet → DMZ ──
ip access-list extended WAN_TO_DMZ
10 permit tcp any host 10.0.1.10 eq 80
20 permit tcp any host 10.0.1.10 eq 443
30 permit tcp any host 10.0.1.20 eq smtp
40 deny ip any any log
!
! ── LAN → DMZ (admin access) ──
ip access-list extended LAN_TO_DMZ
10 permit tcp host 192.168.1.5 10.0.1.0 0.0.0.255 eq 22
20 permit icmp 192.168.1.0 0.0.0.255 10.0.1.0 0.0.0.255
30 deny ip any any log
!
! ── DMZ → LAN (BLOCK!) ──
ip access-list extended DMZ_TO_LAN
10 deny ip 10.0.1.0 0.0.0.255 192.168.1.0 0.0.0.255 log
20 permit tcp 10.0.1.0 0.0.0.255 any established
30 permit udp 10.0.1.0 0.0.0.255 any eq domain
40 deny ip any any log
Kịch bản 3: Phân cách VLAN trong campus
VLAN 10 HR · VLAN 20 Finance · VLAN 30 IT · VLAN 99 Mgmt
Yêu cầu: HR và Finance không được truy cập nhau. IT được truy cập tất cả. Chỉ VLAN 99 SSH vào thiết bị.
! ── HR không vào Finance ──
ip access-list extended VLAN10_POLICY
10 deny ip 192.168.10.0 0.0.0.255 192.168.20.0 0.0.0.255 log
20 permit ip 192.168.10.0 0.0.0.255 any
!
! ── Finance không vào HR ──
ip access-list extended VLAN20_POLICY
10 deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 log
20 permit ip 192.168.20.0 0.0.0.255 any
!
! ── SSH chỉ từ VLAN Mgmt ──
ip access-list standard SSH_MGMT
10 permit 192.168.99.0 0.0.0.255
20 deny any log
!
interface vlan 10
ip access-group VLAN10_POLICY in
interface vlan 20
ip access-group VLAN20_POLICY in
line vty 0 15
access-class SSH_MGMT in
Kịch bản 4: Giờ làm việc (Time-based ACL)
Cho phép social media chỉ ngoài giờ làm việc
Yêu cầu: Chặn Facebook/YouTube 8h-18h thứ 2-6. Ngoài giờ và cuối tuần: cho phép.
! Bước 1: Khai báo time-range
time-range WORK_HOURS
periodic weekdays 8:00 to 18:00
!
time-range LUNCH_BREAK
periodic weekdays 12:00 to 13:00
!
! Bước 2: Tạo ACL với time-range
ip access-list extended SOCIAL_POLICY
remark Allow lunch break
10 permit tcp any any eq 443 time-range LUNCH_BREAK
remark Block social media during work hours
20 deny tcp any host 31.13.72.36 eq 443 time-range WORK_HOURS
30 deny tcp any host 142.250.0.0 0.0.255.255 eq 443 time-range WORK_HOURS
40 permit ip any any
!
show time-range ! Kiểm tra trạng thái active/inactive
Thiết kế ACL tốt: (1) Xác định rõ yêu cầu bảo mật trước khi viết. (2) Vẽ topology và luồng traffic. (3) Viết permit các service cần thiết. (4) Kết thúc bằng
deny any log. (5) Test trên lab trước khi deploy production. (6) Dùng show ip access-lists kiểm tra hit counter.Reflexive ACL — Dynamic Session Tracking
| Khái niệm | |
| Reflexive ACL | Tự động tạo temporary permit entry cho return traffic — stateless "stateful" |
| reflect keyword | Tạo dynamic entry theo dõi session outbound |
| evaluate keyword | Kiểm tra inbound traffic với dynamic entries đã tạo |
| Cấu hình | |
| ip access-list extended OUTBOUND permit tcp 192.168.1.0 0.0.0.255 any reflect TCP_SESSION permit udp 192.168.1.0 0.0.0.255 any reflect UDP_SESSION permit icmp 192.168.1.0 0.0.0.255 any reflect ICMP_SESSION | Outbound ACL tạo dynamic session tracking |
| ip access-list extended INBOUND evaluate TCP_SESSION evaluate UDP_SESSION evaluate ICMP_SESSION deny ip any any log | Inbound ACL chỉ cho phép return của session đã mở |
| int gi0/1 ip access-group OUTBOUND out ip access-group INBOUND in | Gán cả 2 ACL vào interface WAN |
| ip reflexive-list timeout 300 | Timeout dynamic entry sau 300s không hoạt động |
| Kiểm tra | |
| show ip access-lists INBOUND | Xem dynamic entries tạo tự động |
Time-based ACL — Đầy đủ
| Time-range types | |
| time-range WEEKEND periodic weekend 00:00 to 23:59 | Cuối tuần tất cả ngày |
| time-range NIGHT periodic daily 22:00 to 06:00 | Mỗi ngày từ 22h đến 6h sáng |
| time-range HOLIDAY absolute start 00:00 01 January 2026 end 23:59 03 January 2026 | Khoảng thời gian cố định (absolute) |
| time-range TEMP periodic weekdays 09:00 to 17:00 periodic weekend 10:00 to 16:00 | Kết hợp nhiều periodic trong 1 time-range |
| Gán time-range vào ACL | |
| ip access-list extended TIME_ACL 10 permit tcp any any eq 80 time-range WORK_HOURS 20 deny tcp any any eq 80 log | Cho phép HTTP chỉ trong giờ làm việc |
| Yêu cầu | |
| NTP sync | Router phải đồng bộ NTP chính xác, nếu không time-range sẽ inactive |
| show time-range | Xem trạng thái: active / inactive |
| show clock | Kiểm tra thời gian router |
ACL với CBAC / Zone-based Firewall
| Zone-Based Firewall (ZBF) — IOS 12.4+ | |
| zone security INSIDE | Tạo security zone INSIDE |
| zone security OUTSIDE | Tạo security zone OUTSIDE |
| zone security DMZ | Tạo security zone DMZ |
| class-map type inspect match-any WEB_TRAFFIC match protocol http match protocol https | Class-map phân loại Web traffic |
| policy-map type inspect IN_TO_OUT class WEB_TRAFFIC inspect class class-default drop log | Policy: inspect web, drop khác |
| zone-pair security IN-TO-OUT source INSIDE destination OUTSIDE service-policy type inspect IN_TO_OUT | Áp policy cho zone-pair |
| int gi0/0 zone-member security INSIDE | Gán interface vào zone |
| Kiểm tra ZBF | |
| show policy-map type inspect zone-pair | Thống kê traffic theo policy |
| show zone security | Xem zone và member interfaces |
ACL Performance & Best Practices
| Tối ưu hiệu năng ACL | |
| Specific first | Đặt entry khớp nhiều nhất (specific) lên đầu → giảm số entries cần kiểm tra |
| Permit first nếu có thể | Nếu hầu hết traffic được permit: permit lên đầu, deny ở sau |
| Avoid fragment check | Kiểm tra fragment tốn CPU — chỉ thêm khi cần thiết |
| Log sparingly | log tốn CPU — chỉ dùng cho deny entries quan trọng |
| CEF compatible | ACL với log vô hiệu hóa CEF switching → process switching (chậm hơn) |
| Maintenance | |
| clear ip access-list counters | Reset hit counter để đánh giá traffic mới |
| show ip access-lists | count | Đếm số entries trong ACL |
| Backup trước khi sửa | show run | section ip access-list → copy ra text editor |
| Test bằng ACL simulation | Packet Tracer / GNS3 / EVE-NG trước khi deploy |
| Common mistakes | |
| Deny trước permit | Viết deny quá rộng trước permit cụ thể → chặn nhầm traffic hợp lệ |
| Quên return traffic | Cho phép TCP outbound nhưng quên established → không có response |
| Xóa ACL khi đang gán | Xóa numbered ACL trong khi đang gán vào interface → implicit deny all |
| Áp sai direction | Nhầm in/out → ACL không có tác dụng hoặc chặn sai |
Reflexive ACL limitations: Không track UDP/ICMP state tốt như TCP. Không hiểu FTP passive mode (cần CBAC hoặc ZBF). Không chống được application-layer attacks. Với mạng production hiện đại → dùng Zone-Based Firewall (ZBF) hoặc dedicated firewall (ASA, FTD).
IPv6 ACL — Cú pháp & Khác biệt
| Khác biệt với IPv4 ACL | |
| Named only | IPv6 ACL không có numbered — chỉ named |
| Prefix thay wildcard | Dùng prefix length (/64) thay vì wildcard mask |
| Implicit permit NDP | IPv6 ACL tự động permit NDP (ND, NA, RS, RA) — không chặn |
| ipv6 access-list | Keyword bắt đầu bằng ipv6 thay vì ip |
| ipv6 traffic-filter | Gán vào interface bằng ipv6 traffic-filter thay vì ip access-group |
| Cú pháp tạo IPv6 ACL | |
| ipv6 access-list IPV6_FILTER | Tạo IPv6 named ACL |
| permit tcp 2001:db8:1::/64 any eq 80 | Permit HTTP từ subnet /64 |
| permit tcp 2001:db8:1::/64 any eq 443 | Permit HTTPS |
| permit ipv6 2001:db8::/32 any | Permit tất cả IPv6 từ prefix /32 |
| permit tcp any any established | Return traffic TCP |
| deny ipv6 any any log | Deny tất cả còn lại |
| Gán vào interface | |
| int gi0/0 ipv6 traffic-filter IPV6_FILTER in | Áp IPv6 ACL vào interface inbound |
| int gi0/1 ipv6 traffic-filter IPV6_FILTER out | Áp IPv6 ACL outbound |
| line vty 0 15 ipv6 access-class IPV6_FILTER in | Áp vào VTY cho IPv6 management |
IPv6 ACL — Ví dụ & Kiểm tra
| IPv6 địa chỉ đặc biệt trong ACL | |
| any | = ::/0 — tất cả địa chỉ IPv6 |
| host 2001:db8::1 | Chính xác 1 địa chỉ IPv6 (/128) |
| 2001:db8::/32 | Prefix /32 — không cần wildcard |
| fe80::/10 | Link-local range |
| ff00::/8 | Multicast range IPv6 |
| NDP implicit permit (tự động có) | |
| permit icmp any any nd-na | Neighbor Advertisement (tự động) |
| permit icmp any any nd-ns | Neighbor Solicitation (tự động) |
| permit icmp any any router-advertisement | Router Advertisement (tự động) |
| Kiểm tra IPv6 ACL | |
| show ipv6 access-list | Xem tất cả IPv6 ACL + hit counter |
| show ipv6 access-list IPV6_FILTER | Xem ACL cụ thể |
| show ipv6 interface gi0/0 | ACL đang gán vào interface |
| clear ipv6 access-list counters | Reset hit counter |
| debug ipv6 packet | Debug IPv6 packet processing |
Ví dụ IPv6 Firewall ACL
ipv6 access-list IPV6_FIREWALL
remark Web traffic from internal network
10 permit tcp 2001:db8:1::/64 any eq 80
20 permit tcp 2001:db8:1::/64 any eq 443
30 permit udp 2001:db8:1::/64 any eq 53
remark Return traffic
40 permit tcp any any established
remark ICMPv6 needed for IPv6 to function
50 permit icmp any any echo-request
60 permit icmp any any echo-reply
remark Deny all else
70 deny ipv6 any any log
!
int gi0/0
ipv6 traffic-filter IPV6_FIREWALL in
IPv6 ACL không có numbered — phải dùng named. NDP (Neighbor Discovery) không bị ảnh hưởng bởi implicit deny — IOS tự thêm permit NDP. Tuy nhiên ICMPv6 echo cần permit thủ công nếu muốn ping. Dual-stack router cần cả IPv4 ACL và IPv6 ACL riêng biệt.
Show Commands — Kiểm tra ACL
| Xem ACL | |
| show access-lists | Tất cả ACL (IPv4 + IPv6) với hit counter |
| show access-lists 100 | Numbered ACL 100 cụ thể |
| show access-lists FIREWALL | Named ACL FIREWALL cụ thể |
| show ip access-lists | Chỉ IPv4 ACL |
| show ipv6 access-list | Chỉ IPv6 ACL |
| Xem ACL gán vào interface | |
| show ip interface gi0/0 | ACL inbound/outbound trên interface cụ thể |
| show ip interface gi0/0 | include access | Lọc chỉ dòng ACL |
| show running-config | section access-list | Tất cả numbered ACL trong config |
| show running-config | section ip access-list | Tất cả named ACL trong config |
| show running-config | include access-class | ACL gán vào VTY/console |
| Hit counter & statistics | |
| show access-lists | Xem matches count: 10 permit ... (25 matches) |
| clear ip access-list counters | Reset tất cả hit counter |
| clear ip access-list counters FIREWALL | Reset counter của 1 ACL cụ thể |
| Time-range verification | |
| show time-range | Trạng thái time-range: active / inactive |
| show clock detail | Thời gian router + NTP sync status |
Debug ACL — Troubleshooting
| Debug commands | |
| debug ip packet detail | NGUY HIỂM — debug tất cả packet, CPU cao trên production |
| debug ip packet 101 detail | Chỉ debug packet khớp ACL 101 — an toàn hơn |
| debug ip packet 101 | Debug không chi tiết — ít tốn CPU hơn |
| debug ip access-list FIREWALL | Debug ACL cụ thể khi match |
| undebug all / no debug all | Bắt buộc tắt debug ngay sau khi xong |
| terminal monitor | Hiển thị debug output ra VTY session |
| terminal no monitor | Tắt debug trên VTY |
| Checklist troubleshoot ACL không hoạt động | |
| 1. ACL có gán chưa? | show ip interface gi0/0 → xem Inbound/Outbound access list |
| 2. Gán đúng direction? | In hay out? Kiểm tra logic traffic flow |
| 3. Đúng interface? | Traffic đi qua interface nào? Trace traffic path |
| 4. Sequence đúng? | Entry deny có ở trước permit rộng hơn không? |
| 5. Hit counter tăng? | show access-lists → kiểm tra entry nào được match |
| 6. Implicit deny? | Có ít nhất 1 permit entry không? Không có = deny all |
| 7. NAT conflict? | ACL với NAT — thứ tự xử lý quan trọng (NAT trước ACL với inbound) |
Thứ tự xử lý — ACL với NAT & Routing
| Inbound packet → Router | |
| 1 | Inbound ACL kiểm tra (ip access-group in) |
| 2 | Routing table lookup (xác định outbound interface) |
| 3 | NAT inside-to-outside translation (nếu có) |
| 4 | Outbound ACL kiểm tra (ip access-group out) |
| 5 | Gửi ra outbound interface |
| Ý nghĩa với NAT | |
| ACL inbound + NAT | ACL thấy địa chỉ trước NAT (private IP). Dùng private IP trong ACL inbound |
| ACL outbound + NAT | ACL thấy địa chỉ sau NAT (public IP). Dùng public IP trong ACL outbound |
| Ví dụ tránh nhầm lẫn | |
| Inbound gi0/0 (LAN) | Source là 192.168.1.x (private) — chưa NAT |
| Outbound gi0/1 (WAN) | Source là 203.0.113.x (public) — đã NAT |
Quick Reference — Tóm tắt lệnh quan trọng
| Tạo ACL | |
| access-list 10 permit ... | Standard numbered |
| access-list 100 permit tcp ... | Extended numbered |
| ip access-list standard NAME | Standard named |
| ip access-list extended NAME | Extended named khuyến nghị |
| ipv6 access-list NAME | IPv6 named ACL |
| Gán ACL | |
| ip access-group NAME in/out | Gán vào IPv4 interface |
| ipv6 traffic-filter NAME in/out | Gán vào IPv6 interface |
| access-class NAME in | Gán vào VTY/console line |
| Xóa ACL | |
| no access-list 100 | Xóa toàn bộ numbered ACL 100 |
| no ip access-list extended FIREWALL | Xóa toàn bộ named ACL |
| ip access-list extended FIREWALL / no 30 | Xóa entry seq 30 của named ACL |
| Kiểm tra | |
| show access-lists | Tất cả ACL + matches |
| show ip interface gi0/0 | ACL gán vào interface |
| clear ip access-list counters | Reset hit counter |
Production safety: Khi sửa ACL trên thiết bị đang hoạt động — luôn giữ 1 phiên console đang mở. Numbered ACL: xóa + viết lại trong 1 thao tác copy-paste (không từng dòng). Có thể dùng
kron để schedule tự động xóa ACL sau X phút nếu không xác nhận — tránh tự khóa mình.
Nhận xét
Đăng nhận xét