iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
IT Operation

網路為什麼筆記本:從一個封包開始,把 Router、Switch 與 Routing 串起來系列 第 22 篇

Day 22|家裡很多台裝置只有一個 Public IP,Router 怎麼知道封包要還給誰?

  • 分享至 

  • xImage
  •  

Day 21 最後留下了一個問題。

家裡可能有:

手機
192.168.1.10

筆電
192.168.1.20

NAS
192.168.1.30

電視
192.168.1.40

這些全部都是 Private IP。

但我去網站查 IP,看到的可能永遠只有:

203.0.113.10

也就是家裡對外只有一個 Public IP。

那問題來了:

四台設備同時上網,Internet 回來的封包都只送到 203.0.113.10,Router 到底怎麼知道要交給哪一台?

以前我只會回答:

因為有 NAT。

但這其實沒有回答問題。

真正關鍵的是:

Router 不只改 IP,還會記住自己剛才到底改了什麼。

先搞懂 Private IP 為什麼不能直接拿去 Internet 用

最常看到的 Private IPv4 範圍有:

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

例如家裡:

192.168.1.10

公司的 Server:

10.0.10.20

AWS VPC:

10.0.0.0/16

都很常見。

Private IP 最大的特性之一就是:

不同地方可以重複使用。

我家可以有:

192.168.1.10

你家也可以有:

192.168.1.10

公司可能也剛好有:

192.168.1.10

在各自的 LAN 裡完全沒問題。

但這也代表 Internet 不能直接拿:

192.168.1.10

當成全球唯一目的地。

不然 Internet Router 根本不知道:

你說的是哪一間公司的 192.168.1.10?

所以 Public Internet 不會把 RFC1918 Private Address 當成一般全球可路由的 Internet Address。

這時候就需要 NAT。

NAT 第一層到底做什麼?

假設我的筆電:

192.168.1.20

要連:

93.184.216.34
TCP 443

先簡化成:

192.168.1.20
      ↓
家裡 Router
      ↓
Internet
      ↓
93.184.216.34

如果 Router 什麼都不做,封包的 Source IP 是:

Source
192.168.1.20

Destination
93.184.216.34

但 192.168.1.20 是 Private IP。

所以 Router 在送出去前會做 Translation。

假設 Router 的 Public IP 是:

203.0.113.10

出去後變成:

原本

192.168.1.20
    ↓
93.184.216.34

NAT 後

203.0.113.10
    ↓
93.184.216.34

也就是:

把內部 Private IP 轉成可以出現在 Internet 上的 Public IP。

這是 NAT 最直覺的一層。

可是這樣還是不夠

因為我家不是只有一台電腦。

可能同時有:

192.168.1.10
手機

192.168.1.20
筆電

192.168.1.30
NAS

三台一起上網。

Router 對外卻只有:

203.0.113.10

如果全部都只翻成:

203.0.113.10

那回來的時候:

Internet
   ↓
203.0.113.10

Router 還是不知道:

給手機?

給筆電?

給 NAS?

這就是 PAT 要解決的問題。

PAT 真正厲害的是 Port

前面 Day 21 已經看到 TCP Connection 不只有 IP。

例如筆電開 HTTPS:

192.168.1.20:51000
        ↓
93.184.216.34:443

這裡的:

51000

是 Client 端使用的暫時 Source Port。

Router 做 PAT 時,可以把它翻成:

203.0.113.10:61001
        ↓
93.184.216.34:443

Router 同時記一筆:

Inside

192.168.1.20:51000

        ↕

Outside Translation

203.0.113.10:61001

這時 Internet Server 根本不知道:

192.168.1.20

存在。

它看到的 Client 是:

203.0.113.10:61001

那第二台電腦呢?

手機可能同時也打開同一個網站:

192.168.1.10:51000
        ↓
93.184.216.34:443

甚至剛好也用了 Source Port:

51000

沒關係。

Router 可以翻成另一個 Port:

203.0.113.10:61002
        ↓
93.184.216.34:443

Translation Table 就變成:

192.168.1.20:51000
↔
203.0.113.10:61001

192.168.1.10:51000
↔
203.0.113.10:61002

兩台設備:

不同 Private IP

最後卻共用:

同一個 Public IP

靠不同的:

Port

區分。

這就是:

PAT:Port Address Translation

Cisco 世界裡也很常看到另一個名字:

NAT Overload

回來的封包 Router 怎麼知道給誰?

現在網站回覆:

93.184.216.34:443
        ↓
203.0.113.10:61001

Router 收到之後查 Translation Table:

203.0.113.10:61001

        ↓

192.168.1.20:51000

所以把 Destination 改回:

192.168.1.20:51000

再送進 LAN。

如果回的是:

203.0.113.10:61002

Router 查表:

61002
↓
192.168.1.10:51000

就知道應該交給手機。

所以我以前最大的誤解是:

NAT
=
換 IP

其實在一般家用 Router 的上網情境裡,更完整的畫面是:

Private IP + Port
        ↓
Public IP + Port
        ↓
建立 Translation Entry
        ↓
回程依 Translation Table 找回內部 Host

把完整流程跑一次

筆電:

192.168.1.20

要開網站:

93.184.216.34:443

Step 1

電腦產生:

192.168.1.20:51000
        ↓
93.184.216.34:443

Step 2

因為目的地不同網段:

192.168.1.20
↓
Default Gateway

把 Frame 交給 Router。

這裡又接回以前的筆記:

Destination IP
→ 還是遠端網站

Destination MAC
→ 是 Default Gateway

Step 3

Router 查 Routing Table。

知道:

93.184.216.34
↓
Default Route
↓
ISP

Step 4

在送往 Internet 前做 NAT / PAT:

192.168.1.20:51000

變成

203.0.113.10:61001

Step 5

Internet Server 收到:

203.0.113.10:61001
        ↓
93.184.216.34:443

Step 6

Server 回覆:

93.184.216.34:443
        ↓
203.0.113.10:61001

Step 7

Router 查 NAT Translation Table:

203.0.113.10:61001
↓
192.168.1.20:51000

Step 8

Router 把封包送回:

192.168.1.20

整條終於串起來:

PC
192.168.1.20:51000
        ↓
Gateway
        ↓
PAT
        ↓
203.0.113.10:61001
        ↓
Internet
        ↓
Web Server:443

回程

Web Server:443
        ↓
203.0.113.10:61001
        ↓
NAT Table
        ↓
192.168.1.20:51000

NAT 跟 PAT 到底差在哪?

先用最簡單的方法記。

NAT

核心概念:

IP Address Translation

例如:

192.168.1.10
↓
203.0.113.10

PAT

除了 IP,還利用 Port:

192.168.1.10:50001
↓
203.0.113.10:60001

192.168.1.20:50001
↓
203.0.113.10:60002

所以很多裝置可以:

Many Private IP
        ↓
One Public IP

這就是家用網路最常看到的模式。

Static NAT、Dynamic NAT、PAT 又差在哪?

CCNA 很喜歡把它們拆開。

但先不要背表格。

Static NAT

一個固定對一個。

10.0.0.10
↔
203.0.113.10

可以先想成:

1 Private IP
:
1 Public IP

Translation 是固定的。

Dynamic NAT

準備一池 Public IP。

例如:

203.0.113.10
203.0.113.11
203.0.113.12

內部 Client 要出去時:

10.0.0.10
↓
拿一個 Public IP

另一台:

10.0.0.20
↓
再拿另一個 Public IP

是:

Many
↓
Public IP Pool

PAT / NAT Overload

很多內部設備:

10.0.0.10
10.0.0.20
10.0.0.30

全部共用:

203.0.113.10

再靠 Port 分流:

203.0.113.10:60001
203.0.113.10:60002
203.0.113.10:60003

所以:

Static NAT
1 : 1

Dynamic NAT
Many : Pool

PAT
Many : 1
靠 Port 區分

Cisco 為什麼會出現 Inside Local、Inside Global?

這幾個名字以前我每次看到都想直接背答案。

其實先把:

Inside

理解成內部設備。

例如:

192.168.1.20

再看它「翻譯前」跟「翻譯後」。

Inside Local

內部設備在內部看到的地址:

192.168.1.20

Inside Global

這台內部設備被 Internet 看到時使用的地址:

203.0.113.10

所以這一次先記:

Inside Local
=
翻譯前的內部位址

Inside Global
=
內部主機對外呈現的位址

如果看到 PAT:

192.168.1.20:51000
↓
203.0.113.10:61001

其實就是同一件事再多看 Port。

Cisco IOS 裡 NAT Overload 大概長什麼樣?

先看概念,不把這段假裝成已經做過 Lab。

假設 LAN:

192.168.1.0/24

LAN Interface:

GigabitEthernet0/0

Internet Interface:

GigabitEthernet0/1

概念上會先標:

interface GigabitEthernet0/0
 ip nat inside

interface GigabitEthernet0/1
 ip nat outside

再指定哪些 Inside Address 可以 NAT:

access-list 1 permit 192.168.1.0 0.0.0.255

最後做 overload:

ip nat inside source list 1 interface GigabitEthernet0/1 overload

這裡最值得看的其實不是背指令。

而是最後那個:

overload

它代表:

很多 Inside Local Address 可以透過同一個 Outside Interface Address 同時出去。

也就是前面整篇在畫的 PAT。

Translation Table 才是今天真正的核心

如果真的在 Cisco Router 上操作,之後最值得看的不是只有:

ping 成功

而是:

show ip nat translations

因為我要確認 Router 腦袋裡到底記了什麼。

概念上會看到類似:

Inside local
192.168.1.20:51000

Inside global
203.0.113.10:61001

所以以後遇到 NAT 問題,我不應該只問:

有沒有設 NAT?

更應該問:

Translation Entry 有沒有真的被建立?

NAT 是不是 Firewall?

這個很容易混在一起。

因為實際使用起來常會有一種感覺:

家裡電腦可以上 Internet,但 Internet 不能隨便連進我的電腦,所以 NAT 很安全。

但:

NAT 的核心目的是 Address Translation,不是 Security Policy。

Day 21 的 Firewall 在問:

這個 Connection
准不准?

NAT 在問:

這個 Address / Port
應該翻成什麼?

兩者可以出現在同一台 Router / Firewall 上。

但概念不要混成一件事。

Routing
→ 往哪裡走?

Firewall / ACL
→ 准不准走?

NAT / PAT
→ Address / Port 要不要翻譯?

現在三層開始分開了。

那為什麼外面通常不能直接打進家裡?

假設 Internet 上有人直接送:

198.51.100.20
        ↓
203.0.113.10:8080

Router 收到了。

但如果 Translation Table 裡根本沒有:

203.0.113.10:8080
↓
某一台內部主機

Router 就不知道:

給 192.168.1.10?

還是 192.168.1.20?

還是 192.168.1.30?

這也解釋一件以前我常看到的東西:

Port Forwarding

其實就是事先告訴 Router:

203.0.113.10:8080

永遠轉到

192.168.1.30:80

但這個問題先留到下一篇。

AWS 裡也有同樣的問題

這時再回頭看 AWS。

假設 Private Subnet:

EC2
10.0.2.10

沒有 Public IPv4。

它想:

apt update
npm install
curl API

也就是:

主動連 Internet。

那就會出現 NAT Gateway 這類設計。

概念上可以先理解成:

Private EC2
10.0.2.10
        ↓
Route Table
        ↓
NAT Gateway
        ↓
Public IP
        ↓
Internet

這和家裡:

PC
Private IP
↓
Router NAT / PAT
↓
Public IP
↓
Internet

解決的是同一類問題:

內部只有 Private Address 的設備,要怎麼主動連到 Internet?

但 AWS 架構與家用 Router 不是完全一樣。

目前先建立這一層對照就夠了:

家用網路

Private Device
↓
Router NAT / PAT
↓
Internet


AWS

Private Subnet EC2
↓
Route Table
↓
NAT Gateway
↓
Internet Gateway
↓
Internet

一個很重要的 AWS 差異

NAT Gateway 的典型用途是:

讓 Private Subnet 裡的資源主動連出去。

不是:

Internet 主動透過 NAT Gateway 連進 Private EC2。

這跟我們剛才的 Translation Table 很像。

內部先建立:

Inside → Outside

才有對應的 Return Traffic。

所以:

Private Subnet
↓
NAT Gateway
↓
Internet

主要是 Egress。

如果我要讓 Internet 主動存取 Web Server,架構問題就不一樣了。

這也會接回:

Public Subnet
Load Balancer
Security Group
Public IP

等不同設計。

把 Day 20、21、22 全部串起來

現在開始很有感覺了。

Day 20:

Routing Table
→ 有路

ACL
→ 但還可以擋

Day 21:

Stateless
→ 每個 Packet 自己判斷

Stateful
→ 記得 Connection

Day 22:

Private IP
↓
NAT / PAT
↓
翻成 Public IP + Port
↓
記住 Translation
↓
Return Traffic 找得回原本的 Host

三篇合在一起就是:

Routing
→ 封包往哪裡走?

Security
→ 封包准不准走?

NAT
→ 封包的 Address / Port
   要以什麼樣子出現?

再跑一次家裡上網的完整故事

現在終於可以把以前那些零散名詞放進同一條路。

手機:

192.168.1.10

打開網站。

1. DNS

先取得 Server IP。

2. Subnet Mask

發現 Server 不在自己的 LAN。

3. ARP

找 Default Gateway 的 MAC。

4. Ethernet

Frame 先送給 Router。

5. Routing Table

Router 決定走 ISP。

6. ACL / Firewall

判斷 Traffic 是否允許。

7. NAT / PAT

192.168.1.10:50000
↓
203.0.113.10:60001

8. Internet

封包送到 Server。

9. Return Traffic

Server 回:

203.0.113.10:60001

10. NAT Table

Router 查到:

60001
↓
192.168.1.10:50000

11. LAN

最後交回手機。

現在:

ARP
MAC
Gateway
Routing
ACL
Firewall
Stateful
NAT
PAT

終於不是散落的一堆單字。

它們全部都在同一個封包故事裡。

先別往下看,想五題

1.

家裡有三台:

192.168.1.10
192.168.1.20
192.168.1.30

為什麼可以共用同一個 Public IP?

2.

兩台電腦如果剛好都使用:

Source Port 50000

Router 還能分得出來嗎?

3.

Server 回:

203.0.113.10:61001

Router 怎麼知道要送回:

192.168.1.20:51000

?

4.

NAT 和 Firewall 是不是同一件事?

5.

Private Subnet EC2 透過 NAT Gateway 上 Internet,代表 Internet 也可以直接透過 NAT Gateway 主動連進 EC2 嗎?

  1. 因為 PAT 可以讓多個 Private IP 共用同一個 Public IP,再利用不同的 Port Translation 區分 Connection。
  2. 可以。Router 可以把它們翻成不同的外部 Source Port。
  3. Router 會查 NAT / PAT Translation Table,找到對應的 Inside Local Address 與 Port。
  4. 不是。NAT 解決 Address Translation;Firewall 處理 Security Policy 與 Connection 是否允許。
  5. 不代表。NAT Gateway 的典型用途是讓 Private Subnet 資源主動建立 Outbound Connection,並接受其 Return Traffic。

如果今天只記得三件事

第一件:

NAT 不只是把 Private IP 換成 Public IP,Router 還必須記得 Translation。

第二件:

PAT 透過 Port,讓很多 Private IP 可以共用一個 Public IP。

第三件:

Routing
→ 往哪裡走

Firewall / ACL
→ 准不准走

NAT / PAT
→ Address / Port 怎麼翻譯

下一個「為什麼」

現在知道:

Inside Host
主動連出去
↓
NAT / PAT 建 Translation
↓
Return Traffic
可以找得回來

但下一個問題馬上出現了。

假設我家裡有一台 Web Server:

192.168.1.30:80

外面的人只知道:

203.0.113.10

那 Internet 使用者直接連:

203.0.113.10:8080

Router 怎麼知道應該轉給:

192.168.1.30:80

?

也就是:

內部主機可以靠 NAT 主動上網,那 Internet 為什麼不能直接反過來連它?Port Forwarding / DNAT 到底做了什麼?

娃娃很像在厭奶期...


上一篇
Day 21|ACL 都能擋流量了,為什麼還需要 Firewall?Stateful / Stateless 到底差在哪?
系列文
網路為什麼筆記本:從一個封包開始,把 Router、Switch 與 Routing 串起來 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言