網絡地址轉換(NAT)技術的理論部分可以看博客——網絡層——NAT。NAT 的功能大緻為:在局域網中組織會為内部主機分配私有地址,當内部主機發送數據包到外部網絡時私有地址就會自動轉換為公有 IP 地址,公有 IP 地址返回的流量的目的地址也會自動轉換為内部私有地址。NAT 通常工作在末節網絡的邊界。
在 NAT 術語中,NAT 轉換後的地址稱之為全局地址,NAT 轉換前的地址為本地地址。内部本地地址是需要進行 NAT 轉換的主機的私有地址,外部本地地址是與 ISP 相連的路由器接口的地址,這會是個公有地址。進行 NAT 轉換時,内部本地地址将會轉換為内部全局地址,外部全局地址會成為目的地址。
地址類型 |
含義 |
内部本地地址 |
轉換前的内部源地址 |
外部本地地址 |
轉換後的目标地址 |
内部全局地址 |
轉換後的源地址 |
外部全局地址 |
轉換前的外部目标地址 |
相關視頻講解:
網絡穿透,P2P,打洞的核心原理,NAT,穿透的原理:「鍊接」
網絡穿透,NAT,打洞,了解p2p的秘密:「鍊接」
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服務器開發/後台架構師【零聲教育】-學習視頻教程-騰訊課堂
靜态 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 的配置需要先定義用于轉換的地址池,并且為這個地址池命名,使用的命令如下。“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
思科 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 |
配置網關路由器,将來自 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
每台 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
首先定義與 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
每台 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。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!