2020-07-18 上海
firewalld服务
firewalld是Linux系列最新的网络防火墙管理服务,它包装了之前iptables
,并非替换iptables
,通过提供更加方便操作来提升服务质量。
firewalld中引入zone和services的概念,而不是iptables
中的chain和rules
firewalld能够动态的改变规则集,同时不会影响已经建立起来的connection和session
安装和管理firewalld
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服务管理
firewalld服务的相关设置通过命令firewall-cmd
来完成。
比如:输出当前防火墙是否在运行
[root@localhost ~]# firewall-cmd --state
running
firewalld配置
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概念
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
publicinterfaces: ens33
[root@localhost firewalld]#
[root@localhost firewalld]# firewall-cmd --get-default-zone
public
[root@localhost firewalld]# firewall-cmd --get-active-zones
publicinterfaces: ens33
[root@localhost firewalld]# firewall-cmd --zone=public --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens33sources:services: ssh dhcpv6-clientports: 2181/tcpprotocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:[root@localhost firewalld]# firewall-cmd --list-all-zones
public (active)target: defaulticmp-block-inversion: nointerfaces: ens33sources:services: ssh dhcpv6-clientports: 2181/tcpprotocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:trustedtarget: ACCEPTicmp-block-inversion: nointerfaces:sources:services:ports:protocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:...省略...
service概念
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
目录下:
<?xml version="1.0" encoding="utf-8"?>
<service><short>Jiangjian Demo Service</short><description>just test</description><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
Forwarding(转发)
-
相同主机内不同端口间转发.
命令格式:sudo firewall-cmd --zone=public --add-forward-port=port=80:prto=tcp:toport=1234 # 将80端口的请求转发给端口1234
-
不同主机间的转发.
- 激活zone的
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
网络接口添加/删除zone
sudo firewall-cmd --zone=dmz --add-interface=ens33 # 将dmz zone配置应用到网络接口ens33
sudo firewall-cmd --zone=dmz --remove-interface=ens33 # 将dmz zone配置从网络接口ens33删除
Rich rules
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
Iptables操作
firewalld提供操作直接操作iptables的入口
firewall-cmd --direct --get-all-chains # 获取iptables配置的chains
firewall-cmd --direct --get-all-rules # 获取iptables配置的rules