firewalld(7)NAT、端口转发

简介

在前面的文章中已经介绍了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)

相关推荐
爱吃青椒不爱吃西红柿‍️17 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
IT果果日记19 分钟前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教22 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特34 分钟前
环境变量简介
linux
小陈phd1 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
运维&陈同学1 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!1 小时前
【Linux】进程状态
linux·运维
hzyyyyyyyu1 小时前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全
明明跟你说过2 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump