简介
在前面的文章中已经介绍了firewalld了zone、rich rule等规则设置,并且在iptables的文章中我们介绍了网络防火墙、还有iptables的target,包括SNAT、DNAT、MASQUERADE、REDIRECT的原理和配置。那么在这篇文章中,将继续介绍在firewalld中的NAT的相关配置使用。
实验环境
和我们在做iptables网络防火墙以及rich rule时的环境是一模一样,内部区域为192.168.140.0/24网段,firewalld配置在主机B上,分为内部trusted区域,和外部public区域。其中主机A的网关是主机B 192.168.140.250,主机B的网关是主机C模拟的公网192.168.170.128。
在配置NAT之前要确保我们的系统已经开启了IP转发功能,我在iptables配置部分已经开启了IP转发功能。开启方式如下
若要永久性地开启内核转发,可以编辑 /etc/sysctl.conf
文件并确保 net.ipv4.ip_forward
的值为 1
。然后运行下面的命令使其生效
sysctl -p
已经开启了IP转发
SNAT
SNAT(Source Network Address Translation,源网络地址转换)是一种网络地址转换(NAT)技术,它用于在数据包离开本地网络(通常是私有网络)并发送到外部网络(如互联网)时,改变数据包的源IP地址。SNAT允许一个或多个内部(私有)IP地址被映射到一个或多个外部(公共)IP地址上,这样外部网络就只能看到转换后的公共IP地址,而无法直接看到原始的内部IP地址。
配置基本SNAT基于masquerade
此时我们public的zone没有开启masquerade功能,masquerade就是流量从出接口发出去的时候会转换为该接口的ip地址
我们给public配置masquerade,此时从该zone对应物理接口发出去的数据包就会进行地址转换,转换为出接口的IP地址
测试
在主机A上ping主机C,此时已经可以ping通,那么主机C上看到的地址是多少呢?因为默认情况下,我们主机A的网关是主机B,主机B的网关是主机C,而主机C只知道和主机B的直连网段的路由,并不知道主机C的地址。此时可以通,说明主机C回包的地址就是我们配置了SNAT后的出口ip地址,即192.168.170.200
在主机C上看到的回包地址为192.168.170.200,和我们配置的是一样的。
我们在配置masquerade的时候并不能手动指定转换的源IP地址,那么如果需要手动指定源IP地址呢?就和我们配置iptables的时候一样,可以直接配置SNAT指定出口地址。那么就需要使用--direct的方式来配置了。
配置--direct的SNAT
由于我们已经将firewalld的后端配置为iptables了,当我们使用--direct时,其实就是配置的是iptables。和我们iptables中的策略方式是一样的
通过--direct参数直接配置防火墙,从192.168.140.248来的目的地址端口为80的流量将源地址转换为192.168.170.201
测试:
主机A通过http访问主机C,此时主机C看到的地址应该是192.168.170.201
这里我们看到了主机C已经收到了主机A发来的数据包,源地址为192.168.170.201。说明我们的NAT配置已经生效了。
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>]
如上图所示,配置将发送到public的40022端口的tcp数据包转发至192.1678.140.248的22端口,注意,前面我们已经开起了该区域的masquerade,配置完成后需要--reload。此时当发送的数据包到达ens36接口地址的40022端口,就会将数据包转发至192.168.140.248 22端口。
测试
此时已经通过40022端口ssh到了140.248主机上
配置DNAT基于rich rule
rich rule中关于DNAT配置的相关参数如下
forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
通过使用rich rule配置DNAT,将50022端口转发至192.168.140.248的22端口
测试
此时已经通过50022端口连接到140.248上了。
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
此时如果仔细观察上图就会发现,该配置与我们前面配置的DNAT配置相比就少了IP地址字段。
测试
此时已经可以通过8080端口正常访问
同样的我们也可以通过rich rule 方式配置
配置REDIRECT rich rule方式
如上图所示,我们按照前面REDIRECT的方式配置richrule ,将40080端口转到2017端口
测试
此时已经可以正常访问。
总结
本篇文章我们介绍了firewall中配置NAT的方式,更加详细的配置方式和原理可以参考前面iptables中NAT相关的文章iptables(11)target(SNAT、DNAT、MASQUERADE、REDIRECT)