網絡小故事 19 · 進階

門口的保安Firewall(防火牆)與 ACL(存取控制清單)

每一個想進門的封包,盾盾怎樣決定放行還是攔截?

主角:盾盾、路路、小比閱讀時間約 10 分鐘

建議先讀:小故事 14「NAT 與 Port Forwarding」、小故事 15「TCP 可靠傳送」

1. 故事

按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。

序幕:溫習一下

第 1 步/共 11 步

家中的門越來越多

我負責找路:只要知道怎樣去,就把小比送過去。可是現在家中有家人區、客人區、VPN 小門,互聯網上還有人不停來敲門。單靠找路,已經不夠安全了。

動畫文字版(全部步驟)
  1. 序幕:溫習一下
  2. 家中的門越來越多 路路:我負責找路:只要知道怎樣去,就把小比送過去。可是現在家中有家人區、客人區、VPN 小門,互聯網上還有人不停來敲門。單靠找路,已經不夠安全了。
  3. 第一幕:盾盾上班
  4. 盾盾和他的名單 盾盾:我是 Firewall(防火牆)!我手上的名單叫 ACL(存取控制清單)。每個小比經過,我都由第一條開始逐條對照,對中哪一條就照做。名單上沒有你,不能進去!
    • ① 放行:已建立連線的回覆
    • ② 放行:互聯網 → 203.0.113.1 UDP 51820(VPN)
    • ③ 攔截:客人區 192.168.20.0/24 → 家人區 192.168.1.0/24
    • ④ 放行:客人區 → 任何
    • ⑤ 放行:家人區 → 任何
    • (最後)攔截:其他全部
  5. 阿麥出門上網 小比:我由阿麥出發,去 192.0.2.80:443。盾盾逐條對照:第 1 條不是、第 2 條不是……第 5 條「家人區 → 任何:放行」,對中了!盾盾順便把這個連線記在 State Table(連線狀態表)。
  6. 回覆自動放行 盾盾:example.com 的回覆來了。我查 State Table:這是阿麥剛才開始的連線!第 1 條「已建立連線的回覆:放行」。會記住連線的 Firewall,叫 Stateful Firewall(有狀態防火牆)。
  7. 不請自來的陌生人 盾盾:陌生人 192.0.2.66 想連接 203.0.113.1 的 Port 23。我由第 1 條對到第 5 條,一條都對不中。名單最後有一條看不見的規則:全部攔截。名單上沒有你,不能進去!
    • Implicit Deny(隱含拒絕):所有 ACL 最後都有一條看不見的「全部攔截」
  8. VPN 小門 小比:阿麥在咖啡店經 VPN 連回家,外層寄往 203.0.113.1 UDP 51820。盾盾對照:第 2 條,放行!
  9. 第二幕:客人區的規則
  10. 客人想找阿麥 盾盾:客人電腦 192.168.20.10 想連接阿麥 192.168.1.10。第 1、2 條都不是;第 3 條「客人區 → 家人區:攔截」,對中了!攔截!
  11. 客人上網沒問題 盾盾:客人電腦改為連接 example.com。第 3 條的目的地是家人區,不符合;第 4 條「客人區 → 任何:放行」,對中了!
  12. 如果次序排錯了…… 路路:假如有人把第 3、4 條調轉:客人找阿麥時,會先對中「客人區 → 任何:放行」,盾盾照做後就不再往下看。攔截規則永遠用不上,客人直接找上阿麥了!
    • 範圍較細、較嚴格的規則放前面
    • 範圍較闊的規則放後面
  13. 第三幕:多層保護
  14. 只開真正需要的門 盾盾:我的原則是 Least Privilege(最小權限):只放行真正需要的,其餘一律攔截。而且我只守大門;每部電腦最好也開啟自己的 Firewall,萬一有壞人已經走進屋內,也多一層保護。
    • Stateless Firewall(無狀態防火牆):每個 Packet 獨立檢查
    • Stateful Firewall(有狀態防火牆):記住連線,自動放行回覆
    • Next-Generation Firewall(新世代防火牆):還會辨認應用程式
  15. 總結:門口的保安 盾盾: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(連接埠)號碼。

三條鐵律

  1. 由上至下逐條比對。
  2. First Match(第一個符合)就停。 對中第一條,就照做,不再看下面的規則。
  3. 最後有 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

  1. Windows:打開「設定」,搜尋「防火牆」,看看「Windows 安全性」裡的防火牆是否已開啟。Mac:打開「系統設定」→「網絡」→「防火牆」。
  2. 登入家中 Router 的設定頁(通常要問家長),找找「防火牆」或「訪客網絡」的設定。
  3. 想一想:家中的訪客 Wi-Fi,是不是就像故事中的客人區?

小互動

盾盾會怎樣做?

盾盾的名單就是上面那一張。以下每一個封包,盾盾會放行還是攔截?

  1. 1阿麥 192.168.1.10 連接 192.0.2.80:443

  2. 2陌生人 192.0.2.66 連接 203.0.113.1:23

  3. 3客人電腦 192.168.20.10 連接阿麥 192.168.1.10

  4. 4客人電腦 192.168.20.10 連接 192.0.2.80:443

  5. 5192.0.2.80:443 回覆阿麥之前的請求

  6. 6阿麥在咖啡店經 VPN 連接 203.0.113.1:51820

6. 比喻的極限

  • 盾盾不看信的內容。 普通的 Firewall 只看標頭裡的位址、協定和 Port;封包是不是騙人的郵件,它不會知道。
  • 盾盾不一定是一部獨立的機器。 家用 Router 通常已內置 Firewall 功能;動畫把盾盾畫在路路後面,只是為了看得清楚,所以寄給 203.0.113.1 的封包,在動畫裡也要先經過盾盾檢查。
  • 名單不是由盾盾自己想出來的,而且只是簡化版。 ACL 要由人設定;規則寫錯或排錯次序,盾盾也只會照做。真實設定還要加一條「VPN 網絡 192.168.50.0/24 → 家人區:放行」,否則解密後的小比也會被 Implicit Deny 攔下。
  • 盾盾不是萬能。 你自己點擊了壞連結,是由屋內主動連出去,第 5 條會放行;所以仍然要小心,並保持軟件更新。
  • 攔截不一定會回覆。 很多 Firewall 被攔下的封包直接丟棄,寄件人甚至不知道被攔了,只會等到逾時。

7. 小測驗

第 1 題,共 3 題Firewall 檢查 ACL 時,對中第一條規則之後會怎樣?
第 2 題,共 3 題一個 Packet 對不中名單上任何一條規則,會怎樣?
第 3 題,共 3 題為什麼「攔截客人區 → 家人區」要放在「放行客人區 → 任何」之前?

8. 重點筆記

  • Firewall(防火牆)按 ACL(存取控制清單)決定封包放行還是攔截。
  • ACL 由上至下逐條比對,對中第一條就照做並停止;全部對不中,就被最後的 Implicit Deny(隱含拒絕)攔截。
  • 範圍較細的規則放前面,範圍較闊的放後面,否則細規則永遠用不上。
  • Stateful Firewall(有狀態防火牆)用 State Table 記住由內向外的連線,自動放行回覆,但擋住不請自來的陌生人。
  • 原則是 Least Privilege(最小權限):只開真正需要的門。

延伸閱讀

盾盾守好大門,壞人進不來了。可是如果太多好人同時湧來,例如 example.com 大減價,一部伺服器頂不住又怎麼辦?最後一個故事,路路會介紹他的遠房親戚:Load Balancer(負載平衡器),以及怎樣做到 High Availability(高可用性)。