简介
在前面的文章中已经介绍了firewalld了zone、rich rule等规则设置,并且在iptables的文章中我们介绍了网络防火墙、还有iptables的target,包括SNAT、DNAT、MASQUERADE、REDIRECT的原理和配置。那么在这篇文章中,将继续介绍在firewalld中的NAT的相关配置使用。
实验环境

在配置NAT之前要确保我们的系统已经开启了IP转发功能,我在iptables配置部分已经开启了IP转发功能。开启方式如下
若要永久性地开启内核转发,可以编辑 /etc/sysctl.conf
文件并确保 net.ipv4.ip_forward
的值为 1
。然后运行下面的命令使其生效
sysctl -p

SNAT
SNAT(Source Network Address Translation,源网络地址转换)是一种网络地址转换(NAT)技术,它用于在数据包离开本地网络(通常是私有网络)并发送到外部网络(如互联网)时,改变数据包的源IP地址。SNAT允许一个或多个内部(私有)IP地址被映射到一个或多个外部(公共)IP地址上,这样外部网络就只能看到转换后的公共IP地址,而无法直接看到原始的内部IP地址。
配置基本SNAT基于masquerade


测试


我们在配置masquerade的时候并不能手动指定转换的源IP地址,那么如果需要手动指定源IP地址呢?就和我们配置iptables的时候一样,可以直接配置SNAT指定出口地址。那么就需要使用--direct的方式来配置了。
配置--direct的SNAT
由于我们已经将firewalld的后端配置为iptables了,当我们使用--direct时,其实就是配置的是iptables。和我们iptables中的策略方式是一样的

测试:


DNAT
DNAT(Destination Network Address Translation,目标网络地址转换),它用于将到达NAT设备(如防火墙、路由器)的流量的目标IP地址从一个地址转换为另一个地址。在DNAT场景中,外部网络(或称为“公共”网络)上的设备尝试访问NAT设备上的某个IP地址(通常是NAT设备的外部IP地址或公共IP地址),但实际上,这些流量被重定向到NAT设备后面的内部网络(或称为“私有”网络)上的某个设备。
配置DNAT
firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]

测试

配置DNAT基于rich rule
rich rule中关于DNAT配置的相关参数如下
forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]

测试

REDIRECT
可以使用重定向机制使内部运行在非标准端口上的 如Web 服务可以访问,而无需用户在 URL 中指定端口。因此,URL 更简单,提供更好的浏览体验,而非标准端口仍然在内部使用或用于特定的要求。
例如我本机开启了一个服务是2017端口的,但是我对外发布的时的端口可能是443或者80,我这里用8080来举例,那么用户只需要访问我对应的8080端口就可以直接访问到我内部的2017端口。这个和DNAT的端口转换机制相似。
配置REDIRECT
firewall-cmd --zone=public --add-forward-port=port=<standard_port>:proto=tcp:toport=<non_standard_port> --permanent

测试

同样的我们也可以通过rich rule 方式配置
配置REDIRECT rich rule方式

测试

总结
本篇文章我们介绍了firewall中配置NAT的方式,更加详细的配置方式和原理可以参考前面iptables中NAT相关的文章iptables(11)target(SNAT、DNAT、MASQUERADE、REDIRECT)