NAT
網路地址轉換(NAT)技術的理論部分可以看博客——網路層——NAT,NAT 的功能大致為:在局域網中組織會為內部主機分配私有地址,當內部主機發送資料包到外部網路時私有地址就會自動轉換為公有 IP 地址,公有 IP 地址回傳的流量的目的地址也會自動轉換為內部私有地址,NAT 通常作業在末節網路的邊界,

在 NAT 術語中,NAT 轉換后的地址稱之為全域地址,NAT 轉換前的地址為本地地址,內部本地地址是需要進行 NAT 轉換的主機的私有地址,外部本地地址是與 ISP 相連的路由器介面的地址,這會是個公有地址,進行 NAT 轉換時,內部本地地址將會轉換為內部全域地址,外部全域地址會成為目的地址,
| 地址型別 | 含義 |
| 內部本地地址 | 轉換前的內部源地址 |
| 外部本地地址 | 轉換后的目標地址 |
| 內部全域地址 | 轉換后的源地址 |
| 外部全域地址 | 轉換前的外部目標地址 |
相關視頻講解:
C++架構師學習地址:C/C++Linux服務器開發高級架構師/Linux后臺架構師
網路穿透,P2P,打洞的核心原理,NAT,穿透的原理
網路穿透,NAT,打洞,了解p2p的秘密
NAT 的優缺點
優點
- 允許內網使用私有地址,從而節省了 ISP 分配的公網地址;
- 增強了與公有網路連接的靈活性;
- 在內網使用私有地址,可以讓公有地址的更換提供方便;
- 隱藏內網的 IP 地址的細節,
缺點
- NAT 轉換有一定的時間開銷,會使性能下降;
- 基于端到端的功能可能無法實作;
- 由于更改了 IP 地址,端到端的 IP 地址因此無法追蹤;
- 修改了報頭的值,導致資料包的完整性檢查失敗;
- TCP 連接可能因此中斷,
NAT 的型別
靜態 NAT
靜態 NAT 實作本地地址和全域地址的一對一映射,這些映射由網路管理員進行配置,當配置靜態 NAT 的設備向互聯網發送流量時,內部本地地址會被轉換為已配置的內部全域地址,內部全域地址是共有的 IPv4 地址,很顯然,靜態 NAT 并不能節省共有 IP 地址的使用,
例如有如圖所示拓撲,可用的公網地址有 170.168.2.2、170.168.2.3、170.168.2.4,則 NAT 轉換表可能是:

| 內部本地 IP 地址 | 內部全域 IP 地址 |
| 192.168.1.21 | 170.168.2.2 |
| 192.168.1.22 | 170.168.2.3 |
| 192.168.1.23 | 170.168.2.4 |
例如主機 192.168.1.21 向外部網路發送分組,則配置了 NAT 的路由器發現分組的源 IP 地址是內部本地 IP 地址,則就將該地址轉換為內部全域 IP 地址并記錄在 NAT 表中,例如這里轉換為 170.168.2.2,轉換后分組會被轉發到外部介面,當路由器收到外部主機回傳的分組時,路由器會根據 NAT 表把內部全域 IP 地址轉換回內部本地 IP 地址,
動態 NAT
動態 NAT 實作本地地址和全域地址之間的多對多映射,將使用公有地址池,以先到先得的原則分配地址的使用,當配置了動態 NAT 的內部設備訪問外部網路時,動態 NAT 會分配 NAT 地址池中可用的 IPv4 地址,動態 NAT 的轉換也會受到 IP 地址池的 IP 地址數量限制,例如內部網路有 50 個使用私有地址的設備,IP 地址池有 5 個公有地址,則只能將這 50 個私有地址映射到這 5 個公有地址上,
PAT
埠地址轉換 PAT實作本地地址和全域地址之間的多對一映射,地址將通過埠號進行多載,由于埠號可以是 0 ~ 65536,所以一個公有 IP 地址可以多載 65536 次,內部本地地址進行轉換時,PAT 會將唯一的源埠號添加到內部全域地址上,埠號會用來區分流量,當目的主機回傳回應時,埠號會決定路由器將資料包轉發到哪個設備上,
在實際情況下埠號可能會被其他會話或者應用占用,此時如果使用的埠號已經被使用了,則 PAT 會從埠號組中分配一個可用的埠號,如果已經沒有可用的埠號了,PAT 會進入下一個公網地址進行轉換,并且重新分配埠號,
例如有如圖所示拓撲,可用的公網地址只有 170.168.2.2,則 NAT 轉換表可能是:

| 內部本地 IP 地址 | 內部全域 IP 地址 |
| 192.168.1.21:12000 | 170.168.2.2:12000 |
| 192.168.1.22:12000 | 170.168.2.3:12001 |
| 192.168.1.23:24000 | 170.168.2.4:12002 |
PAT 可以使用埠號對一個公網地址進行多載,例如主機 192.168.1.21 向外部網路發送分組,則配置了 NAT 的路由器發現分組的源 IP 地址是內部本地 IP 地址,則就將該地址轉換為內部全域 IP 地址并加上一個可用的埠號記錄在 NAT 表中,例如這里轉換為 170.168.2.2:12000,當路由器收到外部主機回傳的分組時,路由器會根據 NAT 表,根據埠號把內部全域 IP 地址轉換回內部本地 IP 地址,
C/C++Linux后臺服務器開發高級架構師學習視頻 點擊 架構師學習資料 獲取,內容知識點包括Linux,Nginx,ZeroMQ,MySQL,Redis,執行緒池,MongoDB,ZK,Linux內核,CDN,P2P,epoll,Docker,TCP/IP,協程,DPDK等等,免費學習地址:C/C++Linux服務器開發高級架構師/Linux后臺架構師

配置靜態 NAT
靜態 NAT 的配置比較簡單,因為只需要將一個內部地址映射到一個外部地址就行,在配置模式使用的命令如下,local-ip 表示進行 NAT 轉換的內部地址,global-ip 表示進行 NAT 轉換的外部地址,這樣就可以建立起地址的映射關系,
Router(config)# ip nat inside source static local-ip global-ip
接著需要將介面配置為相對于 NAT 的內部介面和外部介面,內部介面使用如下命令在介面配置模式下定義:
Router(config-if)# ip nat inside
外部介面使用如下命令在介面配置模式下定義:
Router(config-if)# ip nat outside
配置動態 NAT
動態 NAT 的配置需要先定義用于轉換的地址池,并且為這個地址池命名,使用的命令如下,“pool-name” 是地址池名,“start-ip” 是第一個可用 ip,“end-ip” 是最后一個可用的 ip,這 2 個引數將表示 ip 地址的范圍,netmask 關鍵字指示哪些地址位屬于網路位,
Router(config)# ip nat pool pool-name start-ip end-ip {netmask netmask | prefix-length prefix-length}
接著需要定義一個 ACL 把需要進行 NAT 轉換的流量篩選出來,使用命令如下,使用命名 ACL 也可以:
Router(config)# access-list access-list-number permit source [ source-wildcard ]
接下來要將 ACL 和 NAT 地址池進行系結,使用的命令如下:
Router(config)# ip nat inside source list access-list-number pool pool-name
最后接著需要將介面配置為相對于 NAT 的內部介面和外部介面,內部介面使用如下命令定義:
Router(config-if)# ip nat inside
外部介面使用如下命令定義:
Router(config-if)# ip nat outside
配置 PAT
實驗拓撲
思科 11.2.3.7 Lab 配置 NAT 地址池過載和 PAT 的實驗拓撲如下,

地址分配表:
| 設備 | 介面 | IP 地址 | 子網掩碼 | 默認網關 |
| Gateway | G0/1 | 192.168.1.1 | 255.255.255.0 | N/A |
| S0/0/1 | 209.165.201.18 | 255.255.255.252 | N/A | |
| ISP | S0/0/0 (DCE) | 209.165.201.17 | 255.255.255.252 | N/A |
| Lo0 | 192.31.7.1 | 255.255.255.255 | N/A | |
| PC-A | NIC | 192.168.1.20 | 255.255.255.0 | 192.168.1.1 |
| PC-B | NIC | 192.168.1.21 | 255.255.255.0 | 192.168.1.1 |
| PC-C | NIC | 192.168.1.22 | 255.255.255.0 | 192.168.1.1 |
配置并檢驗 NAT 地址池過載
配置 NAT 地址池過載
配置網關路由器,將來自 192.168.1.0/24 網路的 IP 地址轉換為 209.165.200.224/29 范圍內的六個可用地址中的一個,
首先定義與 LAN 私有 IP 地址相匹配的訪問控制串列,由于要對 G0/1 介面的網段 192.168.1.0/24 做 NAT,因此定義 ACL 1 用來允許對 192.168.1.0/24 的流量能夠被轉換,標準 ACL 篩選流量的作用也可以從此處體現,
Gateway(config)# access-list 1 permit 192.168.1.0 0.0.0.255
定義可用的公有 IP 地址池,和動態 NAT 一樣,使用的命令為 “ip nat pool pool-name start-ip end-ip { netmask netmask | prefix-length prefix-length }”,“pool-name” 是地址池名,“start-ip” 是第一個可用 ip,“end-ip” 是最后一個可用的 ip,這 2 個引數將表示 ip 地址的范圍,netmask 關鍵字指示哪些地址位屬于網路位,
Gateway(config)# ip nat pool public_access 209.165.200.225 209.165.200.230 netmask 255.255.255.248
定義從內部源串列到外部地址池的 NAT,使用 “ip nat inside source list access-list-number pool pool-name overload” 命令系結 ACL 和地址池,注意到示例命令后面跟了個關鍵字 overload,該關鍵字表示過載,用于配置 PAT,
Gateway(config)# ip nat inside source list 1 pool public_access overload
指定介面,對介面使用 “ip nat inside” 配置內部介面,“ip nat outside” 命令配置外部介面,
Gateway(config)# interface g0/1
Gateway(config-if)# ip nat inside
Gateway(config-if)# interface s0/0/1
Gateway(config-if)# ip nat outside
檢驗 NAT 地址池過載
每臺 PC 對 192.31.7.1 地址執行 ping 操作后,顯示網關路由器上的 NAT 統計資料,
Gateway# show ip nat statistics
該命令可以顯示總轉換數,NAT 配置引數、地址池地址數量和已分配地址數量,

顯示網關路由器上的 NAT,
Gateway# show ip nat translations
該命令可以顯示活動的 NAT 轉換,

命令列出了 3 個內部本地 IP 地址,分別是 192.168.1.20、192.168.1.21、192.168.1.22,列出了 1 個內部全域 IP 地址 209.165.200.225,
洗掉 NAT 配置
洗掉可用公有 IP 地址池,
Gateway(config)# no ip nat pool public_access 209.165.200.225 209.165.200.230 netmask 255.255.255.248
洗掉從內部源串列到外部地址池的 NAT 轉換
Gateway(config)# no ip nat inside source list 1 pool public_access overload
介面定義外部地址配置并檢驗 PAT
使用介面定義外部地址
首先定義與 LAN 私有 IP 地址相匹配的訪問控制串列,ACL 1 用來允許對 192.168.1.0/24 進行轉換,標準 ACL 篩選流量的作用也可以從此處體現,
Gateway(config)# access-list 1 permit 192.168.1.0 0.0.0.255
指定介面,對介面使用 ip nat inside 和 ip nat outside 命令,
Gateway(config)# interface g0/1
Gateway(config-if)# ip nat inside
Gateway(config-if)# interface s0/0/1
Gateway(config-if)# ip nat outside
使用介面而不是地址池來定義外部地址,進而配置 PAT,將源串列與外部介面相關聯,
Gateway(config)# ip nat inside source list 1 interface serial 0/0/1 overload
檢驗 PAT
每臺 PC 對 192.31.7.1 地址執行 ping 操作后,顯示網關路由器上的 NAT 統計資料,
Gateway# show ip nat statistics

顯示網關路由器上的 NAT,
Gateway# show ip nat translations

命令列出了 3 個內部本地 IP 地址,分別是 192.168.1.20、192.168.1.21、192.168.1.22,列出了 1 個內部全域 IP 地址 209.165.201.18,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297511.html
標籤:其他
上一篇:OSPF的安全性設計
