第 11 章 網路位址轉換 (NAT)
本章重點 11 - 1 何時使用 NAT? 11 - 2 網路位址轉換的類型 11 - 3 NAT 的名稱 11 - 4 NAT 如何運作 11 - 7 使用 SDM 來設定 NAT 組態 11 - 8 摘要
網路位址轉換 (NAT) 本章簡介網路位址轉換 (Network Address Translation, NAT)、動態 NAT、與埠號位址轉換 (Port Address Translation, PAT, 亦稱為 NAT 超載, NAT overload)。 本章會在本書所使用的互連網路上展示 NAT, 然後使用 SDM 結尾, 讓讀者瞭解如何以簡單的方式來設定 NAT 組態。 因為我們在 NAT 組態設定時會用到存取清單, 所以在閱讀本章之前最好能先閱讀第 10 章。
11 - 1 何時使用 NAT? NAT 最初的意圖與無級別的跨網域遶送 (Classless Inter-Domain Routing, CIDR) 類似, 都是希望藉由用較少數量的公眾 IP 位址來表示很多的私有 IP 位址, 以減少可用 IP 位址空間的消耗。 之後, 人們發現 NAT 在網路遷移與合併、伺服器負載分攤、以及建立「虛擬伺服器」時也非常有用。 所以, 本章將描述 NAT 的基本功能, 以及 NAT 的常見術語。
何時使用 NAT? 有時候, NAT 的確能降低網路環境中所需的大量公眾 IP 數量。當兩家內部位址架構重複的企業要合併時, NAT 也真的非常方便。 當組織改變它的網際網路服務供應商, 且網路管理者不想要費力改變內部位址架構時, 也很適合使用 NAT。 下面列出最適合應用 NAT 的時機: 必須連上網際網路, 但是主機又沒有唯一的全域 IP 位址的時候。 更換到新的 ISP 而必須重新為網路編號時。
何時使用 NAT? 必須合併兩個具有重複位址的企業內網路時。 NAT 通常使用在邊界路由器上。為了說明這點, 請參考圖 11.1。
何時使用 NAT? 您現在可能在想:「NAT 真的很酷!這是絕妙的網路玩意兒, 我一定要用它。」不過請等一下, 關於 NAT 的使用, 確實也有些很嚴重的障礙。 別誤會:它有時候確實可以節省時間, 但您也必須知道它的黑暗面。 表 11.1 是關於使用 NAT 的優缺點。
何時使用 NAT?
11 - 2 網路位址轉換的類型 本節簡介 3 種 NAT: 靜態 NAT 這種 NAT 允許在區域與全域位址之間進行一對一的對應。 請記住這種靜態 NAT 需要網路上的每部主機都各自有一個真實的網際網路 IP 位址。 動態 NAT 這個版本能夠將未註冊的 IP 位址對應到一堆已註冊 IP 位址中的一個註冊 IP 位址。 靜態 NAT 需要靜態地設定路由器, 以便將一個內部位址對應到一個外部位址, 動態 NAT 則不需要。
網路位址轉換的類型 但您必須有足夠的真實 IP 位址, 供每個想要與網際網路收送封包的機器使用。 超載 (overloading) 這是最普遍的 NAT 組態。 超載是一種特殊形式的動態 NAT, 藉由使用不同埠號, 將多個未註冊的 IP 位址對應到單一個註冊的 IP 位址 (多對一)。 它的特殊之處在於它又稱為埠號位址轉換 (Port Address Translation, PAT)。
網路位址轉換的類型 藉由 PAT (NAT 超載), 只需要一個真實的全域 IP 位址, 就可讓幾千個使用者與網際網路連線 - 很聰明吧!
11 - 3 NAT 的名稱 用來描述 NAT 位址的名稱非常簡單。 經過 NAT 轉換後的位址稱為全域位址 (global address), 這通常是在網際網路上使用的公眾位址。 不過, 如果您沒有要連上網際網路, 則不需要公眾位址。 區域 (local) 位址是在 NAT 轉換之前所使用的位址, 所以內部區域位址 (inside local address) 也就是嘗試連上網際網路之傳送主機真正使用的私有位址。
NAT 的名稱 而外部區域位址 (outside local address) 則是目的主機的位址 - 通常會是公眾位址 (網站伺服器、電子郵件伺服器等)。 在轉換之後, 內部位址就稱為內部全域位址 (inside global address), 而目的主機的名稱也就成為外部全域位址 (outside global address)。 表 11 - 2 列出所有這些術語, 以清楚描述 NAT 所使用的不同名稱。
NAT 的名稱
11 - 4 NAT 如何運作 現在是該檢視整個 NAT 如何運作的時機了。 路由器會認出這個 IP 位址是要送往外部網路的內部區域 IP 位址, 於是轉換這個位址, 然後在 NAT 表格中記錄這項轉換。
NAT 如何運作
NAT 如何運作 這個封包會以轉換後的新來源位址送往外部界面, 之後外部主機會將封包傳回。 而 NAT 路由器則會使用 NAT 表格將內部全域 IP 位址轉換回內部區域 IP 位址。就是這麼簡單! 讓我們看看另一個使用超載 (PAT)、更複雜的組態。 圖 11.3 展示 PAT 的運作方式。
NAT 如何運作
NAT 如何運作 在超載組態下, 所有內部主機都會轉換成單一的 IP 位址, 因此才會被稱為「超載」。 看看圖 11.3 的 NAT 表格。除了內部區域 IP 位址與外部全域 IP 位址之外, 我們現在還多了埠號。 這些埠號會協助路由器找出回傳的交通該由哪個主機接收。 在本例中, 埠號是傳輸層用來辨識本地主機用的。
NAT 如何運作 如果我們使用 IP 位址來辨識來源主機, 就稱為靜態 NAT, 而我們的位址很快就會用完。 PAT 讓我們利用傳輸層來辨識主機, 而我們只靠一個真實 IP 位址就可以使用最多 65000 台主機 (理論上)。
設定靜態的 NAT 讓我們來看看簡單、基本靜態 NAT 的組態設定:
設定靜態的 NAT 在這個路由器的輸出中, ip nat inside source 命令會指定哪些 IP 位址要被轉換。 在本例中, ip nat inside source 命令設定內部區域 IP 位址 10.1.1.1 與內部全域 IP 位址 170.46.2.2 之間的靜態轉換。 如果我們更細看這個組態, 可以看到在每個界面下都有一個 ip nat 命令。 ip nat inside 命令會指定該界面為內部界面, 而 ip nat outside 命令則會將該界面指定為外部界面。
設定靜態的 NAT 當您回頭看 ip nat inside source 命令時, 可以看到該命令參考到內部界面作為轉換的來源或起點。 這個命令也可以寫成 ip nat outside source -也就是參考外部界面做為轉換的來源或起點。
設定動態的 NAT 動態 NAT 意味著我們有一堆位址用來提供真實 IP 位址給內部的一群使用者。
設定動態的 NAT ip nat inside source list 1 pool todd 命令會告訴路由器將符合 access-list 1 的 IP 位址轉換到稱為 todd 的 IP NAT 儲備池 (pool)。 本例中的存取清單並非是要用來允許或拒絕交通, 以達成過濾交通的安全理由。
設定動態的 NAT 而是要用來選擇或指定我們所謂的「關注的交通」(interesting traffic)。 這是存取清單的一般性用法, 它們並非永遠都扮演在界面阻擋交通的黑暗角色。 ip nat pool todd 170.168.2.2 192.168.2.254 命令會建立位址的儲備池, 用來分配給那些需要 NAT 的主機。
設定超載 (PAT) 最後的範例是用來展示如何設定內部全域位址超載。 這是今日最常使用的典型 NAT。除非是要靜態地對應一台伺服器, 否則我們通常很少會使用靜態或動態 NAT。 下面是 PAT 組態的一個輸出範例:
設定超載 (PAT) PAT 最棒的地方在於它的設定和前面設定 NAT 的唯一差異, 只在於我們的位址儲備池已經縮減為只有單一的 IP 位址, 以及我們的 ip nat inside source 命令中加上了 overload 命令。
設定超載 (PAT) 請注意在本例中, IP 儲備池內的那一個 IP 位址就是外部界面的 IP 位址。 如果您設定 NAT 超載的網路是在自己的家或小型辦公室, 而 ISP 只提供一個 IP 位址給您時, 這樣就很完美了。 不過, 如果您有額外的可用位址 (例如 170.168.2.2), 也可以一併使用。 當您是在非常大型的實作環境, 使用者數目多到必須要有不只一個超載的 IP 位址對外時, 這就相當有用了。
NAT 的簡易驗證 一旦設定了要使用的 NAT 類型 (通常是超載) 之後, 還得要驗證它的組態設定。 若要檢視基本的 IP 位址轉換資訊, 請使用下面的命令: 當檢視 IP NAT 轉換時, 可能會看到有許多轉換都是從相同主機到相同的目的主機 - 存在許多連到網站的連線時的典型情況。
NAT 的簡易驗證 此外, 您可以使用 debug ip nat 命令來驗證您的 NAT 組態。 它的輸出會在每一列偵錯訊息中顯示傳送端位址、轉換、以及目的位址。 要如何從轉換表格中清除 NAT 項目呢?請使用 clear ip nat translation 命令。 若要清除 NAT 表格中的所有項目, 請在命令的結尾使用星號 (*)。
11 - 5 測試與檢修 NAT Cisco 的 NAT 給了您一些重要的力量 - 而且不需要花太多力氣, 因為它的組態設定實在很簡單。 但是我們都知道世界上沒有十全十美的事, 所以在事情不太順利的時候, 下面這個清單告訴您一些最常見的可能原因: 檢查動態儲備池 - 它們是否包含了正確的位址範圍? 檢查動態儲備池是否有重疊。
測試與檢修 NAT 值得牢記在心的是:NAT 設定中最常見的問題之一跟 NAT 完全無關 - 通常都涉及遶送上的問題。 檢查靜態對應及動態儲備池中所使用的位址是否有重疊。 確定您的存取清單確實指定了待轉換的位址。 確定沒有任何應該在裡面的位址被遺漏, 並且確定沒有不該在的卻被包含進去。 檢查您是否有適當地劃定內在與外在界面。 值得牢記在心的是:NAT 設定中最常見的問題之一跟 NAT 完全無關 - 通常都涉及遶送上的問題。
測試與檢修 NAT 所以, 因為您正在改變封包中的來源或目的位址, 請務必確定您的路由器知道要怎麼處理轉換後的新位址! 據說, NAT 表格能存放的對應數目應該難以計數, 但實際上, 總是會有像 CPU、記憶體、可用位址或埠號範圍之類的東西來加以限制, 使得能存放的項目數有所限制。 每個 NAT 對應會吃掉大約 160 位元組的記憶體。
測試與檢修 NAT 有的時候 (但不是很常), 還必須因為效能或是政策限制, 而限制項目的數量。 在這類情況下, 可以使用 ip nat translation max-entries 命令來協助。 另一個很好用的檢修命令是 show ip nat statistics。 它會提供 NAT 組態的摘要, 並且計算作用中 (active) 的轉換類型數目。
測試與檢修 NAT 它還會計算現有對應的擊中數 (hit) 和失誤數 (miss) - 失誤的後果就是嚐試建立一個新的對應。 這個命令還會揭露逾時的轉換。 如果您想要檢查動態儲備池、它們的類型、可用的位址總數、已經配置了多少位址、配置失敗的次數、以及已經發生的轉換數目, 只要使用 pool (refcount) 命令即可。
測試與檢修 NAT 您知道可以手動清除 NAT 表格中的動態 NAT 項目嗎?如果您想要丟棄某個討厭的項目, 但不想傻傻地等到它逾時, 這樣做就相當方便。 當您想清除整個 NAT 表格來重設位址儲備池時, 手動清除也很有用。 如果儲備池中有任何位址在 NAT 表格中存在對應時, Cisco 的 IOS 軟體就不會讓您變更或刪除位址儲備池。
測試與檢修 NAT clear ip nat translations 命令會清除表格項目, 您可以藉由全域與區域位址、並透過 TCP 與 UDP 轉換 (包含埠號) 來指定單一項目, 也可以直接輸入星號 (*) 清除整個表格。 因為這個命令並不會移除靜態項目, 所以要記住這樣做只會清除動態的項目。 還有一點, 如果有任何外部裝置的封包之目的位址剛好對應到任何內部裝置時, (這個目的位址也就是所謂的內部全域位址) 代表最初的對應必須保存在 NAT 表格中, 以便從該連線來的所有封包都能夠有一致的轉換。
測試與檢修 NAT 當同一部機器經常傳送封包給同一台外部目的主機時, 在 NAT 表格中保留該對應項目也可以削減重複搜尋的次數。 每當新產生一個 NAT 項目到 NAT 表格時, 該項目的計時器就開始計時;計時器的持續時間稱為轉換逾時 (translation timeout)。 而每次有該項目的封包經由路由器轉換時, 該計時器就會重新計時。
測試與檢修 NAT 如果計時器逾時, 該項目就會悄悄地從 NAT 表格中移除, 而這個動態指定的位址也會還回儲備池中。 Cisco 預設的轉換逾時為 86, 400 秒 (24 小時), 但是您可以使用 ip nat translation timeout 命令來變更。 在前進到組態設定的章節、並且真正使用前述命令之前, 我們先來看一些 NAT 範例, 並且看看您是否能想出必須使用的設定為何。
測試與檢修 NAT 首先, 請觀察圖 11.4, 並且問自己兩件事:您要在這個設計的哪裡實作 NAT, 以及您想設定哪種類型的 NAT?
測試與檢修 NAT 在圖 11.4 中, NAT 組態應該要放在企業路由器上, 並且使用有超載的動態 NAT (PAT)。 其實命令中的 pool 已漏了餡, 儲備池中不只一個位址呢, 這表示我們可能不是使用 PAT。 上述命令使用的正是動態 NAT。
測試與檢修 NAT 在下一個 NAT 範例中, 我們會使用圖 11.5 來看看是否能想出所需的組態設定。 圖 11.5 的範例顯示一個需要設定 NAT 的邊界路由器, 並且可以使用 6 個公眾 IP 位址, 從 192.1.2.109 到 192.1.2.114。 不過, 在內部網路中, 您有 63 台主機使用私有位址 192.168.10.65 到 192.168.10.126。 您會如何設定邊界路由器的 NAT 組態呢?
測試與檢修 NAT
測試與檢修 NAT 這裡有兩個不同的答案都可以運作, 但是筆者選擇下面這個設定: 命令 ip nat pool Todd 192.1.2.109 192.1.2.109 netmask 255.255.255.248 將儲備池的名稱設為 Todd, 並且使用位址 192.1.2.109 為 NAT 建立位址的動態儲備池。
測試與檢修 NAT 您也可以使用 prefix-length 29 敘述來取代 netmask 命令 (筆者知道您正在想甚麼, 但別想了, 路由器界面沒辦法照這樣設定的啦~)。 第二種做法會得到完全相同的結果, 同樣只有 192.1.2.109 是您的內部全域位址。 但是您可以用下面這種方式輸入:ip nat pool Todd 192.1.2.109 192.1.2.114 netmask 255.255.255.248。 但這是一種浪費, 因為第 2 到第 6 個位址都只有在 TCP 埠號發生衝突時才會用到。
測試與檢修 NAT 如果您不瞭解第 2 行 access-list 的設定, 請參考第 10 章。 ip nat inside source list 1 pool Todd overload 命令使用 overload 命令將動態儲備池設定為使用埠號位址轉換 (PAT)。 請確定要在適當的界面上加入 ip nat inside 與 ip nat outside 敘述。
11 - 6 在我們的互連網路上設定 NAT 組態 現在我們要使用 64.1.1.4 / 30 網路來連接 Corp 路由器與 R3 路由器, 並且使用 64.1.1.8 / 30 網路連接 R3 路由器的區域網路界面卡 F0 / 0。 圖 11.6 是我們的互連網路, 表 11.3 則是本書一直在使用的內部區域位址。
在我們的互連網路上設定 NAT 組態
在我們的互連網路上設定 NAT 組態 圖 11.6 是我們一直在用的同一個網路, 但這邊有些不同。 Corp 路由器與 R3 路由器間的連線現在是使用全域 PAT 位址。 它們之間無法交談, 因為其它的 Corp 連線是用私有 IP 位址 (在真實世界中, ISP 會擋住這些設定, 對吧?我們來設法讓它運作吧!)。 請記住, 我們在使用 NAT 時, 會將它們稱為內部區域, 代表轉換以前, 而我們的 ISP 會擋住那些私有 IP 位址的範圍。
在我們的互連網路上設定 NAT 組態 我們該怎麼做呢?首先, 我們必須在 Corp 路由器上設定 NAT 組態, 所以, 動手吧!
在我們的互連網路上設定 NAT 組態
在我們的互連網路上設定 NAT 組態 我們必須讓所有連到 Corp 路由器的網路能使用新的全域位址 64.1.1.5 / 30, 與所有連到 R3 路由器的網路進行通訊:
在我們的互連網路上設定 NAT 組態 在新增界面組態之前, 請注意我們是使用 Corp 外部界面的 IP 位址 64.1.1.5 做為儲備池的開始與結束位址。 在使用 PAT 時, 這樣做是沒有問題的。 不論如何, 千萬別忘了在所有界面上設定 NAT:
在我們的互連網路上設定 NAT 組態 現在 PAT 已經設定完成, 所有的界面也設定了, 讓我們試著從 HostC 執行 telnet 連到 HostD。 等等, 先執行 ping, 然後再執行 telnet。
在我們的互連網路上設定 NAT 組態 現在開啟 Corp 路由器上的 debug ip nat, 然後從 HostB 用 telnet 連到 HostD。讓我們看看 Corp 路由器的輸出:
在我們的互連網路上設定 NAT 組態
在我們的互連網路上設定 NAT 組態 至少, 這算是蠻有趣的輸出吧 ~ 您可以看到第 1 行顯示 HostB 所使用的來源與目的埠號。 讓我們使用 show ip nat translation 命令來驗證這些輸出。
在我們的互連網路上設定 NAT 組態 現在在 Corp 路由器上使用 show ip nat statistics 命令:
在我們的互連網路上設定 NAT 組態 這是組態設定的摘要、2 項作用中的轉換、以及使用中的內部與外部界面等資訊。位址儲備池則是列在接近輸出底部的位置。 一切看起來都挺好的, 所以, 接下來我們該開始使用 SDM 來設定 NAT 了。
11 - 7 使用 SDM 來設定 NAT 組態 使用 SDM 來設定 NAT 真的非常容易, 只需要點選 Configure-->NAT, 就有便利的精靈可以完成大半的工作, 您只需要等著設定 NAT 規則就好了。 這很像第 10 章建立防火牆的方式, 而且也跟第 10 章一樣有不只一個的精靈。 同樣地, 您必須選擇基本或進階: 基本 NAT 如果您在受信任網路上有些基本的主機需要存取網際網路, 就可以使用這個精靈, 它會帶領您完成基本 NAT 組態的建立過程。
使用 SDM 來設定 NAT 組態 第 1 個畫面是建立 NAT 組態的畫面 進階 NAT 如果您有 DMZ, 或是有位於內部網路但允許使用者從外部來存取的伺服器, 您鐵定會想使用進階的 NAT 組態設定。 第 1 個畫面是建立 NAT 組態的畫面
使用 SDM 來設定 NAT 組態 這裡只是去連結與建立簡單的 NAT。 之後, 點選 Launch the Selected Task, 然後會進到下個畫面, 告訴我們基本 NAT 精靈要做些甚麼。
使用 SDM 來設定 NAT 組態 如您所猜測的, 我們要做的只是按下 Next, 進入選擇所有內部與外部位址的畫面。
使用 SDM 來設定 NAT 組態 選擇好內部與外部界面之後, 點選 Next。
使用 SDM 來設定 NAT 組態 最後, 按下 Finish。 現在來看看這部路由器發生了甚麼事。下面是其上所設定的界面組態:
使用 SDM 來設定 NAT 組態
使用 SDM 來設定 NAT 組態 下面是它所建立的 ip nat inside source list:
使用 SDM 來設定 NAT 組態 雖然書中已經一再地提及, 但還是想再次提醒您, SDM 是建立進階組態 (如 ACL、VPN、與 NAT) 非常有用的工具。 下兩章還可以再次驗證到它的用途。
11 - 8 摘要 本章介紹了關於網路位址轉換 (NAT), 以及如何設定靜態、動態、及埠號位址轉換 (PAT) - 也稱為 NAT 超載。 本章還提到一些驗證與檢修命令, 並且以如何使用 SDM 來快速設定 NAT 作為結尾。