48小时系统班试听入口

什么是firewalld,简介、策略及规则(Centos7防火墙)

发布作者:新盟教育 发布日期:2022-08-30 浏览人数:5642人

运维必备!快来学!




一、linux防火墙简介


防火墙技术种类:

(1)包过滤防火墙(packet filtering)

(2)应用代理防火墙 (application proxy)

(3)状态检测防火墙(stateful inspection)

(firewalld是包过滤防火墙,所以这里只讲包过滤防火墙)

包过滤防火墙概述:

(1)netfilter:位于Linux内核中的包过滤功能体系,成为Linux防火墙的“内核态”。

(2)firewalld:CentOS7默认的管理防火墙规则的工具,成为Linux防火墙的“用户态”。

————上面的两种称呼都可以表示为Linux防火墙。

包过滤的工作层次:

(1)主要是网络层,针对IP数据包、检查源IP。

(2)体现在对包内的IP地址、端口等信息的处理上。

————Linux服务器主要用于对互联网提供某种服务或作为内部局域网的网关服务器。


二、firewalld简介

概述:

防火墙是Linux系统的主要的安全工具 ,可以提供基本的安全防护,在Linux历史上已经使用过的防火墙工具包括:ipfwadm、ipchains、iptables(即Centos6就是使用的iptables),而在firewalld中新引入了 区域(Zone)这个概念。

特点:

以前的iptables防火墙是静态的,每次修改都要求防火墙完全重启,这个过程包括内核netfilter防火墙模块的卸载和新配置所需模块的装载等,而模块的卸载将会破坏状态防火墙和确立建立的连接,现在firewalld可以动态管理防火墙,firewalld把netfilter的过滤功能集于一身。

总结成几个小点:

1.firewalld提供了支持 网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。

2.支持 IPv4,IPv6 的防火墙设置以及以太网桥接。

3.支持服务或者应用程序直接添加防火墙规则的接口。

4.拥有运行时配置和永久配置两种选项。

  • 运行时配置——服务或系统重启后失效。


  • 永久配置——服务或系统关机、重启后生效。


网络区域:

firewalld预定义的九种网络区域:

①trusted②public③work④home⑤internal⑥external⑦dmz⑧block⑨drop


————默认情况就有一些有效的区域,由firewalld提供的区域按照从不信任到信任的顺序排序。

(1)丢弃区域(Drop Zone):如果使用丢弃区域,任何进入的数据包将被丢弃,这个类似于Centos6上的 iptables -j drop ,使用丢弃规则意味着将不存在相应。

(2)阻塞区域(Block Zone):阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过,即只允许由该系统初始化的网络连接。

(3)公共区域(Public Zone):只接受那些被选中的连接,默认只允许ssh和dhcpv6-client,这个zone是缺省zone(缺省就是默认的意思,所以公共区域也是默认区域,在没有任何配置的情况下走的是公共区域)。

(4)外部区域(External Zone):这个区域相当于路由器的启动伪装(masquerading)选项,只有指定的连接会被接受,即ssh,而其他的连接将被丢弃或者不被接受。

(5)隔离区域(DMZ Zone):如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义,它也拥有只通过被选中连接的特性,即ssh, 这个区域又叫做非军事化区域。

(6)工作区域(Work Zone):在这个区域中,我们只能定义内部网络,比如私有网络通信才被允许, 只允许ssh、ipp-client和dhcpv6-client。

(7)家庭区域(Home Zone):这个区域专门用于家庭环境,它同样只允许被选中的连接, 即ssh、ipp-client、mdns、samba-client和dhcpv6-client。

(8)内部区域(Internal Zone):这个区域和 工作区域(Work Zone) 类似,只允许通过被选中的连接,与 家庭区域(Home Zone) 相同。

(9)信任区域(Trusted Zone):信任区域允许所有网络通信通过,因为 信任区域(Trusted Zone)是最被信任的,即使没有设置任何的服务,那么也是被允许的,因为 信任区域(Trusted Zone)是允许所有连接的。

————以上是系统定义的所有的区域(Zone),但是,不是所有的区域(Zone)都在使用,只有活跃的区域(Zone)才有实际操作意义。

注意:因为默认区域只允许ssh和dhcp,所以在没有任何配置的情况下默认是拒绝ping包的。

检查原则:

如果一个客户端访问服务器,服务器根据以下原则决定使用哪个区域(zone)的策略去匹配:

(1)如果一个客户端数据包的源IP地址匹配Zone的 来源(sources)也就是匹配区域的规则,那么该 Zone的规则就适用这个客户端,一个源只能属于一个 Zone,不能同时属于多个区域(Zone)。

(2)如果一个客户端数据包进入服务器的某一个接口(如ens33网卡接口)匹配了 Zone的 接口(interfaces),则该Zone的规则就适用这个客户端,一个接口只能属于一个 Zone ,不能同时属于多个Zone。

(3)如果上述两个原则都不满足,那么默认的 Zone将被应用 firewalld数据处理流程 ,检查数据来源的源地址。

firewalld数据处理流程:

检查数据来源的源地址:

(1)若源地址关联到特定的区域,则执行该区域所制定的规则。

(2)若源地址未关联到特定的区域,则使用关联网络接口的区域并执行该区域所制定的规则。

(3)若网络接口未关联到特定的区域,则使用默认区域并执行该区域所制定的规则。

数据包处理原则:

检查源地址的处理规则:

1.匹配源地址所在区域。

2.匹配入站接口所在区域。

3.匹配默认区域。

firewalld防火墙的配置方法:

有三种配置方法,分别是:

1.firewall-config图行化工具。

2.firewall-cmd命令行工具。

3./etc/firewalld/中的配置文件。


三、配置firewalld防火墙


(1)使用firewall-config图形化工具配置

打开方式:应用程序——杂项——防火墙( 记得先在终端里打开防火墙):↓


主菜单:文件、选项、查看、帮助:↓


配置:运行时和永久(运行时的是服务重启失效,永久的是服务重启生效):↓


区域:

  • 服务 :哪些服务可信。

  • 端口 :允许访问的端口范围。

  • 协议 :可访问的协议。

  • 源端口 :额外的源端口或范围。

  • 伪装 :私有地址映射为公有ip。

  • 端口转发 :指定端口映射为其他端口 (本机或者其他主机)。

  • ICMP过滤器 :设置具体的icmp类型。


服务:(只适用于永久模式)。

  • 模块 :设置网络过滤的辅助模块。

  • 目标 :如果指定了目的地址,服务则仅限于目的地址和类型,默认没有限制。


——可以通过图形化来配置防火墙。

(2)使用firewall-cmd命令进行配置

(1)启动、停止、查看firewalld服务
启动防火墙
[root@Firewalld ~]# systemctl start firewalld
设置防火墙为开机自启
[root@Firewalld ~]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
查看防火墙运行状态
[root@Firewalld ~]# systemctl status firewalld  (active(running)即正在运行)
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2021-01-05 00:55:57 CST; 9h ago   
     Docs: man:firewalld(1)
 Main PID: 2989 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─2989 /usr/bin/python2 -Es /usr/sbin/firewalld --...


1月 05 00:55:57 CentOS7-1 systemd[1]: Starting firewalld - d...
1月 05 00:55:57 CentOS7-1 systemd[1]: Started firewalld - dy...
Hint: Some lines were ellipsized, use -l to show in full.
[root@Firewalld ~]# firewall-cmd --state   (两种查看命令都可以)
running
(2)查看预定义信息
查看防火墙可用区域
[root@Firewalld ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
查看防火墙默认区域
[root@Firewalld ~]# firewall-cmd --get-default-zone
public
查看防火墙可用服务
[root@Firewalld ~]# firewall-cmd --get-service
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
查看防火墙可用的icmp阻塞类型
[root@Firewalld ~]# firewall-cmd --get-icmptypes 
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
防火墙命令都是能补齐的


-----------------------华丽分割线-----------------------


拒绝所有包:firewall-cmd --panic-on    
取消拒绝状态:firewall-cmd --panic-off
查看是否拒绝:firewall-cmd --query-panic
注意!!!:如果是远程的机器执行上面的规则会立刻断开网络连接,必须紧记不能随便执行。如果你只是虚拟机或者物理机器登陆就可以执行来调试。
-------------------------------------------------------如何清空防火墙规则:

当防火墙配置了很多规则想一次性清空怎么办,firewalld默认没有命令来清空规则,但是我们可以通过编辑配置文件来清除规则。

注意:/etc/firewalld/zones/此处为配置生效后保存的配置文件,建议修改前先备份。

******此目录会显示已经配置的规则
[root@Firewalld ~]# ll /etc/firewalld/zones/
总用量 8
-rw-r--r--. 1 root root 315 7月   2 2020 public.xml
-rw-r--r--. 1 root root 315 7月   2 2020 public.xml.old
vim编辑配置文件
[root@Firewalld zones]# vim /tmp/firewalld.bak/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>                  (这两条service开头的就是允许的服务)
  <service name="dhcpv6-client"/>
</zone>
******在修改之前先创建备份目录
[root@Firewalld ~]# mkdir /tmp/firewalld.bak  (备份目录为firewalld.bak)
[root@Firewalld ~]# mv /etc/firewalld/zones/* /tmp/firewalld.bak/
[root@Firewalld ~]# firewall-cmd --set-default-zone=public   (设置默认区域为public)
Warning: ZONE_ALREADY_SET: public
success
******重启服务
[root@Firewalld ~]# systemctl restart firewalld

区域管理选项说明:(前面都是firewall-cmd)

((1)--get-default-zone                          显示网络连接或接口的默认区域
(2)--set-default-zone=区域名称                  设置网络连接或接口的默认区域
(3)--get-active-zones                          显示已激活的所有区域
(4)--get-zone-of-interface=网卡名称             显示指定接口绑定的区域
(5)--zone=区域名称 --add-interface=网卡名称      为指定接口绑定区域
(6)--zone=区域名称 --change-interface=网卡名称   为指定的区域更改绑定的网络接口
(7)--zone=区域名称 --remove-interface=网卡名称   为指定的区域删除绑定的网络接口
(8)--list-all-zones                             显示所有区域及其规则
(9)--zone=区域名称 --list-all                    显示指定区域的所有规则
(10)--list-all                                  显示默认区域的所有规则


示例:

******显示当前系统的默认区域
[root@Firewalld ~]# firewall-cmd --get-default-zone 
public
******显示默认区域的所有规则
[root@Firewalld ~]# firewall-cmd --list-all
public (active)                    (表示public这个区域是活动区域即可用区域,如果是默认区域会多一个defaults)
  target: default                  
  icmp-block-inversion: no         
  interfaces: ens33                (表示public这个区域的网卡接口是ens33)
  sources:                         (列出了public这个区域的源,现在这里没有,但是如果有的话,格式是xxx.xxx.xxx.xxx/xx)
  services: dhcpv6-client ssh      (表示public区域允许通过的服务类型)
  ports:                           (表示public区域允许通过的端口)
  protocols:                       (允许的通过的协议)
  masquerade: no                   (表示这个区域不允许ip伪装,如果允许的话也同时会允许IP转发,即开启路由功能)
  forward-ports:                   (列出转发的端口)
  source-ports:                   
  icmp-blocks:                     (列出阻塞icmp流量的黑名单)
  rich rules:                      (在public区域中优先处理的高级配置)
-------------------------华丽丽的分割线-------------------------
target的作用:
当一个区域处理它的源或接口上的一个包时,但是没有处理该包的显式规则时,这个时候区域的目标target决定了该行为
(1)ACCEPT :通过这个包
(2)%%REJECT%% :拒绝这个包,并且返回一个拒绝的回复
(3)DROP :丢弃这个包,不回复任何信息
(4)default :不做任何事情,该区域不再管他,把它提到“楼上”
--------------------------------------------------------------
******显示网络接口ens33的对应区域
[root@Firewalld ~]# firewall-cmd --get-zone-of-interface=ens33
public                           (说明ens33的区域是public)
******更改ens33的区域为internal
[root@Firewalld ~]# firewall-cmd --zone=internal --change-interface=ens33 
success                          (更改成功)
[root@Firewalld ~]# firewall-cmd --get-zone-of-interface=ens33
internal                         (再次查看发现已经更改为internal区域)
******查看全部活动区域
[root@Firewalld ~]# firewall-cmd --get-active-zones 
internal
  interfaces: ens33

服务管理选项说明:

***服务存放在/usr/lib/firewalld/services目录中,通过单个的xml配置文件来指定
***xml文件:service-name。xml
(1)--zone=区域名称 --list-services                         显示指定区域内允许访问的所有服务
(2)--zone=区域名称 --add-service=服务名称                   为指定区域设置允许访问的某项服务
(3)--zone=区域名称 --remove-service=服务名称                删除指定区域已设置的允许访问的某项服务
(4)--zone=区域名称 --list-ports                            显示指定区域内允许访问的所有端口号
(5)--zone=区域名称 --add-port=端口号-端口号/协议名          为指定区域设置允许访问的某个或某段端口号并指定协议名(中间的-表示从多少到多少端口号, / 和后面跟端口的协议)
(6)--zone=区域名称 --remove-port=端口号-端口号/协议名        删除指定区域已设置的允许访问的某个端口号或某段端口号并且指定协议名(中间的-表示从多少到多少端口号, / 和后面跟端口的协议)
(7)--zone=区域名称 --list-icmp-blocks                      显示指定区域内拒绝访问的所有ICMP类型
(8)--zone=区域名称 --add-icmp-block=icmp类型               为指定区域设置拒绝访问的某项ICMP类型
(9)--zone=区域名称 --remove-icmp-block=icmp类型            删除指定区域已设置的拒绝访问的某项ICMP类型,省略 --zone=区域名称 时表示对默认区域操作


示例:

******显示默认区域允许访问的所有服务
[root@Firewalld ~]# firewall-cmd --list-services
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.

dhcpv6-client ssh    (说明允许dhcp和ssh)
******设置默认区域允许访问http和https服务 (不加--zone指定的话就是配置默认区域)
[root@Firewalld ~]# firewall-cmd --add-service=http
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.


success
[root@Firewalld ~]# firewall-cmd --add-service=https
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.


success
[root@Firewalld ~]# firewall-cmd --list-services   (再次查看)
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.


dhcpv6-client http https ssh  (多了http和https)
    预定义的服务可以使用服务名配置,同时其对应端口会自动打开,非预定义的服务只能手动指定端口
    ******给指定区域添加tcp443端口
    [root@Firewalld ~]# firewall-cmd --zone=internal --add-port=443/tcp
    success
    [root@Firewalld ~]# firewall-cmd --zone=internal --list-all 
    internal (active)
      target: default
      icmp-block-inversion: no
      interfaces: ens33
      sources: 
      services: dhcpv6-client mdns samba-client ssh
      ports: 443/tcp  (发现添加成功)
      protocols: 
      masquerade: no
      forward-ports: 
      source-ports: 
      icmp-blocks: 
      rich rules: 
    
    ******删除指定区域的443/tcp端口
    [root@Firewalld ~]# firewall-cmd --zone=internal --remove-port=443/tcp
    success
    [root@Firewalld ~]# firewall-cmd --zone=internal --list-all 
    internal (active)
      target: default
      icmp-block-inversion: no
      interfaces: ens33
      sources: 
      services: dhcpv6-client mdns samba-client ssh
      ports: 
      protocols: 
      masquerade: no
      forward-ports: 
      source-ports: 
      icmp-blocks: 
      rich rules:

    两种配置方式:

    1.运行时模式(runtime mode):当前内存中运行,系统或防火墙服务重启或停止,配置失效。

    2.永久模式(permanent mode):永久存储在配置文件中,但是配置完成要重启系统或防火墙。

    ******相关选项:(配置时添加此选项即可)
    --reload 将永久配置应用为运行时配置 
    --permanent 设置永久性规则。服务重启或重新加载时生效 
    --runtime-to-permanent 将当前的运行时配置写入规则,成为永久性配置






    推荐阅读

    >>>新手必备-Linux最常用的20个命令(上)

    >>>新手必备-Linux最常用的20个命令(下)

    >>>新手必备-Linux【yum】命令

    >>>当我自学Linux的时候,我在想什么?

    >>>人到中年,能否顺利转型运维工程师


    运维界升职加薪必备的云计算技术,你学了吗?

    学完高级运维云计算课程之后,你可以:


    • 跨越90%企业的招聘硬门槛

    • 增加70%就业机会

    • 拿下BAT全国TOP100大厂敲门砖

    • 体系化得到运维技术硬实力

    • 技术大佬年薪可达30w+


    资源放送

    2022新版Linux运维高级云计算-红帽RHCE实战课程合集,扫描下方二维码即可领取!

    文章来源网络 侵删