Firewalld防火墙管理
# Firewalld
# 介绍
Firewalld是Linux系统中的一款防火墙管理工具。firewalld和iptables一样只用于维护规则,真正使用规则生效、实现防火墙功能的是内核的netfilter。
firewalld和iptables的相同点:
- 都是Linux系统中的防火墙策略管理工具。
- 都是基于内核的netfilter实现防火墙功能,以处理和过滤网络数据包。
firewalld和iptables的不同点:
- firewalld相较iptables多了区域(zones)的概念,区域用于分组规则,更加直观和易于管理。
- firewalld除了命令行工具firewall-config外,还提供firewall-config工具进行图形化方式的管理,而iptables仅支持命令行工具进行管理。
- firewalld提供动态防火墙管理,无需重启服务即可应用规则的更改。而iptables更改规则通常需要重新加载整个规则集,这可能会短暂中断正在处理的连接。
- firewalld使用--permanent参数来将规则持久化到配置文件中,从而使规则在重启后仍然有效。而iptables需要使用外部脚本(如iptables-save和iptables-restore)来保存和恢复规则。
- firewalld是一个动态的守护进程,它可以在不中断服务的情况下实时应用防火墙规则更改。而iptables并不是一个守护进程,它实际上是一套用于配置netfilter的用户空间工具。
# 区域
# 介绍
区域(zones)是firewalld的核心概念之一,它用于提供了一种灵活的方式来管理不同网络接口和规则的分组。区域可以看作是防火墙策略的容器,每个容器包含一组规则和设置,用来定义如何处理对应区域的入站和出站流量,以适应不同的安全需求。
实际使用时,我们可以根据根据网络的信任级别(即网络位置,例如家庭、公共、受信任等)或用途来划分区域,并定义不同区域允许或拒绝的服务、流量类型等。
每个网络接口可以指定一个区域,未明确设置的任何网络接口将使用默认的public区域,我们可以根据不同场景给接口关联合适的区域。
例如:有内网和外网的接口,我们可以给内网接口关联internal区域并允许DHCP,给外网接口关联external区域并允许HTTP和SSH。
# 内置区域
区域 | 默认规则策略 |
---|---|
trusted | 用于信任网络,允许所有的数据包流入与流出。 |
home | 用于家庭网络,仅接收ssh、mdns、gp-client、samba-client、dhcpv6-client相关服务的数据包。 |
internal | 用于内部网络,同等于home区域。 |
work | 用于工作网络,仅接受ssh、ipp-client、dhcpv6-client相关服务的数据包。 |
public | 公共区域,firewalld的默认区域,仅接受ssh、dhcpv6-client相关服务的数据包。 |
external | 用于外部网络,仅接受ssh相关服务的数据包。 |
dmz | 隔离区域,仅接受ssh相关服务的数据包。 |
block | 拒绝区域,拒绝所有的数据包,会回复拒绝。 |
drop | 丢弃区域,丢弃所有的数据包,直接丢弃数据包。 |
内置区域的配置文件保存在
/usr/lib/firewalld/zones/
目录下。
# 规则状态
Firewalld的规则两种状态:
运行时(runtime),指定规则后会立即临时生效,但不会持久化到配置文件,重载后不会被保留。
firewall-cmd [RULE]
1持久配置(permanent),规则会被持久化到配置文件中,需要重载才会生效。
firewall-cmd --permanent [RULE] firewall-cmd --reload
1
2
# 区域相关命令
# 查询
# 查看指定区域配置信息,不指定则查询默认的public区域
firewall-cmd --list-all --zone=[区域名]
# 查看当前默认区域
firewall-cmd --get-default-zone
# 查看所有可用区域
firewall-cmd --get-zones
# 查看正在使用的区域与网卡名
firewall-cmd --get-active-zones
# 查看网卡绑定在了哪个区域
firewall-cmd --get-zone-of-interface=[网络接口名]
# 查看所有ICMP类型
firewall-cmd --get-icmptypes
2
3
4
5
6
7
8
9
10
11
12
区域配置信息说明
public (active) # 活动的区域。
target: default # 默认启动的区域。
icmp-block-inversion: no # 切换ICMP数据包黑白名单模式,默认为no表示黑名单模式,默认放行。
interfaces: ens33 # 关联的网卡接口。
sources: 192.168.182.147 # 允许的来源,可以是IP地址,也可以是mac地址。
services: dhcpv6-client ssh # 允许的服务。
ports: 2181/tcp 8888/tcp 80/tcp # 允许的目标端口。
protocols: # 协议值可以是一个协议ID数字,或者一个协议名。
masquerade: no # 表示这个区域是否允许IP伪装。如果yes将允许IP转发,可以让主机作为一个路由器。
forward-ports: # 列出转发的端口。
source-ports: # 允许的来源端口。
icmp-blocks: # ICMP黑名单模式下指定的ICMP类型会被拒绝,ICMP白名单模式下指定的ICMP类型会被放行。
rich rules: # 富规则,即更细致的防火墙规则策略,它的优先级在所有的防火墙策略中是最高的。
# 新增
# 新增自定义区域
firewall-cmd --new-zone=[区域名]
# 在icmp-blocks中添加ICMP类型
firewall-cmd --add-icmp-block=[ICMP类型] --zone=[区域名]
# 新增指定网卡与指定区域关联
firewall-cmd --add-interface=[网卡名] --zone=[区域名]
2
3
4
5
6
# 修改
# 修改默认区域
firewall-cmd --set-default-zone=[区域名]
# 修改指定网卡与指定区域关联
firewall-cmd --change-interface=[网卡名] --zone=[区域名]
2
3
4
# 删除
# 删除自定义区域
firewall-cmd --delete-zone=[区域名]
# 在icmp-blocks中删除ICMP类型
firewall-cmd --zone=[区域名] --remove-icmp-block=[ICMP类型]
# 删除指定网卡与指定区域的关联
firewall-cmd --remove-interface=[网卡名] --zone=[区域名]
2
3
4
5
6
# 放行规则命令
不指定区域则表示使用默认的public区域。
# 查询
# 查询预定义的服务名,只有预定义的服务才能被规则使用
firewall-cmd --get-services
# 查询区域放行的端口
firewall-cmd --list-ports --zone=[区域名]
# 查询区域放行的IP段
firewall-cmd --list-sources --zone=[区域名]
2
3
4
5
6
# 新增
如果需要添加多个规则可以使用{xxx, xxx, ...}的方式书写,例如:--add-port={1000/tcp, 1002/tcp}
另外端口规则还可以指定范围,例如:--add-port=1000-1005/tcp
如果需要持久化到配置则需要加上--permanent参数并在添加后使用--reload重载配置。
# 在指定区域新增端口放行规则
firewall-cmd --zone=[区域名] --add-port=[端口/协议]
# 在指定区域新增来源放行规则
firewall-cmd --zone=[区域名] --add-source=[MAC地址或IP或IP段]
# 在指定区域新增服务放行规则
firewall-cmd --zone=[区域名] --add-service=[服务名]
2
3
4
5
6
# 删除
如果需要删除持久化配置则需要加上--permanent参数并在添加后使用--reload重载配置。
# 在指定区域删除端口放行规则
firewall-cmd --zone=[区域名] --remove-port=[端口/协议]
# 在指定区域删除来源放行规则
firewall-cmd --zone=[区域名] --remove-source=[MAC地址或IP或IP段]
# 在指定区域删除服务放行规则
firewall-cmd --zone=[区域名] --add-service=[服务名]
2
3
4
5
6
# 例子
# 放行80/8080端口
firewall-cmd --zone=public --add-port={80/tcp,8080/tcp}
2
# 转发规则命令
会将请求到本机指定端口的数据包,转发到目标主机的目标端口。
# 启用转发
# 需要现在内核启用ipv4端口转发功能
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
2
3
# 新增转发
如果需要持久化到配置则需要加上--permanent参数并在添加后使用--reload重载配置。
# 开启指定区域IP伪装功能,永久开启也需要使用--permanent参数
firewall-cmd --zone=[区域名] --add-masquerade
# 在指定区域新增端口转发规则,如果不指定主机则会转发到本机的目标端口。
firewall-cmd --zone=[区域名] --add-forward-port=port=[源端口号]:proto=[协议]:toport=[目标端口号]:toaddr=[目标IP地址]
2
3
4
5
toaddr指定127.0.0.1无效,想转发到本机不指定即可。
# 删除转发
# 在指定区域删除端口转发规则
firewall-cmd --zone=[区域名] --remove-forward-port=port=[源端口号]:proto=[协议]:toport=[目标端口号]:toaddr=[目标IP地址]
# 关闭指定区域IP伪装功能
firewall-cmd --zone=[区域名] --remove-masquerade
2
3
4
5
# 例子
# 开启IP转发
firewall-cmd --zone=public --add-masquerade --permanent
# 将8080端口转到发到本机的80端口
firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80 --permanent
# 重载配置
firewall-cmd --reload
2
3
4
5
6
# 直接规则命令
直接规则能够让我们绕过区域或服务,直接与底层iptables或nftables规则交互的功能。直接规则传递的参数和iptables、ip6tables、ebtables的参数基本一致。
一般情况下直接规则会优先于firewalld规则进行解析,除非我们将直接规则显式插入firewalld管理的区域中。
使用任何直接规则相关的命令都需要加上--direct
参数,表示要使用直接规则。同样的如果需要持久化生效需要加上--permanent
参数并在添加后使用--reload
重载配置。
# 查询
# 获取所有自定义链
firewall-cmd --direct --get-all-chains
# 获取指定表中的自定义链
firewall-cmd --direct --get-chain {ipv4|ipv6|eb} [表名]
# 查询自定义链是否存在
firewall-cmd --direct --query-chain {ipv4|ipv6|eb} [表名] [自定义链名]
# 获取所有直接规则
firewalld-cmd --direct --get-all-rules
# 获取指定表中指定链中的规则
firewalld-cmd --direct --get-rules {ipv4|ipv6|eb} [表名] [链名]
# 查询规则是否存在
firewall-cmd --direct --query-rule {ipv4|ipv6|eb} [表名] [链名] [优先级] [规则参数]
# 获取所有直通规则
firewall-cmd --direct --get-all-passthroughs
# 获取指定跟踪通道的直通规则
firewall-cmd --direct --get-passthroughs {ipv4|ipv6|eb}
# 查询直通规则是否存在
firewall-cmd --direct --query-passthrough {ipv4|ipv6|eb} [Iptables参数]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 新增
# 新增自定义链
firewall-cmd --direct --add-chain {ipv4|ipv6|eb} [表名] [自定义链名]
# 新增直接规则,可以指定内置链或自定义链,优先级越小越优先
firewall-cmd --direct --add-rule {ipv4|ipv6|eb} [表名] [链名] [优先级] [规则参数]
# 新增直通规则,可以直接传递iptables参数
firewall-cmd --direct --add-passthrough {ipv4|ipv6|eb} [Iptables参数]
2
3
4
5
6
7
8
# 删除
# 删除自定义链
firewall-cmd --direct --remove-chain {ipv4|ipv6|eb} [表名] [自定义链名]
# 删除直接规则,优先级越小越优先
firewall-cmd --direct --remove-rule {ipv4|ipv6|eb} [表名] [链名] [优先级] [规则参数]
# 删除直通规则
firewall-cmd --direct --remove-passthrough {ipv4|ipv6|eb} [Iptables参数]
2
3
4
5
6
7
8
# 例子
# 添加直接规则拒绝来自192.168.10.0/24的80端口请求
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 -s 192.168.10.0/24 -p tcp --dport 80 -j REJECT
firewall-cmd --reload
# 创建直通规则
firewall-cmd --direct --passthrough ipv4 -t filter -I INPUT -s 192.168.1.0/24 -j DROP
2
3
4
5
6
# 富规则命令
firewalld中的富规则提供更细致、更复杂的防火墙策略配置,富规则的优先级在所有防火墙策略中是最高的,它支持以下几种条件和动作:
- 地址和端口限制:指定特定的IP地址、网络或端口范围。
- 协议类型:根据不同的协议(如 TCP、UDP)来过滤流量。
- 时间条件:支持根据时间来应用规则,能够在特定时间段内启用或禁用某些规则。
- 日志记录:在匹配规则时记录日志信息。
- 拒绝或接受动作:明确指定是接受还是拒绝匹配的数据包。
- 速率限制:对匹配的数据包应用速率限制。
- 转发和重定向:将流量转发到其他地址或端口。
- ICMP响应:针对匹配的数据包发送特定类型的 ICMP 响应。
# 富规则语法
# 指定规则应用的地址族
rule [family="ipv4|ipv6"]
# 匹配源地址,invert为true表示反转匹配逻辑,即匹配非指定地址的所有源地址
source address="address[/mask]" [invert="True"]
# 匹配目标地址,invert为true表示反转匹配逻辑,即匹配非指定地址的所有目标地址
destination address="address[/mask]" invert="True"
# 匹配特定的预定义服务
service name="service name"
# 匹配指定端口号和使用的协议,端口可以指定范围例如100-120
port port="port value" protocol="tcp|udp"
# 指定规则生效的时间段
time [day="day-of-week"] [month="month"] [datestart="YYYY-MM-DD"] [datestop="YYYY-MM-DD"] [timestart="HH:MM"] [timestop="HH:MM"]
# 匹配的通信协议,如icmp、tcp、udp等。
protocol value="protocol value"
# 进行端口转发
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
# 记录匹配规则的流量日志,limit用于指定日志记录的速率限制,如每分钟一次就是"1/m"
log [prefix="日志条目的前缀"] [level="日志级别"] [limit value="rate/duration"]
# 匹配成功需要执行的动作,reject还可以指定拒绝的方式,例如reject type="icmp-admin-prohibited"
# 指定规则的优先级,越小越优先,指定优先级的规则比没有指定优先级的规则优先。没有显式指定优先级的规则之间则越先添加越优先。
priority="-32768到32767"
accept | reject [type="reject type"] | drop
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
在命令中使用时不需要换行。
# 查询
# 列出指定区域的所有富规则
firewall-cmd --zone=[区域名] --list-rich-rules
# 查询指定区域是否存在指定富规则
firewall-cmd --zone=[区域名] --query-rich-rule='富规则语句'
2
3
4
# 新增
# 在指定区域内新增富规则
firewall-cmd --zone=[区域名] --add-rich-rule='富规则语句'
2
# 删除
# 在指定区域内删除富规则
firewall-cmd --zone=[区域名] --remove-rich-rule='富规则语句'
2
# 例子
# 实现共享上网,将来自局域网192.168.10.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址
firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.10.0/24 masquerade"
# 允许192.168.10.253的所有流量
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.10.253" accept"
# 记录来自特定地址的HTTP请求
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="http" log prefix="HTTP_ACCESS" level="info" accept'
# 在特定时间段内允许8080端口的流量
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8080" protocol="tcp" time day="Mon-Fri" timestart="09:00" timestop="17:00" accept'
2
3
4
5
6
7
8
9
10
11
12
# 其他命令
# 临时规则
# 在新增参数时使用,表示添加的是一个临时规则,调试使用的
firewalld-cmd [新增规则的参数] --timeout=[超时时间,单位秒]
# 应急命令
# 拒绝所有流量,远程连接会立即断开,只有本地能登陆
firewall-cmd --panic-on
# 取消应急模式,但需要重启firewalld后才可以远程ssh
firewall-cmd --panic-off
# 查看是否为应急模式
firewall-cmd --query-panic
2
3
4
5
6
7
8
9
10
11