什么是NAT?
NAT 全稱是 Network Address Translation(網絡地址轉換),是一個用來在多個設備共享一個公網 IP上網的技術。
NAT 的核心作用:將一個網絡中的私有 IP 地址,轉換為公網 IP 地址,從而實現上網功能。
沒有NAT的情況:
環境準備
VMware 創建兩臺 Linux 虛擬機:
server1:nat-router
- 作用: NAT 路由器,作為網絡地址轉換的中介。
- 網卡配置:
ens32
:NAT 模式(連接外網)ens33
:僅主機模式(與 server2 通信)
[root@nat-router ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.100.202
NEKMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=223.5.5.5
DNS2=8.8.8.8[root@nat-router ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.200.253
NETMASK=255.255.255.0
server2:nat-client
- 作用: NAT 客戶端,通過 server1 上網。
- 網卡配置:
ens32
:僅主機模式(連接 server1)
[root@nat-client ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.200.201
NEKMASK=255.255.255.0
GATEWAY=192.168.200.253
DNS1=223.5.5.5
NAT 實現原理
使用 iptables
實現 NAT 轉換
iptables
是一個 防火墻工具,用于配置 Linux 內核的網絡行為。- 本身不做 NAT 轉換,它的作用是 告訴內核怎么做。
實際執行 NAT 轉換的是 Linux 內核
- 負責對底層網絡數據包進行管理、處理與轉發。
- 管理網卡、路由、數據包過濾等功能。
NAT 數據包處理流程:
人(配置命令) -> iptables(設置規則) -> 內核(執行SNAT) -> 網絡通信
防火墻(Firewall)概念
- 作用: 管控進出網絡的數據,防止非法訪問或數據泄露。
- Linux 中常見防火墻工具有:
iptables
(傳統,功能強大)firewalld
(基于 zone 的新型防火墻,CentOS 7+ 默認)
SNAT配置
server1
(NAT 路由器)上配置 SNAT(源地址轉換)
# 清除規則
iptables -F
iptables -t nat -F
- 清除原有的 iptables 規則,避免舊規則干擾。
-F
:清空 filter 表(默認表)的所有規則。-t nat -F
:清空 nat 表的所有規則。
# 開啟路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward
- 啟用 IP 轉發,使 Linux 內核可以作為路由器轉發數據包。
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o ens32 -j SNAT --to-source 192.168.100.202
- 設置 SNAT 規則:
-t nat
:操作 NAT 表。-A POSTROUTING
:在數據包離開本機之前改變源地址。-s 192.168.200.0/24
:匹配從 nat-client 發來的內網地址段。-o ens32
:數據包從哪張網卡出去(外網網卡)。-j SNAT --to-source 192.168.100.202
:將源地址改成 server1 外網 IP。
[root@nat-router ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destinationChain INPUT (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destinationChain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.200.0/24 0.0.0.0/0 to:192.168.100.202
nat-client測試網絡情況
My traceroute [v0.85]
nat-client (0.0.0.0) Sat Apr 5 22:15:10 2025
Keys: Help Display mode Restart statistics Order of fields quitPackets PingsHost Loss% Snt Last Avg Best Wrst StDev1. 192.168.200.253 0.0% 7 0.5 0.5 0.4 0.7 0.02. 192.168.100.2 0.0% 7 0.5 0.7 0.4 1.3 0.03. ???
可以看到正常轉發網絡請求
DNAT 配置
什么是 DNAT?
DNAT(Destination Network Address Translation,目的地址轉換)是一種 NAT 技術,用于將 訪問公網 IP 的請求轉發到內網指定主機。
- 常見于部署在路由器上的 端口映射 功能,比如訪問公網
80
端口,就自動轉發到內網 Web 服務器的80
端口。
使用場景
假設你希望讓外部主機訪問 192.168.100.202:80
(server1 公網 IP + 端口),但實際要訪問的是 內網的 server2(192.168.200.201)的 Web 服務。
開啟 DNAT 轉發規則
iptables -t nat -A PREROUTING -i ens32 -d 192.168.100.202 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.201
-t nat
:操作 NAT 表。-A PREROUTING
:在數據包進入防火墻(內核處理)前修改其目標地址。-i ens32
:從外網接口進來的數據包。-d 192.168.100.202
:目的 IP 是 server1 的公網 IP。-p tcp --dport 80
:匹配 TCP 協議的 80 端口(Web 請求)。-j DNAT --to-destination 192.168.200.201
:將請求轉發到內網 server2 的 IP 地址。
開啟 IP 轉發功能(如果還沒啟)
echo 1 > /proc/sys/net/ipv4/ip_forward
- 允許 Linux 內核像路由器一樣轉發數據包。
查看 DNAT 配置是否生效
iptables -t nat -nL PREROUTING
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.100.202 tcp dpt:80 to:192.168.200.201
訪問驗證
從任意一臺外部機器(能訪問 server1)訪問:
curl http://192.168.100.202
如果 server2(192.168.200.201)運行著 Web 服務,會成功響應!
可選:如果 server2 沒有默認網關指向 server1,還需配置 SNAT(返回地址轉換)
如果 server2 的返回數據包沒有經過 server1,那么客戶端可能收不到響應。這時需要配合 SNAT:
iptables -t nat -A POSTROUTING -d 192.168.200.201 -j SNAT --to-source 192.168.200.253
- 強制 server2 把響應發回 server1,再由 server1 轉發出去。
這種 DNAT+SNAT 的搭配也叫 雙向 NAT,常用于網絡地址“偽裝”或負載均衡。
結構圖示意:
┌─────────────┐│ 外部客戶端 │└─────┬───────┘↓┌────────────────────┐│ server1 (NAT網關) ││ ens32: 192.168.100.202│ ens33: 192.168.200.253└────────┬───────────┘↓ DNAT轉發┌────────────────────┐│ server2 (內網Web) ││ ens32: 192.168.200.201└────────────────────┘
總結:SNAT 與 DNAT 的區別
類型 | 全稱 | 修改內容 | 作用方向 | 常用于 |
---|---|---|---|---|
SNAT | Source NAT | 源 IP 地址 | 出去的包 | 內網訪問公網(上網) |
DNAT | Destination NAT | 目的 IP 地址 | 進入的包 | 公網訪問內網服務(端口映射) |