在CentOS系统中配置网络地址转换(NAT)是一项常见且关键的网络管理任务,尤其在构建企业网关、服务器集群或提供共享互联网接入的场景中,NAT的核心功能是将一个或多个内部(私有)IP地址映射到一个或多个外部(公有)IP地址,从而隐藏内部网络结构并节省宝贵的公网IP资源,本文将详细介绍在CentOS环境下,主要通过其原生的防火墙管理工具firewalld来配置NAT,并同时介绍传统的iptables方法,以确保全面性和适用性。

准备工作与核心概念
在开始配置之前,我们需要明确几个基本前提和核心概念。
一个典型的NAT服务器至少需要两块网卡:
- 外网接口:连接到公共互联网,拥有一个公网IP地址(通过DHCP或静态配置)。
- 内网接口:连接到内部局域网(LAN),通常配置一个私有IP地址(如192.168.x.x),作为内部客户端的网关。
配置NAT的核心在于开启Linux内核的IP转发功能,这使得服务器能够像一个路由器一样,在不同网络接口之间转发数据包。
开启IP转发
临时开启(重启后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward
永久开启(推荐):
编辑/etc/sysctl.conf文件,确保以下行存在且未被注释:net.ipv4.ip_forward = 1保存文件后,运行以下命令使配置立即生效:
sysctl -p
验证是否开启成功,可以执行
cat /proc/sys/net/ipv4/ip_forward,若返回1则表示成功。
使用Firewalld配置NAT(CentOS 7及以后版本推荐)
Firewalld是CentOS 7及更高版本中默认的动态防火墙管理工具,它通过“区域”和“服务”的概念简化了防火墙配置,配置NAT主要通过其“伪装”功能实现。
识别并分配网卡区域
假设我们有两个网卡,eth0为外网接口,eth1为内网接口。
查看网卡信息:

ip addr show
确定哪个是外网卡(拥有公网IP),哪个是内网卡。
将网卡添加到指定区域:
我们将外网接口放入external或public区域,内网接口放入trusted或internal区域。external区域默认启用了伪装功能,是NAT的理想选择。# 将外网接口eth0添加到external区域 firewall-cmd --zone=external --change-interface=eth0 --permanent # 将内网接口eth1添加到trusted区域(允许所有流量) firewall-cmd --zone=trusted --change-interface=eth1 --permanent
启用IP伪装
IP伪装是NAT的一种特殊形式,它会自动将数据包的源IP地址替换为出口网卡的IP地址。
# 在external区域启用masquerade firewall-cmd --zone=external --add-masquerade --permanent
--zone=external:指定规则应用的区域。--add-masquerade:开启IP伪装。--permanent:使规则永久生效,否则重启后会丢失。
(可选)配置端口转发
有时,我们需要将公网访问的特定端口流量转发到内网的某台服务器上,将访问服务器的80端口流量转发到内网IP为168.1.100的Web服务器上。
# 将外部80端口的TCP流量转发到内网192.168.1.100的80端口 firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=80 --permanent
重载防火墙规则
所有--permanent的修改都需要重载防火墙才能生效。
firewall-cmd --reload
验证配置
- 在内网客户端上,将默认网关和DNS服务器设置为CentOS服务器的内网IP(如
168.1.1)。 - 从客户端
ping一个公网地址,如ping 8.8.8.8,检查是否通畅。 - 在客户端使用
curl ifconfig.me,如果返回的是CentOS服务器的公网IP,则说明NAT配置成功。
使用Iptables配置NAT(传统方法)
对于使用CentOS 6或偏好iptables的用户,配置过程更为直接,但规则管理相对复杂。
配置NAT规则(POSTROUTING链)
在nat表的POSTROUTING链中添加规则,对从内网接口流出、经外网接口发出的数据包进行源地址转换。

# 假设eth0是外网接口 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-t nat:指定操作nat表。-A POSTROUTING:在POSTROUTING链的末尾追加规则。-o eth0:匹配从eth0接口发出的数据包。-j MASQUERADE:执行伪装动作。
配置FORWARD规则
允许数据包在内外网接口之间转发。
# 允许从内网接口eth1进入并转发的数据包 iptables -A FORWARD -i eth1 -j ACCEPT # 允许已建立连接或相关的返回数据包从外网接口eth0转发 iptables -A FORWARD -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
保存Iptables规则
iptables的规则在系统重启后会丢失,必须手动保存。
service iptables save # 或者使用 iptables-save > /etc/sysconfig/iptables
确保iptables服务已设置为开机自启:
systemctl enable iptables systemctl start iptables
无论是使用firewalld还是iptables,CentOS下配置NAT的核心思想都是一致的:开启内核IP转发,并设置防火墙规则以修改转发的数据包地址。firewalld以其区域化的管理和动态更新的特性,成为现代CentOS系统的首选,其配置过程更直观、更安全,而iptables则提供了更底层、更精细的控制,适合有复杂网络需求或习惯传统方式的用户,完成服务器端配置后,别忘了正确设置内网客户端的网关和DNS,整个NAT网络才能正常工作。
相关问答FAQs
我已经按照步骤配置了NAT,但是内网的主机仍然无法访问互联网,最可能的原因是什么?
解答: 这是一个常见的排错问题,请按以下顺序检查:
- IP转发未开启:确认
/etc/sysctl.conf中的net.ipv4.ip_forward = 1已设置并执行了sysctl -p,这是最容易被遗忘的一步。 - 防火墙规则错误或未生效:检查
firewall-cmd --list-all --zone=external(或iptables -t nat -L -n)确认NAT规则已正确添加,特别注意网卡接口名称(如eth0,ens33)是否与实际使用的完全一致。 - 内网客户端配置错误:检查内网主机的网关地址是否正确设置为CentOS服务器的内网IP,DNS服务器地址设置不当也会导致域名无法解析,从而无法上网,可以尝试直接
ping公网IP(如8.8.8)和域名(如www.baidu.com)来区分是连接问题还是DNS问题。 - SELinux限制:在严格模式下,SELinux可能会阻止数据包转发,可以临时关闭SELinux(
setenforce 0)测试是否为其所致,如果是,需要设置相应的SELinux布尔值来允许,而非永久关闭。
在firewalld中,MASQUERADE和直接使用SNAT有什么区别?我应该选择哪一个?
解答: MASQUERADE(伪装)和SNAT(源地址转换)都是firewalld/iptables中实现NAT的方式,主要区别在于适用场景和效率。
- MASQUERADE:动态地址转换,它会自动检查数据包流出接口的当前IP地址,并将其作为新的源IP,它非常适合外网接口IP地址不固定的场景,例如通过DHCP获取公网IP的家庭宽带或云服务器,它的配置更简单,通用性更强,是大多数情况下的首选。
- SNAT:静态地址转换,你需要明确指定一个固定的公网IP地址作为转换后的源地址,
firewall-cmd --zone=external --add-rich-rule='rule nat source address="192.168.1.0/24" snat to="123.45.67.89"',它适用于拥有固定公网IP的服务器,由于不需要为每个数据包动态查找出口IP,SNAT的效率略高于MASQUERADE,在流量极高的网络中可能会有微小的性能优势。
选择建议:如果你的外网IP是动态变化的或者你不确定,请务必使用MASQUERADE,它最简单可靠,只有在你的服务器拥有一个永不变更的静态公网IP,并且你对网络性能有极致追求时,才考虑使用SNAT。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复