-
Notifications
You must be signed in to change notification settings - Fork 0
Description
1. firewalld 概念
firewall 包含了两层设计:核心层以及 D-Bus 层,核心层负责配置信息处理,后端类似 iptables, ip6tables, ebtables, ipset 等处理以及模块装载等。
D-Bus 接口是主要进行配置的创建和更改,这个接口用于和 firewall-cmd, firewall-config 和 firewall-applet 这些工具进行交互。
firewall 不依赖于 NetworkManager,但是非常推荐一起使用,因为如果不安装 NetworkManager, firewalld 的一些功能会受到限制,例如 firewalld不会收到网络设备重命名的通知。
firewall 和 iptables 同样都是基于 kernel(netfilter) 来实现的网络管理工具,其内核都是 kernel(netfilter),但在配置上比 iptables 更加容易,不理解 iptables 的“五张表五条链”也可以使用 firewall 进行防火墙的配置。
firewalld 配置目录
firewalld 有两个配置目录:/usr/lib/firewalld 和 /etc/firewalld。
/usr/lib/firewalld 是默认配置目录,无法更改。
/etc/firewalld 是系统或用户配置目录,在这里面存放了用户配置信息,并且会覆盖默认配置。如果没有 /etc/firewalld 目录或者目录中没有配置文件,firewalld 会使用默认配置。
Runtime 配置与 Permanent 配置
配置分为 Runtime 配置与 Permanent 配置两种。
Runtime 配置是实时的,一旦变更后也会即时生效。当 firewalld 启动时,Permanent 配置会自动转换为 Runtime 配置,但是不会自动保存到 Permanent 配置中。
当 firewalld 停止时,Runtime 配置也会丢失,firewalld 重启后,会用 Permanent 配置覆盖之前的 Runtime 配置。
Permanent 配置存储在配置文件中,每当 firewalld 重启或者重载时,会被重新载入。
将 Runtime 配置转换为 Permanent 配置,可以通过命令来完成:
firewall-cmd --runtime-to-permanentZone
Zone: 区域,定义了一个可信区用于连接、网卡接口(Interfaces)或源地址(Sources)绑定。这是一个“1对多”的关系,一个连接、网卡接口或源地址只能是一个 Zone 的一部分,而一个 Zone 可以包含许多。
有一些预定义的 Zone
firewall-cmd --get-zones- 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: 拒绝进入的流量,除非与出去的流量相关,IPv4 显示
icmp-host-prohibitedIPv6 显示icmp6-adm-prohibited - drop: 扔掉进入的流量,除非与出去的流量相关
使用以下命令可以查看 public Zone 的配置:
firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3 enp0s8
sources:
services: ssh dhcpv6-client http
ports: 9100/tcp 9200/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:target
当一个 Zone 通过源地址或网卡接口来处理包时,如果没有明确的规则来匹配,那就通过 targets 来决定如何处理:
- ACCEPT:通过这个包。
- %%REJECT%%:拒绝这个包,并返回一个拒绝的回复。
- DROP:丢弃这个包,不回复任何信息。
- default:不做任何事情。该区域不再管它,把它踢到“楼上”。
interfaces
绑定当前 Zone 的网卡接口,如果存在没有指定的 interfaces,会自动绑定到 default Zone。通过 ip addr 来查看有多少 interfaces。
sources
绑定当前 Zone 的源地址,其格式可以为 address/mask 例如 192.168.1.1/24,支持IPv6,但不支持域名。
services
当前 Zone 开启的服务。firewall-cmd --get-services 查看可以添加的 services;firewall-cmd --list-services 显示当前 Zone 已添加 services。
ports
当前 Zone 开启的端口号。
protocol
当前 Zone 开启的协议。通过 /etc/protocols 可以查看,常用的协议包括 tcp, udp等。
rich rules
当前 Zone 开启的定制化规则。
其他
可以参考官方文档
Active Zone
Zone 分为 active Zone 和非 active Zone,通过命令可以查看:firewall-cmd --get-active-zones 默认情况下,active Zone 为 public Zone。
如何变成 active Zone?当指定 source 或者 interface 到指定的 Zone 后,该 Zone 就会变成 active Zone,例如:
firewall-cmd --get-active-zones
#显示有两个 interface
public
interfaces: enp0s3 enp0s8接着,我们先增加 192.168.1.1/24 到 home Zone 当中去,此时 home Zone 已经被激活:
firewall-cmd --zone=home --add-source=192.168.1.1/24
firewall-cmd --get-active-zones
#显示有两个 interface
home
sources: 192.168.1.1/24
public
interfaces: enp0s3同样的,我们把 enp0s8 接口放到 drop Zone:
firewall-cmd --zone=trusted --change-interface=enp0s8
firewall-cmd --get-active-zones
#显示有两个 interface
home
sources: 192.168.1.1/24
public
interfaces: enp0s3
drop
interfaces: enp0s8包的处理流程
只有 active Zone 才会参与到包的处理过程中来,并且规则如下:
- 如果匹配到 source 的 Zone(不一定存在),如果这个包满足相关条件(rich rule, service, 白名单, target 不是 default) 我们就在这里进行规则处理,否则,我们将包向上传递;
- 如果匹配到 interface 的 Zone(一定会存在),如果该 Zone 能够处理这个包,那么就进行处理,否则继续向上传递;
- firewall 默认行为,接受 icmp 的包,拒绝其他所有包。
刚才我们有提到,Zone 和 source, interface 的关系是“一对多”,也就是说同一组 source 只能对应一个 Zone,例如以上的例子中 192.168.1.1/24 已经加入到 home Zone,所以无法再加入到其他的 Zone 中,同理 interface。
显然,source 匹配的优先级高于 interface,因此一般多区域的设计模式是:先创建一个 source Zone 允许特殊 IP 地址访问系统服务,再通过 interface Zone 来对其他的访问做限制。
所以,按照以上例子的配置,当IP为 192.168.1.2 的数据包访问 http 服务时,将会首先匹配到 home Zone,firewall-cmd --zone=home --list-all 查看发现 http 服务没有开启,target 为 default,所以会被丢到上一层;这里假设 192.168.1.1 属于 enp0s8 网卡,那么将会匹配到 drop Zone,target 为 DROP,所以会将包直接丢弃。
配置方法
有两种配置方法,一种是通过写入 XML 配置文件,另一种是通过 firewall-cmd 命令,这里介绍第二种。
2. 配置
firewall 服务启动、停止、禁用
systemctl start firewalld # 启动
systemctl status firewalld # 查看状态
systemctl disable firewalld # 停止
systemctl stop firewalld # 禁用
firewall-cmd --version # 查看版本runtime / permanent 区别
当需要配置永久生效时,需要使用 --permanent参数,并且在配置完成后 firewall-cmd --reload,如果没有则表示都是 runtime 设置,在重载或重启后,配置会丢失,如果想要将 Runtime 配置转换为 Permanent 配置,可以通过命令来完成:
firewall-cmd --runtime-to-permanent注意:以下配置命令都会省略 --permanent
Zone 相关
firewall-cmd --get-zones # 显示所有 Zone
firewall-cmd --get-active-zones # 显示 active Zone
firewall-cmd --zone=[zone] --list-all # 查看指定 Zone 信息
firewall-cmd --set-default-zone=[zone] # 设置默认的 Zone
firewall-cmd --new-zone=[zone] # 新建 Zonetarget 相关
firewall-cmd --permanent --zone=[zone] --get-target # 查看指定 Zone 的target,这里的 --permanent 不能省略
firewall-cmd --permanent --zone=[zone] --set-target=[target] # 设置 target 的值,这里的 --permanent 不能省略interfaces 相关
firewall-cmd --get-zone-of-interface=[interface] # 查看指定网卡接口的 Zone
firewall-cmd --zone=[zone] --list-interfaces # 查看指定 Zone 下的 interfaces
firewall-cmd --zone=[zone] --add-interface=[interface] # 添加指定 interface 到指定的 Zone
firewall-cmd --zone=[zone] --change-interface=[interface] # 修改指定的 interface 到指定的 Zone
firewall-cmd --zone=[zone] --remove-interface=[interface] # 删除指定 Zone 上的指定 interfacesources 相关
firewall-cmd --zone=[zone] --list-sources # 查看指定 Zone 下的 sources
firewall-cmd --zone=[zone] --add-source=[source/mask] # 添加指定 source 到指定的 Zone
firewall-cmd --zone=[zone] --change-source=[source/mask] # 修改指定的 source 到指定的 Zone
firewall-cmd --zone=[zone] --remove-source=[source/mask] # 删除指定 Zone 上的指定 sourceservices 相关
firewall-cmd --get-services # 查看当前可用的 services
firewall-cmd --zone=[zone] --list-services # 查看指定 Zone 下的 services
firewall-cmd --zone=[zone] --add-service=[service] [--timeout=seconds] # 添加指定 service 到指定的 Zone,可设置生效时间
firewall-cmd --zone=[zone] --remove-service=[service] # 删除指定 Zone 上的指定 serviceports 相关
firewall-cmd --zone=[zone] --list-ports # 查看指定 Zone 下的 ports
firewall-cmd --zone=[zone] --add-port=[portid/protocol] [--timeout=seconds] # 添加指定 port/protocol 到指定的 Zone,可设置生效时间
firewall-cmd --zone=[zone] --remove-port=[portid/protocol] # 删除指定 Zone 上的指定 port
firewall-cmd --zone=[zone] --query-port=[portid/protocol] # 查询是否在指定 Zone 上存在指定的 portid/protocol这里 protocol 的可选值为 4 个:tcp|udp|sctp|dccp
rich rule 相关
firewall-cmd --zone=[zone] --list-rich-rules # 查看规则
firewall-cmd --zone=[zone] --add-rich-rule="[rich-rule]" [--timeout=seconds] # 添加规则
firewall-cmd --zone=[zone] --remove-rich-rule="[rich-rule]" # 删除规则[rich-rule]有一套完整的 rich-rule-language:
rule
[family="ipv4|ipv6"]
[source address="address[/mask]"|mac="mac-address"|ipset="ipset"]
[destination address="address[/mask]"]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]
family="ipv4|ipv6" 如果存在 family 并且给出指定的值,那么就在指定值生效,如果没有给出指定值,那么默认在 ipv4 和 ipv6 都会生效。需要注意的是,如果使用了 source 或 destination,那么必须加上 family。
例1:允许来自 192.168.1.1/24 网段的所有流量
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.1/24" accept"
例2:拒绝来自 192.168.1.202 地址访问 22 端口
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.202" port protocol="tcp" port="22" reject"
例3:允许ipv6地址为2001:db8::/64子网的主机访问dns服务,并且每小时审核一次,300秒后自动取消
firewall-cmd --add-rich-rule="rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject" --timeout=300
(本文完)
