Learning Objectives
- 說明 IPv4 位址不夠用的原因,並列出三段私有位址
- 說明私有位址為什麼不能直接在網際網路上通訊
- 說明 NAT 與 PAT 怎麼改寫來源位址與連接埠,並讀懂轉換表
- 說明外部主動發起的連線為什麼進不來,並設定埠轉送開放內部的服務
- 說明 NAT 帶來的問題:點對點連線困難、伺服器記錄的來源位址失真
IPv4 位址不夠用了
IPv4 位址是 32 位元,最多 232,大約 43 億個。扣掉保留的範圍,能分配的更少。 可是現在一個人就有手機、筆電、平板、手錶,家裡還有電視、冷氣、攝影機;位址早就不夠一台一個。 負責全球位址分配的 IANA 在 2011 年 2 月把最後幾塊 IPv4 位址分給各區域的位址管理機構,之後各區域也陸續發完。
能撐到現在,主要靠兩件事:
- 私有位址(RFC 1918):保留三段位址給內部網路自由使用,每個家庭、每間公司都可以重複使用同樣的位址
- NAT:在內部網路的出口,把私有位址換成一個公有位址再送出去,讓整個家只需要一個公有位址
| 私有位址範圍 | 前綴 | 位址數量 | 常見用途 |
|---|---|---|---|
| 10.0.0.0~10.255.255.255 | 10.0.0.0/8 | 約 1677 萬 | 企業、學校、雲端的內部網路 |
| 172.16.0.0~172.31.255.255 | 172.16.0.0/12 | 約 104 萬 | 企業內部、容器網路 |
| 192.168.0.0~192.168.255.255 | 192.168.0.0/16 | 約 6.5 萬 | 家用路由器 |
私有位址在網際網路上不會被路由:電信業者的路由器沒有往 192.168.0.0/16 的路由,因為同一個位址可能有上百萬個家庭在用,根本不知道要送去哪一家。 所以內部的電腦送出去的封包也許到得了伺服器,伺服器的回覆卻回不來。下面先實際看看這個問題。
NAT 與 PAT:轉換表
NAT(Network Address Translation)是路由器在封包經過時改寫位址:從內部往外送時,把來源的私有位址換成路由器外側的公有位址;回覆進來時,再換回內部的位址。 路由器靠一張轉換表記住「誰換成了什麼」,回覆進來才知道要還給誰。
只換位址的話,一個公有位址同一時間只能給一台內部電腦用。家用路由器做的是 PAT(Port Address Translation,RFC 3022 稱為 NAPT): 連同來源連接埠一起換,用不同的埠號區分不同的內部連線,所以幾十台電腦可以共用一個公有位址。
| 內部位址:埠 | 換成(外部位址:埠) | 對方 |
|---|---|---|
| 192.168.1.10:50001 | 198.51.100.2:40001 | 203.0.113.80:80 |
| 192.168.1.10:50002 | 198.51.100.2:40002 | 203.0.113.80:80 |
| 192.168.1.11:50001 | 198.51.100.2:40003 | 203.0.113.80:80 |
回覆進來時,目的是 198.51.100.2:40003,查表得知要換回 192.168.1.11:50001。 注意第一列和第三列內部的埠號都是 50001,兩台電腦各自選的埠號可能相同,所以 PAT 換成不同的外部埠來區分。 ping(ICMP)沒有連接埠,PAT 改用 ICMP 訊息裡的識別碼(identifier)來區分。
模擬器的 show nat 用「#編號」表示這些埠號或識別碼。真實的路由器還會替每一筆設定逾時:一段時間沒有封包經過就刪掉,騰出位置。
整理一下 NAT 讓封包改了什麼:
| 方向 | 改寫的欄位 | 不變的欄位 |
|---|---|---|
| 往外 | 來源 IP、來源埠 | 目的 IP、目的埠 |
| 往內(回覆) | 目的 IP、目的埠 | 來源 IP、來源埠 |
改了 IP 標頭,IP 的檢查碼(checksum)與 TCP、UDP 的檢查碼都要跟著重算,這些都由路由器處理。
小測驗:私有位址與 PAT
下列哪一個是私有位址?
家裡五台電腦共用一個公有位址上網,路由器靠什麼分辨回覆要給哪一台?
PC 從 192.168.1.10:50001 連到 203.0.113.80:80,經過 NAT 之後,伺服器看到的連線是?
外面的人為什麼連不進來:埠轉送
轉換表裡的每一筆,都是內部的電腦先往外連才產生的。如果是外面的人主動連到 198.51.100.2,路由器查表找不到對應的紀錄,不知道要交給裡面哪一台,只能丟掉。 所以 NAT 後面的電腦可以上網,但預設不能被外面主動連到。
| 情況 | 結果 |
|---|---|
| 外面直接連 192.168.1.20 | 網際網路上沒有私有位址的路由,送不到 |
| 外面連 198.51.100.2 的某個埠 | 轉換表沒有紀錄,路由器丟掉 |
| 外面連 198.51.100.2 的某個埠,且路由器設了埠轉送 | 依設定轉給內部指定的位址與埠 |
埠轉送(port forwarding)是事先在路由器加一筆固定的對應,例如「外部埠 8080 → 192.168.1.20:80」, 就能把家裡的 NAS 網頁開放給外面使用。這等於在 NAT 上主動開一個洞,開了以後這台內部設備就直接面對網際網路, 要確定它有更新、有強密碼、只開必要的服務;用不到時要關掉。
NAT 帶來的問題
NAT 讓 IPv4 撐了很多年,但它改寫了位址,也打破了「每台設備有自己的位址、彼此可以直接連線」的設計,帶來幾個問題:
1. 點對點連線變困難。 視訊通話、多人連線遊戲、檔案分享希望兩台使用者的設備直接連線。如果兩邊都在 NAT 後面,誰都沒辦法主動連到對方。 應用程式只好借助網際網路上的第三方伺服器:先問伺服器「我在外面看起來是什麼位址、什麼埠」,再設法讓兩邊同時往對方送封包、在各自的 NAT 上開出對應的紀錄;還是不行時,就由伺服器在中間轉送全部的資料,速度較慢、也增加伺服器的負擔。
2. 記錄的來源 IP 失真。 伺服器的紀錄只看得到 NAT 外側的位址,背後可能是一個家庭、一整棟宿舍。 很多電信業者連公有位址也不夠分給每個用戶,就在自己的網路裡再做一層 NAT,讓成千上萬個用戶共用少數公有位址(常稱為電信級 NAT,CGNAT;RFC 6598 為此保留了 100.64.0.0/10 這段位址)。這時:
- 只靠 IP 封鎖濫用者,會連帶擋掉同一個位址後面的其他人
- 要追查某次連線是誰,需要來源 IP、來源埠與精確時間,再請業者對照轉換紀錄;所以伺服器記錄連線時,應該連同來源埠與時間一起記
3. 有些協定會在資料內容裡寫自己的 IP 位址(例如某些檔案傳輸、語音通話的控制訊息),NAT 只改標頭、沒改內容,對方照著內容回連就會失敗,需要路由器額外處理。
NAT 不是防火牆。 外面連不進來是轉換表的副作用,不是一套完整的安全機制:內部電腦主動連出去的流量一律放行,也不檢查內容。 要控制哪些流量能進出,應該用防火牆的規則(第 23 課)。
這些問題的根本原因是位址不夠。IPv6 的位址多到每台設備都能有自己的公有位址,不需要靠 NAT 共用,這就是下一課的主題。
小測驗:埠轉送與 NAT 的問題
家用路由器沒有設定任何埠轉送。外面的人連到路由器的公有位址 198.51.100.2 的 80 埠,結果會是?
路由器設了「外部埠 2222 → 192.168.1.30:22」。從外面連 198.51.100.2:2222,封包進到 192.168.1.30 時的目的位址與埠是?
網站發現某個 IP 位址在短時間內大量送出惡意請求,就把整個 IP 封鎖。在電信級 NAT 普遍的情況下,可能的副作用是?
關於 NAT,下列哪一句是正確的?
重點整理
- IPv4 只有約 43 億個位址;私有位址(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)可以在各自的內部網路重複使用,但不會在網際網路上被路由。
- NAT 在出口把私有位址換成公有位址;PAT 連同埠號一起換,讓很多台共用一個公有位址;轉換表記住對應,回覆才找得到人。
- 外部主動發起的連線查不到轉換表,所以進不來;要開放內部服務,用埠轉送加一筆固定對應。
- NAT 的問題:點對點連線困難、伺服器記錄的來源 IP 代表很多人(追查要加上來源埠與時間)、內容裡寫了 IP 的協定會出錯;NAT 也不能取代防火牆。
下一課講 IPv6:128 位元的位址怎麼寫、怎麼自動設定,以及它和 IPv4 怎麼共存。