網絡小故事 14 · 進階

大廈管理處NAT(網絡位址轉換)與 Port Forwarding(連接埠轉發)

一整家人共用一個 Public IP,回信怎樣找回正確的人?

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

建議先讀:第 8 課、第 9 課

1. 故事

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

序幕:溫習一下

第 1 步/共 12 步

Private IP 出不了門

家中裝置用 Private IP(私人位址),例如 192.168.1.10。全世界無數個家庭都用同樣的位址,所以互聯網上的 Router 不會轉送寄往 192.168.x.x 的封包。家中只有一個 Public IP(公共位址):我對外的 203.0.113.1。

動畫文字版(全部步驟)
  1. 序幕:溫習一下
  2. Private IP 出不了門 路路:家中裝置用 Private IP(私人位址),例如 192.168.1.10。全世界無數個家庭都用同樣的位址,所以互聯網上的 Router 不會轉送寄往 192.168.x.x 的封包。家中只有一個 Public IP(公共位址):我對外的 203.0.113.1。
    • 詳細內容:第 8 課「誰給我位址?DHCP 與 NAT」
  3. 第一幕:大家一起出門
  4. 阿麥出發 小比:阿麥打開 example.com。我的寄件人是 192.168.1.10:50000,收件人是 192.0.2.80:443。這樣出門,回覆就找不到路回來了!
  5. 管理處改寫寄件人 路路:讓我來!我把寄件人改成自己的 203.0.113.1,連 Port(連接埠)也改成 40001,再記在 NAT Table(NAT 表)。這叫 NAT(網絡位址轉換)。
    • NAT Table:
    • 192.168.1.10:50000 ↔ 203.0.113.1:40001
  6. 電視同時上網 路路:電視也在同一時間連接 example.com,它剛好也用 Port 50000。沒關係,我把它改成 203.0.113.1:40002。一個 Public IP,靠不同的 Port 分辨不同的裝置。
    • NAT Table:
    • 192.168.1.10:50000 ↔ 203.0.113.1:40001
    • 192.168.1.11:50000 ↔ 203.0.113.1:40002
    • 連 Port 一起改寫,叫 PAT(連接埠位址轉換)
  7. 回信轉交正確的住戶 路路:伺服器的回覆寄到 203.0.113.1:40001。我查 NAT Table:40001 屬於阿麥!於是把收件人改回 192.168.1.10:50000,交給阿麥。
  8. 不明來歷的信,不收 路路:有一個封包寄到 203.0.113.1:40005,可是 NAT Table 內沒有這個記錄,我不知道要交給誰,只好丟棄。這是 NAT 的副作用,但它不是真正的保安。
    • 真正的把關,要靠 Firewall(防火牆)(小故事 19)
  9. 第二幕:由外面連回家
  10. 阿麥在咖啡店 阿麥:我在咖啡店,想看看家中桌面電腦的相片伺服器(192.168.1.12:8080)。我只知道家中的 Public IP,於是連接 203.0.113.1:8080。
    • 咖啡店 Router 也做 NAT:寄件人 192.168.0.23 變成 198.51.100.1
  11. 路路不知道交給誰 路路:這個封包不是回覆,NAT Table 內沒有記錄。家中有三部裝置,我不知道 8080 要交給誰,只好丟棄。
  12. 設定 Port Forwarding 阿麥:回到家,我在路路的設定頁加一條規則:「寄到 8080 的 TCP 封包,交給 192.168.1.12:8080。」這叫 Port Forwarding(連接埠轉發),好像通知管理處代我轉交某個信箱的信。
  13. 連回家了! 小比:阿麥再試一次。路路按規則把收件人改成 192.168.1.12:8080,交給桌面電腦。相片伺服器的回覆,也沿原路回到咖啡店!
  14. 開了一道門,要小心 路路:Port Forwarding 等於在大廈外牆開了一道門,全世界都可以來敲 8080。只開真正需要的 Port,用強密碼,保持軟件更新;更安全的方法是用 VPN(虛擬私人網絡),小故事 18 再講。
  15. 總結:大廈管理處 路路:出去時,NAT 把寄件人改成 Public IP,並用 NAT Table 記住誰是誰;回來時查表轉交。外面的人要主動連回家,就要設定 Port Forwarding。第二部分到此完結,下一站:傳輸與服務!

2. 問題在哪裡

家中的阿麥、電視和桌面電腦,用的都是 Private IP(私人位址),即只在家中 LAN(區域網絡)內使用的位址,例如 192.168.1.10。

全世界無數個家庭都在用 192.168.1.10。如果小比背著這個寄件人出門,伺服器的回覆應該寄去哪一家?沒有人知道。所以互聯網上的 Router(路由器)根本不會轉送寄往 192.168.x.x 的封包。

可是,ISP(互聯網服務供應商)通常只給每個家庭一個 Public IP(公共位址),即在互聯網上可以被直接找到的位址。這裡是路路對外的 203.0.113.1。

於是出現兩個問題:

  1. 全家幾部裝置,怎樣共用一個 Public IP 出門,而回信又不會送錯人?
  2. 阿麥身在外面,想連回家中某一部電腦,路路又怎樣知道要交給誰?

3. 網絡怎樣解決

想像一座大廈。住戶寄信時,管理處把寄件人改成「大廈地址 + 一個信箱號碼」,並在簿上記下「這個信箱號碼屬於哪一戶」。回信寄到大廈,管理處一查簿就知道交給誰。

這就是 NAT(網絡位址轉換):Router 把 Private IP 改寫成自己的 Public IP,並記在 NAT Table(NAT 表)。家用 Router 連 Port(連接埠)號碼也一起改寫,嚴格來說叫 PAT(連接埠位址轉換)。

外面的人要主動找某一戶,就要預先通知管理處:「寄到這個信箱的信,交給某某。」這叫 Port Forwarding(連接埠轉發)。

4. 看深一點

出門時:改寫寄件人

阿麥打開 example.com,伺服器位址是 192.0.2.80,網頁用 Port 443。(留意:192 開頭不一定是 Private,只有 192.168 開頭才是。)

位置 寄件人 收件人
家中(路路之前) 192.168.1.10:50000 192.0.2.80:443
互聯網(路路之後) 203.0.113.1:40001 192.0.2.80:443

路路只改寫寄件人;收件人全程不變。50000 是阿麥的電腦臨時選的 Port,叫 Ephemeral Port(臨時連接埠)。

路路的 NAT Table

電視剛好在同一時間連接同一個伺服器,也用了 Port 50000。路路就替它選另一個對外 Port:

內部(Private) 對外(Public) 遠端伺服器
192.168.1.10:50000 203.0.113.1:40001 192.0.2.80:443
192.168.1.11:50000 203.0.113.1:40002 192.0.2.80:443

一個 Public IP 有 65,535 個 Port 可用,所以一家人同時開幾百個連線也不成問題。

回來時:查表改寫收件人

伺服器的回覆寄到 203.0.113.1:40001。路路查表,找到 40001 屬於阿麥,就把收件人改回 192.168.1.10:50000,再交給阿麥。

記錄不是永久的:連線結束,或者一段時間沒有使用,路路就會把它刪除。

查不到記錄的封包

一個寄到 203.0.113.1:40005 的封包,NAT Table 內沒有記錄,也沒有 Port Forwarding 規則。路路不知道交給誰,只好丟棄。

這令外面的人較難直接找到家中裝置,但 NAT 本身不是保安設計。真正按規則把關的,是 Firewall(防火牆),小故事 19 會詳細介紹。

Port Forwarding:預先寫好的轉交指示

阿麥在咖啡店(192.168.0.23),想連回家中桌面電腦的相片伺服器 192.168.1.12:8080。咖啡店 Router 也會做 NAT,所以封包出門時寄件人變成 198.51.100.1。

封包寄到 203.0.113.1:8080,但這不是回覆,NAT Table 內沒有記錄。於是阿麥回家後,在路路的設定頁加了一條 TCP(傳輸控制協定)規則:

通訊協定 對外 Port 內部位址 內部 Port
TCP 8080 192.168.1.12 8080

之後,寄到 203.0.113.1:8080 的 TCP 封包,路路都會把收件人改成 192.168.1.12:8080,交給桌面電腦。回覆則按記錄沿原路回到咖啡店。

開門的代價

Port Forwarding 等於在外牆開了一道門,互聯網上任何人都可以來敲 8080。所以:

  • 只開真正需要的 Port,不用時就刪除規則。
  • 伺服器要用強密碼,軟件要保持更新。
  • 更安全的方法是用 VPN(虛擬私人網絡),即先經加密隧道「回到」家中 LAN,才連接裝置。小故事 18 會講。

5. 動手試試

任務:找出你家的轉交指示

  1. 在手機或電腦查看自己的 IP Address(網絡位址),通常是 192.168. 開頭的 Private IP。
  2. 再用搜尋器搜尋「我的 IP」,看看互聯網看到的 Public IP。兩個位址不同,就是因為 Router 做了 NAT。
  3. 如果家長同意,登入家中 Router 的設定頁(位址通常印在 Router 底部),找找「Port Forwarding」或「虛擬伺服器」一頁。裡面有沒有你不認識的規則?
  4. 只看不改。有疑問,請先問家中負責管理網絡的人。

小互動

NAT 的出入次序

阿麥打開 example.com。把以下五個步驟排好次序。

  1. example.com 回覆寄到 203.0.113.1:40001
  2. 阿麥送出封包:由 192.168.1.10:50000 寄往 192.0.2.80:443
  3. 阿麥收到回覆
  4. 路路改寫寄件人為 203.0.113.1:40001,並記入 NAT Table
  5. 路路查 NAT Table,把收件人改回 192.168.1.10:50000

6. 比喻的極限

  • 管理處不只改地址。 路路改寫位址後,還要重新計算 IP 和 TCP 標頭裡的檢查碼,否則對方會以為封包損壞了。
  • 對外 Port 不一定是 40001。 動畫為了容易記,用了 40001、40002;真實的 Router 會自己選號碼,有時甚至保留原本的 50000,只在撞號時才改。
  • 大廈不只一層管理處。 有些 ISP 位址不夠,會在自己的網絡內再做一次 NAT,叫 CGNAT(電訊商級 NAT)。這時你的 Router 對外位址也不是真正的 Public IP,Port Forwarding 也可能無法生效。
  • NAT 不是保安。 管理處丟棄不明來歷的信,只是因為不知道交給誰,並不是在檢查信件是否危險。
  • IPv6 通常不需要管理處。 IPv6 位址多到用不完,每部裝置都可以有自己的 Public 位址,所以一般不用 NAT,改由 Firewall 決定誰可以進來。

7. 小測驗

第 1 題,共 3 題阿麥(192.168.1.10:50000)和電視(192.168.1.11:50000)同時上網,路路怎樣分辨回覆屬於誰?
第 2 題,共 3 題外面有一個封包寄到 203.0.113.1:40005,但 NAT Table 內沒有這個記錄,路路會怎樣做?
第 3 題,共 3 題Port Forwarding 規則「TCP 8080 → 192.168.1.12:8080」的作用是什麼?

8. 重點筆記

  • 家中裝置用 Private IP,全家只有一個 Public IP;NAT(網絡位址轉換)讓大家共用它出門。
  • 出門時,路路把寄件人改成 203.0.113.1 加一個對外 Port,並記入 NAT Table;回來時查表,把收件人改回原本的裝置。
  • 連 Port 一起改寫叫 PAT(連接埠位址轉換),靠不同的對外 Port 分辨不同裝置。
  • NAT Table 內沒有記錄的封包會被丟棄;外面要主動連回家,就要設定 Port Forwarding(連接埠轉發)。
  • Port Forwarding 等於開了一道門,只開需要的 Port;NAT 不是 Firewall。

延伸閱讀

第二部分「走出 LAN」到此完結:小比已經學會找路、交換情報,還懂得經大廈管理處出入。第三部分開始講傳輸與服務。一張相片被切成很多個小比上路,萬一其中一個走失了,怎麼辦?下一個故事,TCP 會教你怎樣用 Sequence Number(序號)和 ACK(確認)確保每一份都平安到達。