Day 19 已經讓 Layer 3 Switch 可以做 Inter-VLAN Routing。
假設公司有三個 VLAN:
VLAN 10 STAFF 192.168.10.0/24
VLAN 20 GUEST 192.168.20.0/24
VLAN 30 SERVER 192.168.30.0/24
Layer 3 Switch 有三個 SVI:
Vlan10 192.168.10.1
Vlan20 192.168.20.1
Vlan30 192.168.30.1
開啟 ip routing 之後,三個網段都有 Route。
問題來了:
Guest VLAN 有 Route 到 Server VLAN,是不是就代表 Guest 一定能連 Server?
答案不是。
因為 Routing Table 決定怎麼走,ACL 決定准不准走。
Routing Table 回答:
目的地在哪裡?下一跳往哪裡?
ACL(Access Control List)回答:
這個封包符合規則嗎?Permit 還是 Deny?
所以:
有 Route
≠
一定能通
例如 Guest:
192.168.20.10
要連 Server:
192.168.30.10
Switch 的 Routing Table 知道 192.168.30.0/24 在 Vlan30,但 ACL 還是可以把這個封包丟掉。
例如:
permit host 192.168.20.10
deny 192.168.20.0 0.0.0.255
192.168.20.10 先 Match 第一條,所以 Permit。
如果順序反過來:
deny 192.168.20.0 0.0.0.255
permit host 192.168.20.10
第一條就 Deny,第二條永遠不會執行。
所以 ACL 的順序本身就是邏輯。
ACL 最後可以想像永遠藏著:
deny any
沒有 Match 到 Permit 的封包,最後就是被拒絕。
以前最容易直接背表格:
Standard ACL
→ Source IP
Extended ACL
→ Source IP
→ Destination IP
→ Protocol
→ Port
換成情境比較好懂。
Standard ACL 主要只能判斷:
你從哪裡來?
例如:
deny 192.168.20.0 0.0.0.255
可以擋 Guest,但它不知道 Guest 是要去 Server 還是 Internet。
所以 Standard ACL 通常比較適合放靠近 Destination,避免太早把其他正常流量一起擋掉。
Extended ACL 可以說得更精準:
誰,去誰那裡,用什麼 Protocol / Port?
例如需求:
Guest → Server
Deny
Guest → Internet
Permit
就可以寫:
ip access-list extended GUEST-IN
deny ip 192.168.20.0 0.0.0.255 192.168.30.0 0.0.0.255
permit ip any any
這也是為什麼 Extended ACL 通常可以放靠近 Source:既然已經知道哪些流量不准,就早點擋掉。
這不是 Subnet Mask,而是 Wildcard Mask。
/24:
Subnet Mask
255.255.255.0
Wildcard Mask
0.0.0.255
所以:
192.168.20.0 0.0.0.255
就是 Match 192.168.20.0/24。
先把它記成:
0 → 這個 bit 要比對
1 → 這個 bit 不在乎
0.0.0.255 只是最常見、最好看的例子。
只有:
ip access-list extended GUEST-IN
...
還不會影響任何流量。
還要套到 Interface:
interface vlan 20
ip access-group GUEST-IN in
可以分成:
ip access-list
→ 定義規則
ip access-group
→ 套用規則
方向永遠是站在設備與 Interface 的角度看。
Guest → Server:
Guest
↓
Vlan20
↓
Layer 3 Switch
↓
Vlan30
↓
Server
對 Vlan20:
封包進入 Switch
→ in
對 Vlan30:
封包離開 Switch
→ out
所以:
只問「這是 in 還是 out?」沒有意義,還要先問「哪一個 Interface?」
延續 Day 19:
PC-GUEST
192.168.20.10/24
GW 192.168.20.1
SERVER
192.168.30.10/24
GW 192.168.30.1
先確認沒有 ACL 時:
PC-GUEST> ping 192.168.30.10
可以通。
接著建立 ACL:
enable
configure terminal
ip access-list extended GUEST-IN
deny ip 192.168.20.0 0.0.0.255 192.168.30.0 0.0.0.255
permit ip any any
套到 Vlan20 inbound:
interface vlan 20
ip access-group GUEST-IN in
再測:
PC-GUEST> ping 192.168.30.10
預期被擋。
但 STAFF → SERVER 不會因為這張 ACL 被擋,因為 STAFF 的封包不是從 Vlan20 進來。
看 ACL:
show ip access-lists
確認掛在哪:
show ip interface vlan 20
Troubleshooting 時我想固定照這個順序:
IP / Mask
↓
Default Gateway
↓
VLAN / SVI
↓
Routing Table
↓
ACL
↓
Interface
↓
in / out
↓
第一條 Match 的 Rule
不要看到 Ping 不通就直接刪 ACL。
permit ip any any
deny ip 192.168.20.0 0.0.0.255 192.168.30.0 0.0.0.255
第一條已經 Match,後面的 Deny 永遠沒機會。
只有 Deny 規則、不補其他需要的 Permit,可能把剩下流量一起擋掉。
ACL 本身寫對,不代表封包真的會經過它。
一定要一起看:
ACL
+
Interface
+
Direction
第一件:
Routing Table 決定怎麼走,ACL 決定准不准走。
第二件:
ACL 從上往下,第一個 Match 就停止;最後還有 implicit deny。
第三件:
Standard ACL
→ 主要看 Source
Extended ACL
→ Source + Destination + Protocol + Port
所以:
Guest → Server
Deny
Guest → Internet
Permit
這種需求,就比較適合 Extended ACL。