firewalld是Linux系列最新的网络防火墙管理服务,它包装了之前iptables
,并非替换iptables
,通过提供更加方便操作来提升服务质量。
firewalld中引入zone和services的概念,而不是iptables
中的chain和rules
firewalld能够动态的改变规则集,同时不会影响已经建立起来的connection和session
sudo yum install firewalld # 安装firewalld服务
sudo systemctl start firewalld # 启动firewalld服务
sudo systemctl stop firewalld # 停用firewalld服务
sudo systemctl enable firewalld # 设置firewalld自启动
sudo systemctl status firewalld # 查看firewalld运行状态
firewalld服务的相关设置通过命令firewall-cmd
来完成。
比如:输出当前防火墙是否在运行
[root@localhost ~]# firewall-cmd --state
running
firewalld的配置是通过XML文件的形式,当然我们的配置途径是通过firewall-cmd命令完成,避免直接去操作xml文件去配置,配置文件主要放置在如下两个目录:
/usr/lib/firewalld
:这里保存着预定义默认的zone和通用serivce的配置,这里面的配置不要去修改,因为firewalld的包升级会更新里面的内容/etc/firewalld
:这里面保存着系统配置文件,这里面的配置内容优先覆盖上面目录的配置内容firewalld的配置集(configuration sets)分为两类: Runtime
和Permanent
.
Runtime:这类配置只能运用到当前的运行环境中,一旦重启机器或者重启firewalld服务,配置内容就丢失了
Permanent:这类配置持久化配置内容,在后续重启机器或者重启firewalld服务中会立即生效
两者的配置方式主要通过是否包含--permanent
来区分,默认是Runtime,示例如下:
sudo firewall-cmd --zone=public --add-service=http --permanent # 当前配置为permanent规则
sudo firewall-cmd --zone=public --add-service=https # 当前配置为Runtime规则
sudo firewall-cmd --reload # 重启firewalld服务,此时上面https服务配置丢失,http配置开始生效, 同时需要注意的时,如果已经使用之前Runtime规则建立起来的连接仍然有效,这一点由firewalld的特点决定的
zone引入的主要作用是将应用不同场景的规则进行打包,提供更高程度的抽象,而不像iptables
那种比较原始的哪些端口开通或者拒绝,通过zone的规则封装以及zone本身的语义化,可以更好的帮助理解和复用.
zone的配置可以作用在不同网络接口上,如果某网络接口没有指定zone,则默认使用默认的zone.
查看默认zone的命令如下:
sudo firewall-cmd --get-default-zone
当然,你也可以修改默认的zone:
sudo firewall-cmd --set-default-zone=zoneXXX
查看已经被网络接口应用的zone列表:
sudo firewall-cmd --get-active-zones
查看具体zone的详细信息:
sudo firewall-cmd --zone=zoneXXX --list-all
查看所有zone的详细信息:
sudo firewall-cmd --list-all-zones
示例:
[root@localhost firewalld]# firewall-cmd --get-default-zone
public
[root@localhost firewalld]# firewall-cmd --get-active-zones
public
interfaces: ens33
[root@localhost firewalld]#
[root@localhost firewalld]# firewall-cmd --get-default-zone
public
[root@localhost firewalld]# firewall-cmd --get-active-zones
public
interfaces: ens33
[root@localhost firewalld]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: 2181/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@localhost firewalld]# firewall-cmd --list-all-zones
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: 2181/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
...省略...
firewalld可以应用针对特定服务而预定义的规则集,当然用户可以自定义自己的服务,然后将其运营在任何的zone上.
默认支持的service定义放在目录: /usr/lib/firewalld/services
.
用户自定义的service定义放在目录: /etc/firewalld/services
.
查看默认可用的服务:
sudo firewall-cmd --get-services
应用service到zone上:
sudo firewall-cmd --zone=public --add-service=http --permanent # 配置service到zone
sudo firewall-cmd --zone=public --remove-service=http --permanent # 从zone中删除指定的service
通过查看预定义的service配置文件,我们可以自定义自己的service,写法也比较简单,需要注意的是,文件放到/etc/firewalld/serivces
目录下:
<service>
<short>Jiangjian Demo Serviceshort>
<description>just testdescription>
<port protocol="udp" port="8081"/>
service>
通过如下命令完成:
sudo firewall-cmd --zone=pubic --add-port=1234/tcp --permanent # 允许TCP端口1234
sudo firewall-cmd --zone=public --remove-port=1234/tcp --permanent # 拒绝TCP端口1234
相同主机内不同端口间转发.
命令格式: sudo firewall-cmd --zone=public --add-forward-port=port=80:prto=tcp:toport=1234 # 将80端口的请求转发给端口1234
不同主机间的转发.
masquerade
,命令格式为: sudo firewall-cmd --zone=public --add-masquerade
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=198.1.1.2
sudo firewall-cmd --zone=public --remove-masquerade
sudo firewall-cmd --zone=dmz --add-interface=ens33 # 将dmz zone配置应用到网络接口ens33
sudo firewall-cmd --zone=dmz --remove-interface=ens33 # 将dmz zone配置从网络接口ens33删除
firewalld定义了一套DSL,具体的语言细节参考: https://jpopelka.fedorapeople.org/firewalld/doc/firewalld.richlanguage.html
我们通过--add-rich-rule
, --list-rich-rules
和--remove-rich-rule
去管理rich rule.
示例:
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.0.2.0 accept' # 允许所有来着192.0.2.0的ipv4流量
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.0.2.0" port port=22 protocol=tcp reject' # 拒绝来着192.0.2.0的tcp 流量到端口22
sudo firewall-cmd --zone=public --list-rich-rules # 查看zone public所有的rich rule
firewalld提供操作直接操作iptables的入口
firewall-cmd --direct --get-all-chains # 获取iptables配置的chains
firewall-cmd --direct --get-all-rules # 获取iptables配置的rules