1. 故事
按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。
序幕:溫習一下
第 1 步/共 11 步
家中的門越來越多
我負責找路:只要知道怎樣去,就把小比送過去。可是現在家中有家人區、客人區、VPN 小門,互聯網上還有人不停來敲門。單靠找路,已經不夠安全了。
動畫文字版(全部步驟)
- 序幕:溫習一下
- 家中的門越來越多 路路:我負責找路:只要知道怎樣去,就把小比送過去。可是現在家中有家人區、客人區、VPN 小門,互聯網上還有人不停來敲門。單靠找路,已經不夠安全了。
- 第一幕:盾盾上班
- 盾盾和他的名單 盾盾:我是 Firewall(防火牆)!我手上的名單叫 ACL(存取控制清單)。每個小比經過,我都由第一條開始逐條對照,對中哪一條就照做。名單上沒有你,不能進去!
- ① 放行:已建立連線的回覆
- ② 放行:互聯網 →
203.0.113.1UDP51820(VPN) - ③ 攔截:客人區
192.168.20.0/24→ 家人區192.168.1.0/24 - ④ 放行:客人區 → 任何
- ⑤ 放行:家人區 → 任何
- (最後)攔截:其他全部
- 阿麥出門上網 小比:我由阿麥出發,去
192.0.2.80:443。盾盾逐條對照:第 1 條不是、第 2 條不是……第 5 條「家人區 → 任何:放行」,對中了!盾盾順便把這個連線記在 State Table(連線狀態表)。 - 回覆自動放行 盾盾:
example.com的回覆來了。我查 State Table:這是阿麥剛才開始的連線!第 1 條「已建立連線的回覆:放行」。會記住連線的 Firewall,叫 Stateful Firewall(有狀態防火牆)。 - 不請自來的陌生人 盾盾:陌生人
192.0.2.66想連接203.0.113.1的 Port 23。我由第 1 條對到第 5 條,一條都對不中。名單最後有一條看不見的規則:全部攔截。名單上沒有你,不能進去!- Implicit Deny(隱含拒絕):所有 ACL 最後都有一條看不見的「全部攔截」
- VPN 小門 小比:阿麥在咖啡店經 VPN 連回家,外層寄往
203.0.113.1UDP51820。盾盾對照:第 2 條,放行! - 第二幕:客人區的規則
- 客人想找阿麥 盾盾:客人電腦
192.168.20.10想連接阿麥192.168.1.10。第 1、2 條都不是;第 3 條「客人區 → 家人區:攔截」,對中了!攔截! - 客人上網沒問題 盾盾:客人電腦改為連接
example.com。第 3 條的目的地是家人區,不符合;第 4 條「客人區 → 任何:放行」,對中了! - 如果次序排錯了…… 路路:假如有人把第 3、4 條調轉:客人找阿麥時,會先對中「客人區 → 任何:放行」,盾盾照做後就不再往下看。攔截規則永遠用不上,客人直接找上阿麥了!
- 範圍較細、較嚴格的規則放前面
- 範圍較闊的規則放後面
- 第三幕:多層保護
- 只開真正需要的門 盾盾:我的原則是 Least Privilege(最小權限):只放行真正需要的,其餘一律攔截。而且我只守大門;每部電腦最好也開啟自己的 Firewall,萬一有壞人已經走進屋內,也多一層保護。
- Stateless Firewall(無狀態防火牆):每個 Packet 獨立檢查
- Stateful Firewall(有狀態防火牆):記住連線,自動放行回覆
- Next-Generation Firewall(新世代防火牆):還會辨認應用程式
- 總結:門口的保安 盾盾:ACL 由上至下逐條比對,對中第一條就停;全部對不中就攔截。細的規則放前面,闊的放後面。名單上沒有你,不能進去!
2. 問題在哪裡
路路是 Router(路由器),他的工作是找路:只要知道怎樣去,就把封包送過去。他不會問「這個封包應不應該去」。
可是阿麥的家越來越熱鬧:
- 家人區
192.168.1.0/24:阿麥192.168.1.10和其他家人的裝置。 - 客人區
192.168.20.0/24:朋友來探訪時用的 Wi-Fi(無線網絡),例如客人電腦192.168.20.10。 - VPN(虛擬私人網絡)小門:讓阿麥在外面連回家。
- 互聯網上還有陌生人
192.0.2.66不停來敲門。(留意:192 開頭不一定是 Private,只有 192.168 開頭才是。)
客人可以上網,但不應該看到阿麥的檔案;陌生人更加不應該進來。單靠找路,已經不夠安全了。
3. 網絡怎樣解決
在門口請一位保安:盾盾。
Firewall(防火牆)就是按規則決定封包可否通過的設備或軟件。它手上的規則名單叫 ACL(存取控制清單),每一條寫著「什麼樣的封包 → 放行或攔截」。
每個封包經過,盾盾就由名單第一條開始,逐條對照,對中哪一條就照做,然後不再往下看。整張名單都對不中?名單上沒有你,不能進去!
4. 看深一點
盾盾的名單
| 次序 | 條件 | 動作 |
|---|---|---|
| 1 | 已建立連線的回覆 | 放行 |
| 2 | 互聯網 → 203.0.113.1 UDP 51820(VPN) |
放行 |
| 3 | 客人區 192.168.20.0/24 → 家人區 192.168.1.0/24 |
攔截 |
| 4 | 客人區 → 任何 | 放行 |
| 5 | 家人區 → 任何 | 放行 |
| (最後) | 其他全部 | 攔截 |
每條規則可以看封包的寄件人和收件人 IP Address(網絡位址)、所用的協定,即 TCP(傳輸控制協定)或 UDP(用戶資料包協定),以及 Port(連接埠)號碼。
三條鐵律
- 由上至下逐條比對。
- First Match(第一個符合)就停。 對中第一條,就照做,不再看下面的規則。
- 最後有 Implicit Deny(隱含拒絕)。 名單最後有一條看不見的「全部攔截」,全部對不中的封包都會被攔下。
故事裡的六個封包
| 封包 | 對中哪一條 | 結果 |
|---|---|---|
阿麥 192.168.1.10 → 192.0.2.80:443 |
第 5 條 | 放行 |
192.0.2.80:443 回覆阿麥 |
第 1 條 | 放行 |
陌生人 192.0.2.66 → 203.0.113.1 Port 23 |
沒有 | Implicit Deny,攔截 |
咖啡店經 VPN → 203.0.113.1 UDP 51820 |
第 2 條 | 放行 |
客人 192.168.20.10 → 阿麥 192.168.1.10 |
第 3 條 | 攔截 |
客人 192.168.20.10 → 192.0.2.80:443 |
第 4 條 | 放行 |
Port 23 是一種叫 Telnet 的舊式遙距登入服務,不加密又常被入侵,陌生人最愛來試。
次序為什麼那麼重要?
假如有人把第 3、4 條調轉:
3. 客人區 → 任何:放行 ← 客人找阿麥,先對中這一條!
4. 客人區 → 家人區:攔截 ← 永遠用不上
因為 First Match 就停,範圍較闊的「任何」會把所有客人的封包搶先放行。所以要記住:範圍較細、較嚴格的規則放前面,範圍較闊的放後面。
回覆怎樣進來?State Table(連線狀態表)
阿麥去 example.com,回覆由互聯網進來。名單上沒有「互聯網 → 家人區:放行」,回覆為什麼過得了?
因為盾盾是 Stateful Firewall(有狀態防火牆)。阿麥的封包出去時,盾盾把這個連線記在 State Table:
192.168.1.10:50000 ↔ 192.0.2.80:443 TCP 已建立
回覆進來時,盾盾一查表,發現是阿麥自己開始的連線,就按第 1 條放行。陌生人主動來敲門,表內沒有記錄,就放不進來。這和 NAT(網絡位址轉換)的 NAT Table(NAT 表)很相似,家用 Router 通常把兩者一起做。
三種 Firewall
| 種類 | 做法 |
|---|---|
| Stateless Firewall(無狀態防火牆) | 每個封包獨立檢查,不記得之前的連線;回覆也要另外寫規則 |
| Stateful Firewall(有狀態防火牆) | 記住連線,自動放行回覆 |
| Next-Generation Firewall(新世代防火牆) | 除了位址和 Port,還會辨認是什麼應用程式 |
只開真正需要的門
盾盾的原則是 Least Privilege(最小權限):只放行真正需要的,其餘一律攔截。而且他只守大門,每部電腦最好也開啟自己的 Firewall。萬一有壞人已經走進屋內,也多一層保護。
5. 動手試試
任務:找找你身邊的 Firewall
- Windows:打開「設定」,搜尋「防火牆」,看看「Windows 安全性」裡的防火牆是否已開啟。Mac:打開「系統設定」→「網絡」→「防火牆」。
- 登入家中 Router 的設定頁(通常要問家長),找找「防火牆」或「訪客網絡」的設定。
- 想一想:家中的訪客 Wi-Fi,是不是就像故事中的客人區?
小互動
盾盾會怎樣做?
盾盾的名單就是上面那一張。以下每一個封包,盾盾會放行還是攔截?
-
1阿麥 192.168.1.10 連接 192.0.2.80:443
-
2陌生人 192.0.2.66 連接 203.0.113.1:23
-
3客人電腦 192.168.20.10 連接阿麥 192.168.1.10
-
4客人電腦 192.168.20.10 連接 192.0.2.80:443
-
5192.0.2.80:443 回覆阿麥之前的請求
-
6阿麥在咖啡店經 VPN 連接 203.0.113.1:51820
全部分對了!由上至下逐條對照,對中第一條就照做;全部對不中,就被最後的 Implicit Deny 攔截。
6. 比喻的極限
- 盾盾不看信的內容。 普通的 Firewall 只看標頭裡的位址、協定和 Port;封包是不是騙人的郵件,它不會知道。
- 盾盾不一定是一部獨立的機器。 家用 Router 通常已內置 Firewall 功能;動畫把盾盾畫在路路後面,只是為了看得清楚,所以寄給
203.0.113.1的封包,在動畫裡也要先經過盾盾檢查。 - 名單不是由盾盾自己想出來的,而且只是簡化版。 ACL 要由人設定;規則寫錯或排錯次序,盾盾也只會照做。真實設定還要加一條「VPN 網絡
192.168.50.0/24→ 家人區:放行」,否則解密後的小比也會被 Implicit Deny 攔下。 - 盾盾不是萬能。 你自己點擊了壞連結,是由屋內主動連出去,第 5 條會放行;所以仍然要小心,並保持軟件更新。
- 攔截不一定會回覆。 很多 Firewall 被攔下的封包直接丟棄,寄件人甚至不知道被攔了,只會等到逾時。
7. 小測驗
8. 重點筆記
- Firewall(防火牆)按 ACL(存取控制清單)決定封包放行還是攔截。
- ACL 由上至下逐條比對,對中第一條就照做並停止;全部對不中,就被最後的 Implicit Deny(隱含拒絕)攔截。
- 範圍較細的規則放前面,範圍較闊的放後面,否則細規則永遠用不上。
- Stateful Firewall(有狀態防火牆)用 State Table 記住由內向外的連線,自動放行回覆,但擋住不請自來的陌生人。
- 原則是 Least Privilege(最小權限):只開真正需要的門。
延伸閱讀
盾盾守好大門,壞人進不來了。可是如果太多好人同時湧來,例如 example.com 大減價,一部伺服器頂不住又怎麼辦?最後一個故事,路路會介紹他的遠房親戚:Load Balancer(負載平衡器),以及怎樣做到 High Availability(高可用性)。