文章目录
- 一、firewalld基础知识
- 1.1、firewalld基本介绍
- 1.2、firewalld与iptables关系与区别
- 1.3、firewalld默认策略
- 1.4、firewalld配置模式
- 1.5、firewalld配置方法
- 1.6、firewalld区域概念
- 1.7、firewalld基本指令参数
- 二、firewalld区域配置策略
- 三、firewalld服务配置策略
- 四、firewalld端口配置策略
- 五、firewalld富规则配置策略
- 六、firewalld实现路由器功能
- 6.1、firewalld实现SNAT
- 6.2、firewalld实现DNAT
- 总结:整理不易,如果对你有帮助,可否点赞关注一下?
一、firewalld基础知识
1.1、firewalld基本介绍
firewalld即Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器,是iptables的前端控制器,用于实现持久的网络流量规则。
1.2、firewalld与iptables关系与区别
1、firewalld与ipables都不是真正的防火墙,只是用来定义防火墙规则功能的管理工具,将定义好的规则交由内核中的netfilter来实现真正的防火墙功能。
2、在RHEL7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。
与直接控制iptables相比,使用firewalld有两个主要区别:
1、firewalld使用区域和服务而不是链式规则。
2、firewalld默认是拒绝的,需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制。
3、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
4、iptables service在/etc/sysconfig/iptables中存储配置,而firewalld将配置存储在/usr/lib/firewalld/和/etc/firewalld/中的各种XML文件里。
1.3、firewalld默认策略
1.4、firewalld配置模式
firewall-cmd 命令工具有两种配置模式:
运行时规则(Runtime mode):表示当前内存中运行的防火墙配置,在系统或firewalld服务重启、停止时配置将失效。
永久规则(Permanent mode:表示重启防火墙或重新加载防火墙时的规则配置,是永久存储在配置文件中的。
firewall-cmd命令工具与配置模式相关的选项有三个。
--reload: 重新加载防火墙规则并保持状态信息,即将永久配置应用为运行时配置。
--permanent:带有此选项的命令用于设置永久性规则,这些规则只有在重新启动firewalld或重新加载防火墙规则时才会生效,若不带有此选项,表示用于设置运行时规则。
--runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性配置。
1.5、firewalld配置方法
firewallD的配置方法主要有三种:
1、firewall-config
2、firewall-cmd
3、直接编辑xml文件
说明:其中firewall-config是图形化工具,firewall-cmd是命令行工具。
1.6、firewalld区域概念
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。
查看所有的域
说明:firewalld的默认区域是public,firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,如下图所示:
1、block
block(限制):拒绝所有网络连接
如下图所示:
2、dmz
dmz(非军事区):仅接受ssh服务连接
如下图所示:
3、drop
drop(丢弃):任何接收的网络数据包都被丢弃,没有任何回复。
如下图所示:
4、external
external(外部):出去的ipv4网络连接通过此区域伪装和转发,仅接受ssh服务连接。
如下图所示:
5、home
home(家庭):用于家庭网络,仅接受ssh、mdns、ipp-client、samba-client、dhcpv6-client服务连接。
如下图所示:
6、internal
internal(内部):用于内部网络,仅接受ssh、mdns、ipp-client、samba-client、dhcpv6-client服务连接。
如下图所示:
7、public
public(公共):在公共区域内使用,仅接受ssh或dhcpv6-client服务连接,为firewalld的默认区域。
如下图所示:
8、trusted
trusted(信任):可接受所有的网络连接
如下图所示:
9、work
work(工作):用于工作区,仅接受ssh或dhcpv6-client服务连接。
如下图所示:
1.7、firewalld基本指令参数
1、zone区域相关指令
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=<zone>
firewall-cmd --get-active-zones
firewall-cmd --get-zones
firewall-cmd --delete-zone=<zone>
firewall-cmd --new-zone=<zone> --permanent
firewall-cmd --zone=<zone> --list-all
firewall-cmd --info-zone=<zone>
firewall-cmd --list-all-zones
2、services服务相关指令
firewall-cmd --new-service=<service> --permanent
firewall-cmd --delete-service=<service> --permanent
firewall-cmd --info-service=<service>
firewall-cmd --service=<service> --set-description=<description> --permanent
firewall-cmd --service=<service> --get-description --permanent
firewall-cmd --service=<service> --set-short=<description> --permanent
firewall-cmd --service=<service> --get-short --permanent
firewall-cmd --service=<service> --add-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --service=<service> --remove-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --service=<service> --query-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --service=<service> --get-ports
firewall-cmd --service=<service> --add-protocol=<protocol> --permanent
firewall-cmd --service=<service> --remove-protocol=<protocol> --permanent
firewall-cmd --service=<service> --query-protocol=<protocol> --permanent
firewall-cmd --service=<service> --get-protocols --permanent
firewall-cmd --service=<service> --add-source-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --service=<service> --remove-source-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --service=<service> --query-source-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --service=<service> --get-source-ports --permanent
firewall-cmd --service=<service> --set-destination=<ipv>:<address>[/<mask>] --permanent
firewall-cmd --service=<service> --remove-destination=<ipv> --permanent
firewall-cmd --service=<service> --query-destination=<ipv>:<address>[/<mask>] --permanent
firewall-cmd --service=<service> --get-destinations --permanent
3、Port端口相关指令
firewall-cmd --list-ports
firewall-cmd --add-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --remove-port=<portid>[-<portid>]/<protocol> --permanent
firewall-cmd --query-port=<portid>[-<portid>]/<protocol> --permanent
4、Interface网卡相关指令
firewall-cmd --list-interfaces
firewall-cmd --add-interface=<interface> --permanent
firewall-cmd --change-interface=<interface>
firewall-cmd --query-interface=<interface>
firewall-cmd --remove-interface=<interface>
5、其他相关指令
firewall-cmd --list-all
firewall-cmd --reload
二、firewalld区域配置策略
使用firewalld各个区域规则结合配置,调整默认public区域拒绝所有流量,但如果来源IP是192.168.1.0/24网段则允许。
1、查看默认使用区域及配置规则
1、通过--get-default-zone获取当前默认使用的区域
[root@snat zones]
public
2、.通过--list-all查看当前默认区域public配置了哪些规则
[root@snat zones]
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33 ens38
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
2、使用firewalld各个区域规则结合配置,调整默认public区域拒绝所有流量,但如果来源IP是192.168.1.0/24网段则允许
1、临时移除默认区域的规则策略
[root@snat zones]
success
2、添加来源是192.168.1.0/24网段,临时将其加入白名单(更精细化控制使用富规则)
[root@snat zones]
success
3、检查当前活动的区域
[root@snat zones]
public
interfaces: ens33 ens38
trusted
sources: 192.168.1.0/24
3、查询public区域是否允许请求ssh、dhcpv6-client服务的流量
[root@snat zones]
no
[root@snat zones]
no
4、上述配置均为临时配置,使用firewall-cmd --reload临时配置会被清空
[root@snat zones]
success
[root@snat zones]
public
interfaces: ens33 ens38
三、firewalld服务配置策略
为了方便管理,firewalld预先定义了很多服务,存放在/usr/lib/firewalld/services/目录中,服务通过单个的XML配置文件来指定。这些配置文件则按以下格式命名:service-name.xml,每个文件对应一项具体的网络服务,如ssh服务等。与之对应的配置文件中记录了各项服务所使用的tcp/udp端口,在最新版本的firewalld中默认已经定义了126多种服务供我们使用,对于每个网络区域,均可以配置允许访问的服务。
当默认提供的服务不适用或者需要自定义某项服务的端口时,我们需要将service配置文件放置在/etc/firewalld/services/目录中。
service配置具有以下优点:
1、通过服务名字来管理规则更加人性化
2、通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
service文件中的标签解释:
1、version:version是service节点的一个可选属性,用于表示service的版本。
2、short:short在zone、icmptype等配置文件中也存在,其作用是简介,主要是让我们对所配置的内容有所了解,类似于注释的作用。
3、description:作用跟short相同,不过描述信息更加详细。
4、port:服务所对应的端口,这项是service中非常重要的一个配置项,大部分service主要就是对port进行绑定的,当一个service绑定了指定端口之后,该端口接收到的连接就会当成这个service,然后到所对应的zone中去查询规则,从而判断是否可以放行。port节点有两可个配置的属性:port和protocol
5、port属性:port用来配置所使用的端口号,可以是单个端口也可以是一个端口段,比如port=100-105表示100到105之间的端口号,另外,port属性是个可选属性,可以不进行设置。
6、protocol属性:protocol属性用于指定所对应的协议,如果port属性不为空,那么protocol应该设置为tcp或者udp,如果port属性为空(没设置),那么protocol可以设置为/etc/protocols中所包含的任意协议。
7、destination:destination非常简单,它就表示目标地址,也就是根据目标地址来绑定服务,他有两个属性:ipv4和ipv6,分别用于绑定ipv4和ipv6的地址,可以使用单个地址也可以使用掩码。另外,在一个service中destination最多只能出现一次。
这里就以Mysql服务为例,如下所示我这边使用docker部署了mysql服务,因为firewalld的防火墙规则默认是拒绝的,启动firewalld防火墙使用客户端工具无法连接,现在对mysql服务进行配置防火墙规则,允许客户端用户可以连接Mysql服务。
操作步骤如下:
1、编辑配置mysql服务
[root@snat firewalld]
[root@snat services]
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>MySQL</short>
<description>MySQL Database Server</description>
<port protocol="tcp" port="53000"/>
</service>
2、配置前查看public区域内允许访问的服务
[root@snat services]
ssh dhcpv6-client
3、为public区域设置允许访问的mysql服务
[root@snat services]
4、重新加载配置
[root@snat services]
success
5、配置后查看public区域内允许访问的服务
[root@snat zones]
ssh mysql dhcpv6-client
6、移除mysql服务防火墙规则
[root@snat services]
success
[root@snat services]
success
[root@snat zones]
ssh dhcpv6-client
四、firewalld端口配置策略
在进行服务配置时,预定义的网络服务可以使用服务名配置,服务所涉及的端口就会自动打开。但是,对于非预定义的服务只能手动为指定的区域添加端口。
使用firewalld允许客户请求的服务器的80/tcp端口,仅临时生效,如添加–permanent重启后则永久生效
1、临时添加允许放行单个端口
[root@snat zones]
success
[root@snat zones]
80/tcp
2、临时添加放行多个端口
[root@snat zones]
success
[root@snat zones]
80/tcp 8080/tcp
3、.永久添加多个端口,需要添加–permanent,并且需要重载firewalld
[root@snat zones]
success
[root@snat zones]
success
[root@snat zones]
80/tcp 8080/tcp
4、移除临时添加的端口规则
[root@snat zones]
success
[root@snat zones]
5、移除永久添加的端口规则
[root@snat zones]
success
[root@snat zones]
success
[root@snat zones]
五、firewalld富规则配置策略
firewalld中的富规则可以配置更细致、更详细的防火墙策略,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置, 优先级在所有的防火墙策略中也是最高的。
富规则相关命令
man firewall-cmd
man firewalld.richlanguage
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
accept | reject [type="reject type"] | drop
富规则相关命令
--add-rich-rule='<RULE>'
--remove-rich-rule='<RULE>'
--query-rich-rule='<RULE>'
--list-rich-rules
这里就以consul服务为例,因为firewalld的防火墙规则默认是拒绝的,启动firewalld防火墙使用客户端用户无法连接,现在对consul服务进行配置防火墙规则,允许客户端用户可以连接consul服务。
操作步骤如下:
1、添加防火墙规则前在192.168.1.48主机上访问consul服务端口
2、在192.168.1.34主机上添加防火墙规则(对指定ip开放指定端口)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8300" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8301" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8302" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8500" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8600" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8301" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8302" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8600" accept"
firewall-cmd --reload
进入/etc/firewalld/zones/public.xml文件查看配置的规则,如下图所示:
总结:也可以手动编辑public.xml文件进行规则添加。
3、查看配置结果,如下图所示:
4、添加防火墙规则后在192.168.1.48主机上访问consul服务端口
5、删除防火墙规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8300" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8301" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8302" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8500" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8600" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8301" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8302" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8600" accept"
firewall-cmd --reload
总结:也可以在public.xml文件中将之前添加的规则进行手动删除。
六、firewalld实现路由器功能
6.1、firewalld实现SNAT
实例:实现内部主机访问外部服务
步骤如下:
1、开启路由转发
[root@snat zones]
[root@snat zones]
[root@snat zones]
2、firewalld防火墙开启masquerade, 实现地址转换
设置默认区域的SNAT的IP伪装
[root@snat zones]
[root@snat zones]
查看默认区域的SNAT是否允许
[root@snat zones]
删除默认区域的SNAT功能
[root@snat zones]
3、客户端将网关指向firewalld服务器,将所有网络请求交给firewalld
[root@web ~]
GATEWAY=192.168.149.100
4、客户端主机192.168.149.101上测试访问http://192.168.1.48:80
[root@host-48 ~]
192.168.1.34 - - [19/Nov/2021:15:14:41 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.1.34 - - [19/Nov/2021:15:14:42 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.1.34 - - [19/Nov/2021:15:14:42 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
通过日志会发现,客户端是先伪装成了192.168.1.34这个ip后再访问的web服务器!
6.2、firewalld实现DNAT
端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口,通常要配合地址伪装才能实现.
实例:实现外部主机访问内部服务
步骤如下:
1、开启路由转发
[root@snat zones]
[root@snat zones]
[root@snat zones]
2、添加提供访问的端口
[root@snat zones]
success
3、添加转发的端口和ip地址
格式:firewall-cmd --permanet --zone=<区域> --add-forward-port=port=源端口号:proto=<协议>:toport=<目标端口>:toaddr=<目标IP地址>
[root@snat zones]
success
4、开启FirewallD的ip地址伪装
[root@snat zones]
5、配置生效
[root@snat zones]
success
[root@snat zones]
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33 ens38
sources:
services: ssh dhcpv6-client
ports: 8091/tcp
protocols:
masquerade: yes
forward-ports: port=8091:proto=tcp:toport=80:toaddr=192.168.1.48
source-ports:
icmp-blocks:
rich rules:
6、中转服务器上的8091端口实际是没有打开的
[root@snat zones]
7、客户端主机测试访问http://192.168.1.34:8091,实际访问的是192.168.1.48主机上的nginx 80端口服务,但是nginx日志记录的源ip地址为中转服务器的ip地址,这样就实现了地址伪装
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:Linux运维实战总结
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)