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 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。
假設我的筆電:
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 要解決的問題。
前面 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
現在網站回覆:
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
電腦產生:
192.168.1.20:51000
↓
93.184.216.34:443
因為目的地不同網段:
192.168.1.20
↓
Default Gateway
把 Frame 交給 Router。
這裡又接回以前的筆記:
Destination IP
→ 還是遠端網站
Destination MAC
→ 是 Default Gateway
Router 查 Routing Table。
知道:
93.184.216.34
↓
Default Route
↓
ISP
在送往 Internet 前做 NAT / PAT:
192.168.1.20:51000
變成
203.0.113.10:61001
Internet Server 收到:
203.0.113.10:61001
↓
93.184.216.34:443
Server 回覆:
93.184.216.34:443
↓
203.0.113.10:61001
Router 查 NAT Translation Table:
203.0.113.10:61001
↓
192.168.1.20:51000
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
先用最簡單的方法記。
核心概念:
IP Address Translation
例如:
192.168.1.10
↓
203.0.113.10
除了 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
這就是家用網路最常看到的模式。
CCNA 很喜歡把它們拆開。
但先不要背表格。
一個固定對一個。
10.0.0.10
↔
203.0.113.10
可以先想成:
1 Private IP
:
1 Public IP
Translation 是固定的。
準備一池 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
很多內部設備:
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 區分
這幾個名字以前我每次看到都想直接背答案。
其實先把:
Inside
理解成內部設備。
例如:
192.168.1.20
再看它「翻譯前」跟「翻譯後」。
內部設備在內部看到的地址:
192.168.1.20
這台內部設備被 Internet 看到時使用的地址:
203.0.113.10
所以這一次先記:
Inside Local
=
翻譯前的內部位址
Inside Global
=
內部主機對外呈現的位址
如果看到 PAT:
192.168.1.20:51000
↓
203.0.113.10:61001
其實就是同一件事再多看 Port。
先看概念,不把這段假裝成已經做過 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。
如果真的在 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 有沒有真的被建立?
這個很容易混在一起。
因為實際使用起來常會有一種感覺:
家裡電腦可以上 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。
假設 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
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:
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
打開網站。
先取得 Server IP。
發現 Server 不在自己的 LAN。
找 Default Gateway 的 MAC。
Frame 先送給 Router。
Router 決定走 ISP。
判斷 Traffic 是否允許。
192.168.1.10:50000
↓
203.0.113.10:60001
封包送到 Server。
Server 回:
203.0.113.10:60001
Router 查到:
60001
↓
192.168.1.10:50000
最後交回手機。
現在:
ARP
MAC
Gateway
Routing
ACL
Firewall
Stateful
NAT
PAT
終於不是散落的一堆單字。
它們全部都在同一個封包故事裡。
家裡有三台:
192.168.1.10
192.168.1.20
192.168.1.30
為什麼可以共用同一個 Public IP?
兩台電腦如果剛好都使用:
Source Port 50000
Router 還能分得出來嗎?
Server 回:
203.0.113.10:61001
Router 怎麼知道要送回:
192.168.1.20:51000
?
NAT 和 Firewall 是不是同一件事?
Private Subnet EC2 透過 NAT Gateway 上 Internet,代表 Internet 也可以直接透過 NAT Gateway 主動連進 EC2 嗎?
第一件:
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 到底做了什麼?
娃娃很像在厭奶期...