firewalld防火墙

  • 1.firewalld了解:
  • 2.什么是动态防火墙?
  • 3.firewalld防火墙的有关服务和配置文件
  • 4.firewalld的区域zone:
  • 5.firewalld配置方法:
  • 6.firewall-cmd命令选项:
  • 7.firewalld基本练习
  • 8.firewall-cmd的富规则
  • 9.小问题:


1.firewalld了解:

1.firewalld是Centos7.0推出的新的管理netfilter的工具。
2.firewalld是配置和监控防火墙规则的系统守护进程。可以实现iptables,ip6tables,ebtables的功能。
3.firewalld服务是由firewalld包提供。
4.firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则。
5.归入zone顺序:
先根据数据包中源地址,将其纳为某个zone.
纳为网络接口所属zone。
纳入默认zone,默认为public zone,管理员可以改为其他zone。
6.网卡默认属于public zone,lo网络接口属于trusted zone。
7.FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。

2.什么是动态防火墙?

我们首先需要弄明白的第一个问题是到底什么是动态防火墙。为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。

如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。

这里有必要说明一下 firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。

3.firewalld防火墙的有关服务和配置文件

在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等。
与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用。

配置文件的位置:
firewalld 的配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 里的各种 XML 文件里,firewalld 优先使用 /etc/firewalld/services/ 里的文件。

通过编辑 /etc/firewalld/services/ 中的 XML 文件,服务可以被增加和删除,/usr/lib/firewalld/services/ 文件可以作为模板使用。
当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中。

service 配置的好处显而易见:
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:[root@test ~]# firewall-cmd --get-services。

4.firewalld的区域zone:

区域(zone)说明如下:
iptables service 在 /etc/sysconfig/iptables 中储存配置。
firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里。
在/etc/firewalld/的区域设定是一系列可以被快速执行到网络接口的预设定。列表并简要说明如下:

`firewalld zone分类:不同的区域之间的差异是其对待数据包的默认行为不同`
'trusted(信任)'	允许所有的数据包;---》所有的网络连接都可以接受
'home(家庭)'		拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量。---》相信网络上的其他计算机,不会损害你的计算机。
'internal(内部)'	等同于home区域;---》信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
'work(工作)'		拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量;---》相信网络上的其他计算机,不会损害你的计算机。
'public(公共)'		拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量;---》不相信网络上的任何计算机,只有选择接受传入的网络连接
'external(外部)'	拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量;---》不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
'dmz(非军事区)'		拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量;--->隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
'block(限制)'		拒绝流入的流量,除非与流出的流量相关;----》任何传入的网络数据包都将被阻止。
'drop(丢弃)'		拒绝流入的流量,除非与流出的流量相关;----》任何传入的网络连接都被拒绝。

zone区域的作用:
依据不同的工作场景来调用不同的firewalld区域,实现大量防火墙策略规则的快速切换

5.firewalld配置方法:

firewalld三种配置方法:

#firewall-config (firewall-config包)图形工具
 #firewall-cmd (firewalld包)命令行工具
 /etc/firewalld 配置文件,一般不建议

6.firewall-cmd命令选项:

'格式:Usage: firewall-cmd [OPTIONS...]'
`一般选项:`
	-h,--help:帮助。
	-V,--version:firewalld版本信息。
	-q,--quiet:不输出状态信息。
`状态选项:`
	--state:列出防火墙状态。
	--reload:重新加载firewalld并保留状态信息。
	--complete-reload:重新加载firewalld并且不保留状态信息。
	--runtime-to-permanent:从runtime模式变为permanent永久模式。
	--check-config:检查permanent永久配置是否有错误。
	--permanent:永久配置选项。
`zone区域选项:`
	--get-default-zone:打印连接接口的默认区域。
	--set-default-zone=<zone>:设置默认区域。
	--get-active-zones:打印当前活动区域。
	--get-zones:打印firewalld预定义的zone区域。
	--get-services:打印firewalld预定义的服务
	--get-icmptypes:答应预定义的模板。
	--get-zone-of-interface=<interface>:打印绑定到某个网卡接口的区域名称。
	--get-zone-of-source=<source>[/mask]|<MAC>|ipset:<ipset> :打印被绑定到区域的源的ip/mac/网段。
	--list-all-zones:列出所有区域中添加或启用的所有内容。
	--new-zone=<zone>:添加一个新的zone区域
	--new-zone-form-file=<filename> [--name=<zone>]:添加一个来自文件中已写好的zone区域。
	--delete-zone=<zone>:删除一个已存在的zone。
	--load-zone-defaults=<zone>:加载某个区域的默认设置。
	--get-target:查找zone的target。
	--set-target=<target>:设置zone的target。
	--zone=<zone>:使用此zone区域进行设置或查询,否则按默认区域处理相应的设置/查询/删除等操作。
	--info-zone=<zone>:打印某区域zone的消息。
	--path-zone=<zone>:打印某区域的配置文件路径(这个选项只能被--permanent使用)
	
`--list-:(不指定--zone=区域,则为查询默认区域)`
	--list-all			显示当前区域的网卡配置参数、资源、端口以及服务等信息
	--list-all-zones	显示所有区域的网卡配置参数、资源、端口以及服务等信息
	--list-services		显示已被添加到指定zone的服务
	--list-ports		显示已被添加到指定zone的端口
	--list-protocols	列出为区域添加的协议
	--list-source-ports	列出已被添加到指定zone的源端口
	--list-icmp-blocks	列出为区域添加的互联网ICMP类型块
	--list-forward-ports 列出已被添加到zone的ipv4转发端口
	--list-rich-rules	列出添加到某区域的富规则
	--list-interfaces	列出已经被绑定到某个区域的网络接口
	--list-sources		列出已经被绑定到某个区域的源
	
`--add-:(不指定--zone=区域,则为添加选项到默认区域)`
	--add-source=				将源自此IP或子网的流量导向指定的区域
	--add-interface=<网卡名称>	将源自该网卡的所有流量都导向某个指定区域
	--add-service=<服务名>		设置某区域允许该服务的流量
	--add-port=<端口号/协议>		设置默认区域允许某协议端口的流量,支持连续端口:80-100/tcp
	--add-source-port=<port>	设置某个区域的源端口
	--add-protocols=<protocols>	添加协议到某个指定区域(不指定--zone=区域,则为默认区域)
	--add-icmp-blocks=<icmptype>添加互联网ICMP类型块到某区域
	--add-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]] 添加ipv4转发端口到指定区域
	--add-rich-rule=<rule>		添加富规则到某区域	
	--add-interface=<interface> 绑定接口到某区域
	--add-source=<source>[/<mask>]|<MAC>|ipset:<ipset> 将源绑定到某个区域


`--change-:(不指定--zone=区域,则为修改默认区域的选项)`
	--change-interface=<interface>	修改绑定到某个区域的接口
	--change-source=<source>[/<mask>]|<MAC>|ipset:<ipset>  修改绑定到某个区域的源
	--change-interface=<网卡名称>	将某个网卡与区域进行关联

`--remove-:(不指定--zone=区域,则为移除默认区域的选项)`
	--remove-source=			不再将源自此IP或子网的流量导向某个指定区域
	--remove-service=<服务名>	设置默认区域不再允许该服务的流量
	--remove-port=<端口号/协议>	设置默认区域不再允许指定协议端口的流量
	--remove-protocols=<协议>	删除某个指定zone的协议
	--remove-source-port=<port>	移除某个区域的源端口
	--remove-icmp-blocks=<icmptype>删除某区域的互联网ICMP类型块
	--remove-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]]  移除指定区域的转发端口
	--remove-rich-rule=<rule>	移除某个区域的富规则
	--remove-interface=<interface>移除某区域绑定的网卡接口
	--remove-source=<source>[/<mask>]|<MAC>|ipset:<ipset> 移除绑定到某个区域的源
	
`--query-(不指定--zone=区域,则为返回默认区域的选项值)`
	--query-service=<service>  返回该服务是否已被添加到指定区域的值(yes/no)
	--query-port=<port/协议>		返回该协议端口是否已被添加到指定区域的值(yes/no)
	--query-protocol=<protocol>返回该协议是否已被添加到指定区域的值(yes/no)
	--query-source-port=<port> 返回该源端口是否已被添加到指定区域的值(yes/no)
	--query-icmp-block=<icmptype>返回该ICMP类型块是否已被添加到指定区域的值(yes/no)
	--query-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]] 返回该转发端口是否已被添加到指定区域的值(yes/no)
	--query-rich-rule=<rule>	返回该富规则是否已被添加到指定区域的值(yes/no)
	--query-interface=<interface>返回该接口是否已被添加到指定区域的值(yes/no)
	--query-source=<source>[/<mask>]|<MAC>|ipset:<ipset> 返回该源是否已被添加到指定区域的值(yes/no)

`应急选项:`
	--panic-on			开启应急状况模式
	--panic-off			关闭应急状况模式
	--query-panic		返回该应急选项的值(yes/no)
`其他选项:`
	--permanent			设置策略为永久生效模式,不会立即生效,需再执行--reload选项;
	--reload			让“永久生效”的配置规则立即生效,并覆盖当前的配置规则

7.firewalld基本练习

'列出防火墙状态'
[root@localhost cms]# firewall-cmd --state
running
[root@localhost cms]# systemctl  status firewalld
'●' firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: 'active (running)'since Fri 2020-05-29 06:14:22 EDT; 2 weeks 4 days ago
     Docs: man:firewalld(1)
 Main PID: 769 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─769 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

'查询firewalld的预定义区域'
[root@localhost cms]# firewall-cmd  --get-zones
block dmz drop external home internal public trusted work

'查询firewalld默认区域'
[root@localhost cms]# firewall-cmd  --get-default-zone
public

'设置默认区域为dmz'
[root@localhost cms]# firewall-cmd  --set-default-zone=dmz
success

'在dmz区域中允许tcp协议的8080-8082端口通过'
[root@localhost cms]# firewall-cmd  --zone=dmz   --add-port=8080-8082/tcp
success

'查询已被添加到dmz区域的端口'
[root@localhost cms]# firewall-cmd  --zone=dmz   --list-ports
80/tcp 8080-8082/tcp

'列出dmz区域的所有信息'
[root@localhost cms]# firewall-cmd  --zone=dmz   --list-all
dmz
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh
  ports: 80/tcp 8080-8082/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

'删除dmz区域tcp协议的80,8080-8082端口'
[root@localhost cms]# firewall-cmd --zone=dmz  --remove-port=80/tcp
success
[root@localhost cms]# firewall-cmd --zone=dmz  --remove-port=8080-8082/tcp
success
[root@localhost cms]# firewall-cmd --zone=dmz  --list-ports

'把public区域中的HTTP协议的流量设置为永久允许,并立即生效'
[root@localhost cms]#firewall-cmd --permanent --zone=public --add-service=http
success
[root@localhost cms]#firewall-cmd --reload
success

'把public区域中的请求HTTP协议的流量设置为永久拒绝,并立即生效'
[root@localhost cms]# firewall-cmd  --permanent --zone=public --remove-service=http
success
[root@localhost cms]# firewall-cmd  --reload
success

'查询public区域是否允许请求SSH和HTTP协议的流量'
[root@localhost cms]#firewall-cmd --zone=public  --query-service=ssh
yes
[root@localhost cms]#firewall-cmd --zone=public --query-service=http
no

'把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效:'
[root@localhost cms]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
[root@localhost cms]# firewall-cmd --reload
success

8.firewall-cmd的富规则

firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。

`在firewalld服务中配置一条富规则,使其拒绝192.168.10.0/24网段的所有用户访问本机的ssh服务(22端口):`
[root@localhost cms]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
[root@localhost cms]# firewall-cmd --reload
success

`允许rpcbind从192.168.0.0/24网络到端口111(由服务使用)的TCP连接。第二个允许从本地主机到同一端口的TCP连接。其他所有数据包均被丢弃。`
[root@localhost cms]#firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop'
[root@localhost cms]#firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
'要类似地限制UDP流量,请使用以下命令:'
[root@localhost cms]# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop'
有关firewall-cmd的--list-rich-rules,--add-rich-rule=<rule>,remove-rich-rule=<rule>,--query-rich-rule=<rule>的使用,
未完待续......

有关富规则的讲解链接:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/configuring_complex_firewall_rules_with_the_rich-language_syntax

9.小问题:

1.在RHEL 7系统中,iptables是否已经被firewalld服务彻底取代?
答:没有,iptables和firewalld服务均可用于RHEL 7系统。

2.TCP Wrappers服务分别有允许策略配置文件和拒绝策略配置文件,请问匹配顺序是怎么样的?
答:TCP Wrappers会先依次匹配允许策略配置文件,然后再依次匹配拒绝策略配置文件,如果都没有匹配到,则默认放行流量。