概述
最近研究了一下RHEL的firewalld,参考文档:
Redhat Firewalld Doc
Firewalld Examples
Firewalld Examples
Zones
RHEL系统内预定义了若干个zone,每个zone可以看作是一组规则集。预定义的zone在/usr/lib/firewalld/zones/该目录下。默认启用的是public zone。zone内的规则都是可以修改的,通过firewall-cmd来操作防火墙的时候,是将请求发送给了NetworkManager服务,而并非由firewalld服务直接处理请求。
Example
1. 查看当前默认zone
firewall-cmd --get-default-zone
2. 设置默认zone
firewall-cmd --set-default-zone zone-name
3. 查看生效的zone并且显示哪些网卡分配给了zone
firewall-cmd --get-active-zones
4. 分配网卡到新zone
firewall-cmd --zone=zone-name --change-interface=<interface-name>
5. 修改zone的target策略
firewall-cmd --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
Services
同样,系统内预定义了很多Services,每个Service包含了服务所需的默认端口集。预定义的services在/usr/lib/firewalld/services/,可以该目录下的预定义services文件来创建自定义的service。自定义的services在/etc/firewalld/services/。
Example
1. 从xml配置文件新建service
firewall-cmd --new-service-from-file=service-name.xml
Runtime和Permanent
任何运行在runtime模式下的配置都仅在firewalld运行时生效,如果firewalld重启或者firewall-cmd --reload时,所有设置都会被回退到permanent时的值。如果通过firewall-cmd修改配置,想直接以永久生效的策略运行,可以直接加--permanent参数。也可以运行在runtime后,再追加firewall-cmd --runtime-to-permanent,使runtime配置刷新至permanent。
Example
1. 修改配置后,验证效果,并刷新到permanent
firewall-cmd <options>
firewall-cmd --runtime-to-permanent
2. 直接修改配置到permanent,再reload生效
firewall-cmd --permanent <options>
firewall-cmd --reload
Port
开放端口始终秉持最小化原则,不用不开。
Example
1. 查看所有允许端口
firewall-cmd --list-ports
2. 增加开放端口,允许被访问
firewall-cmd --add-port=port-number/port-type
3. 删除开放端口
firewall-cmd --remove-port=port-number/port-type
Source
把source添加到zone中,来管理来自特定源地址的网络流量。当数据包抵达的时候,firewalld先检查源地址是否能匹配到某个zone内的source,如果可以匹配到,那就走那个zone的规则。如果源地址不属于任何一个zone的source,则取决于流量是从哪个网卡进入的,则匹配该网卡所在的zone。
Example
1. 在指定zone添加source
firewall-cmd --zone=zone-name --add-source=<source>
2. 指定zone列出所有sources
firewall-cmd --zone=zone-name --list-sources
ICMP管理
firewalld提供屏蔽ICMP请求的功能,当zone target=REJECT的时候,ping包会收到reject的请求。这种情况对于攻击者来说,仍然可以知道该IP是活着的,所以针对这种情况,应该丢弃所有ICMP请求,要做的是把target改成DROP。在企业内网中,我倾向于放开ICMP请求,方便troubleshooting等工作。
Direct Rule
直接规则语法和iptables类似,可以用firewall-cmd --direct --get-rules来查看通过firewall-cmd --direct --add-rule添加的规则。这部分添加的规则不属于任何zone,添加语法:[--permanent] --direct --add-rule { ipv4 | ipv6 | eb } table chain priority args
Rich Rule
rich rule的语法规则比较人性化,不抽象。可以用来制定复杂的规则。
添加语法:firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]
上面引号内的rule具体语法如下:
rule [family="rule family"]
[ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
[ destination [NOT] address="address" ]
[ element ]
[ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
[ audit ]
[ action ]