9.7. 私有網路與 NAT

IPv4 設計時提供了四十億個位址,在當時聽起來夠用了,但事實並非如此。每個連上網際網路的家庭、辦公室與工廠都需要為其內部裝置配置一整組位址,再加上全世界的相機、手機與家電,四十億個位址根本不夠分配。

網際網路最終採用的變通做法是 私有網路:本地網路上的大多數裝置使用的位址在全球範圍內並不唯一,只在該網路內部有效,而由邊緣的單一裝置在兩個世界之間進行轉換。相機幾乎總是位於這些私有網路之一上。

9.7.1. 私有位址範圍

有三個 IPv4 範圍被保留為 不在公共網際網路上路由。任何本地網路都可以自由使用這些範圍內的位址,無需與任何人協調,因為本地網路以外的路由器永遠不會嘗試將封包送達它們:

  • 10.0.0.0 -- 10.255.255.255(一千六百萬個位址;常見於較大型的企業網路)。

  • 172.16.0.0 -- 172.31.255.255(約一百萬個位址;在實務中較少見)。

  • 192.168.0.0 -- 192.168.255.255(六萬五千個位址;幾乎每台家用路由器的預設範圍)。

在典型的家用網路上,相機與和它通訊的筆記型電腦都位於 192.168.x.x 位址,因為這正是家用路由器為其所架設的網路所挑選的範圍。

9.7.1.1. netmask 的使用方式

IP 位址 頁面介紹了 /24 表示法。它在這裡之所以重要,是因為 netmask 是每台裝置用來決定封包下一步該送往何處的依據。每次相機送出封包時,它都會將自己的 netmask 套用到目的位址上,並檢視結果:

  • 如果目的位址與相機自身位址共享相同的網路位元,則目的地位於 同一個本地網路 上。相機會將封包直接送給它。

  • 如果目的位址 共享相同的網路位元,那麼它一定位於某個其他網路上。相機會將封包送往其 預設閘道(在連線建立時自動設定的路由器),並讓閘道處理其餘的事。

這個單一的判斷——「我們是否共享網路位元?」——正是 netmask 的用途。這也是為什麼家用網路預設使用 /24:254 台裝置的上限對一個家庭來說綽綽有餘,並且使網路保持簡單。

9.7.2. 網路位址轉換(NAT)

位於 192.168.1.50 的相機無法直接將封包送往公共網際網路上的伺服器——公共網際網路並不會將流量路由到 192.168.x.x。家用路由器透過 網路位址轉換(Network Address Translation,簡稱 NAT)來解決這個問題,而且過程是透明的。

一張包含三個區塊的示意圖。左側有兩台 位於私有網路上的裝置,分別標示為「相機 192.168.1.50」與「筆記型電腦 192.168.1.51」, 兩者都連接到中央一個標示為 「路由器」的方塊。路由器有兩個面——一個朝向 裝置的私有面,標示為「192.168.1.1」,以及一個朝向 網際網路的公共面,標示為 「203.0.113.5」。網際網路 在右側繪製為一朵雲。 來自裝置的箭頭穿過 路由器,並像是從公共 位址發出般地浮現。

NAT 會將外送封包的來源位址改寫為路由器的公共位址,並在收到回覆時反向還原改寫,因此私有裝置看起來像是共用單一個公共位址。

路由器有 兩個 位址:一個位於本地網路上的私有位址(通常是 192.168.1.1),以及一個由網際網路供應商分配的公共位址。當相機將封包送往某個公共位址時,路由器會

  1. 記錄相機的私有位址+連接埠,並將其與自己一個臨時的外送連接埠配對;

  2. 將封包上的來源位址改寫為自己的公共位址(並將來源連接埠改寫為所挑選的外送連接埠);

  3. 將改寫後的封包從公共側送出。

當回覆送回並指向路由器的公共位址+連接埠時,路由器會查找該配對,將目的位址改寫回相機的私有位址+連接埠,並在本地側將其送達。相機完全不知道發生過改寫;伺服器也完全不知道原始的來源。

NAT 使家用網路得以實際運作。它也有兩個值得了解的後果。

9.7.3. NAT 改變了什麼

外送很容易。 位於私有網路上的相機可以自由地 對外 通訊。每當它開啟一個 TCP 連線或將 UDP 封包送往遠端伺服器時,NAT 都會自動建立配對。大多數相機應用都朝這個方向運作:擷取一張影像、將它推送到某處的伺服器、接收回覆。

入站很困難。 公共網際網路上的裝置 無法 直接連線到私有網路上的相機。當未經請求的封包抵達路由器的公共位址時,路由器沒有任何配對可供查找,因此該封包無處可去。路由器要不是將它丟棄,就是將它交給路由器本身上執行的某個服務。

針對入站情況,常見有三種變通做法,大致按實用性遞增排列:

  • 連接埠轉送(Port forwarding)。 設定路由器,將某個選定公共連接埠上的所有入站封包導向某台特定的私有裝置。需要路由器的管理員存取權;當路由器的公共位址變動時會變得不穩定。

  • VPN。 執行一個虛擬私有網路,將相機置於與需要連到它的對象相同的邏輯網路上。較為笨重;對大多數相機部署而言超出範圍。

  • 外送發起的連線(Outbound-initiated connection)。 相機對外連線到公共網際網路上某個已知的伺服器,並保持該連線開啟;伺服器則利用既有的連線將訊息推送回來。這正是推播通知以及大多數雲端連線裝置協定的運作方式,也是大多數相機應用最終採用的模式。

對相機上的 Python 程式碼而言,NAT 是看不見的。指令碼只是與它所需要的目的地通訊;路由器在幕後處理轉換。但連線的 方向 確實很重要,NAT 正是為什麼「相機向外連到雲端伺服器」比「雲端伺服器向內連到相機」要容易得多的原因。