在现代网络架构中,CentOS 7 服务器常作为网关或边界设备,承担着连接内部私有网络与外部公共网络的重任,网络地址转换(NAT)映射技术在其中扮演了至关重要的角色,它允许外部用户通过访问服务器的公网IP及特定端口,进而穿透到内网的特定服务上,极大地增强了内网服务的可访问性与安全性,本文将详细介绍如何在 CentOS 7 系统上,使用其默认的 firewalld 防火墙工具来配置 NAT 端口映射。

核心概念与准备工作
在开始配置之前,我们需要理解两个核心概念:IP转发和防火墙区域。
- IP 转发:这是Linux内核的一项功能,它允许系统充当路由器,将从一个网络接口接收到的数据包转发到另一个网络接口,NAT功能依赖于IP转发,必须首先启用。
- FirewallD 区域:
firewalld使用“区域”来管理信任级别和网络规则,典型的配置中,连接公网的网卡(如eth0)会分配到external或public区域,而连接内网的网卡(如eth1)则分配到internal或trusted区域,我们的NAT规则将主要在公网接口所在的区域(通常是external)上配置。
准备工作包括确保您拥有一台至少有两块网卡的CentOS 7服务器,一块连接外网,拥有公网IP;另一块连接内网,并已配置好内网IP地址,您需要拥有 root 权限或 sudo 权限来执行命令。
使用 firewalld 实现 NAT 映射的详细步骤
我们将通过一个具体场景来演示:将外部访问服务器公网IP的 80 端口(HTTP)流量,映射到内网IP为 168.1.100 的服务器的 8080 端口。
步骤 1:开启内核 IP 转发
这是所有NAT操作的基础,临时开启IP转发以测试效果:
sysctl -w net.ipv4.ip_forward=1
为了确保服务器重启后设置依然生效,需要编辑 /etc/sysctl.conf 文件:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
执行 sysctl -p 会立即加载配置文件中的设置,无需重启。
步骤 2:配置 firewalld 防火墙规则
我们使用 firewalld 命令行工具 firewall-cmd 来创建NAT规则。

确认公网网卡(如 eth0)所在的区域,假设它在 external 区域。
我们需要在该区域上启用“伪装”(Masquerade),这实际上是源地址转换(SNAT),它使得内网主机可以通过服务器的公网IP访问外网。
firewall-cmd --zone=external --add-masquerade --permanent
添加核心的端口转发规则,这条规则告诉 firewalld:将进入 external 区域的、目标为TCP 80 端口的流量,转发到内网地址 168.1.100 的 8080 端口。
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100 --permanent
参数解析:
--zone=external: 指定规则应用的区域。--add-forward-port: 表示添加端口转发规则。port=80: 外部访问的端口。proto=tcp: 协议类型,可以是tcp或udp。toport=8080: 目标内网服务器的端口。toaddr=192.168.1.100: 目标内网服务器的IP地址。--permanent: 使规则永久生效,否则重启后失效。
步骤 3:重载防火墙使规则生效
所有添加的带有 --permanent 标志的规则都需要重新加载防火墙服务才能生效。
firewall-cmd --reload
至此,NAT映射配置已全部完成,您可以从外部网络访问服务器的公网IP地址的80端口,请求将被顺利转发到内网的 168.1.100:8080。
为了便于理解和记忆,下表小编总结了核心命令:

| 功能 | 命令示例 | 说明 |
|---|---|---|
| 开启IP转发 | sysctl -w net.ipv4.ip_forward=1 |
临时生效,用于测试 |
| 永久开启IP转发 | echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf |
编辑配置文件,重启后依然有效 |
| 启用IP伪装 | firewall-cmd --zone=external --add-masquerade --permanent |
允许内网通过该服务器访问外网 |
| 添加端口映射 | firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100 --permanent |
将外网流量转发到内网指定主机 |
| 重载防火墙 | firewall-cmd --reload |
应用所有已保存的永久规则 |
规则验证与故障排查
配置完成后,可以通过以下命令查看 external 区域的所有规则,确认我们的设置是否已成功添加:
firewall-cmd --list-all --zone=external
输出中应包含 masquerade: yes 和 forward-ports 相关的条目。
如果无法访问,请从以下几方面排查:
- IP转发是否开启:使用
sysctl net.ipv4.ip_forward检查,输出应为net.ipv4.ip_forward = 1。 - 防火墙区域:确认公网网卡确实在您配置规则的
external区域。 - 内网服务器:确保内网
168.1.100的服务正在8080端口上监听,并且其自身的防火墙(如有)允许来自CentOS网关的流量访问。 - 网络连通性:从CentOS服务器本身
ping内网IP和公网网关,确保基础网络无障碍。
相关问答 FAQs
问:NAT 映射和端口转发有什么区别? 答:这是一个常见的问题,端口转发是NAT(网络地址转换)技术的一种具体实现,NAT是一个更广泛的概念,它主要分为两种:源地址转换(SNAT)和目标地址转换(DNAT),我们常说的“IP伪装”就是SNAT的一种,它让多个内网主机共享一个公网IP去访问互联网,而“端口转发”或“端口映射”则是DNAT的典型应用,它修改数据包的目标IP地址和端口,将外部流量引导至内网特定主机,您可以将端口转发理解为NAT家族中用于实现外部访问内部服务的关键技术。
问:如何确认系统的 IP 转发功能是否已经成功开启?
答:确认IP转发功能是否开启非常简单,您只需要在终端中执行以下命令:
sysctl net.ipv4.ip_forward
如果系统已经成功开启IP转发,命令的输出将会是:
net.ipv4.ip_forward = 1
如果输出是 net.ipv4.ip_forward = 0,则表示功能未开启,您需要按照本文“步骤1”中的方法进行配置,这个命令是进行网络故障排查时的首要检查点之一。