什么是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 地址 | 进入的包 | 公网访问内网服务(端口映射) |