介绍
在 Firewalld 早期版本中,规则配置中其实还有一个 「直接规则」的划分,它是一种将 iptables
规则直接写入 Firewalld 管理区域的方法。不知是什么原因,在 Firewalld 官方文档中,这个「直接规则」在未来的版本中会被移除,转而使用一个叫做「策略」的东西作为替换。
Q:在 Firewalld 中,明明已经有区域(zone)的概念了,为什么还要有策略(policy)?
策略是对区域之间的流量应用一组规则,其以 有状态 的 单向 方式影响流量,因此您只需要考虑流量的一个方向即可。
策略与区域的关系是通过分配一组入口区域和一组出口区域来定义的。例如,如果入口区域列表包含 "public" 且出口区域列表包含 "internal",则策略将影响从"public"到 "internal" 区域的所有流量。然而由于策略是单向的,因此不适用于从 "internal" 到 "public" 的流量。
仅当以下的所有条件都被满足时,策略才会生效且是活跃的状态:
- 入口区域列表至少包含一个常规区域(如 public 、work 等)或单个符号区域(Symbolic Zone)
- 出口区域列表至少包含一个常规区域或单个符号区域(Symbolic Zones)
- 对于非符号区域,该区域必须处于活跃状态,换言之,它必须具有分配给它的接口(interface)或源(source)。
注意!符号区域是唯一的,换言之,在入口或出口区域列表中必须是 唯一被允许的区域。例如,您不能在入口区域中同时使用 "public" 和 "HOST"。
符号区域包括:
- HOST – 表示流入当前主机的流量或从当前主机流出的流量。类比 iptables 中的 INPUT 链和 OUTPUT 链
- ANY – 除了 HOST 之外的所有流量,相当于入口区域和出口区域的通配符。
相关命令
--get-policies
– 打印预定义的策略--get-active-policies
– 查看当前活跃的策略--list-all-policies
– 列出为所有策略添加或启用的所有内容--new-policy=<policy>
– 添加一个空内容的新策略--delete-policy=<policy>
– 删除一个已经存在的策略--load-policy-defaults=<policy>
– 加载策略的默认设置--policy=<policy>
– 指定策略进行查询或设置--info-policy=<policy>
– 打印有关策略的信息--path-policy=<policy>
– 打印策略的文件路径,需要配合--permanent
一起使用。
策略与区域的区别
尽管策略与区域有一些功能上的重叠,但是它们之间还是有一些区别的:
- 流量方向 – 策略允许在所有方向上(input、output和 forward)进行过滤。除了少数例外情况,区域仅允许 input 过滤。
- 精准度 – 在 Firewalld 内部,区域是作为一组策略在内部实现的(
ls -l /usr/lib/firewalld/zones/
),换言之,策略可以比区域实现更加精准的流量控制与数据包过滤 - 灵活性 – 对于网络级别的过滤或代表虚拟机和容器进行过滤,策略比区域更加灵活
预定义的策略
在 Firewalld 中预定义了一些策略,它们可能处于活跃状态,也可能处于非活跃状态。
在 RockyLinux 8.9 中,默认只有一个预定义的策略:
Shell > firewall-cmd --get-policies
allow-host-ipv6
也可以查看当前活跃的策略:
Shell > firewall-cmd --get-active-policies
allow-host-ipv6
ingress-zones: ANY
egress-zones: HOST
策略的文件命名规范
在前面《防火墙03 — 了解Firewalld》我们提到这两个目录:
-
/usr/lib/firewalld/ – 该目录下有几个子目录,子目录下是使用 xml 格式存放各种预定义的配置,不能被修改。
Shell > ls -l /usr/lib/firewalld/ total 40 drwxr-xr-x. 2 root root 4096 Sep 29 18:47 helpers drwxr-xr-x. 2 root root 4096 Sep 29 18:47 icmptypes drwxr-xr-x. 2 root root 4096 Sep 29 18:47 ipsets drwxr-xr-x. 2 root root 4096 Sep 29 18:47 policies drwxr-xr-x. 2 root root 20480 Sep 29 18:47 services drwxr-xr-x. 2 root root 4096 Jan 23 20:44 zones
-
/etc/firewalld/ – 管理员定义的配置。一般是将 /usr/lib/firewalld/ 中的对应文件拷贝到相应目录,根据需求做适当的修改。两者的目录结构其实没有太多的区别
Shell > ls -l /etc/firewalld/ | grep -i ^d drwxr-x---. 2 root root 4096 Sep 24 17:25 helpers drwxr-x---. 2 root root 4096 Sep 24 17:25 icmptypes drwxr-x---. 2 root root 4096 Sep 24 17:25 ipsets drwxr-x---. 2 root root 4096 Sep 24 17:25 policies drwxr-x---. 2 root root 4096 Sep 24 17:25 services drwxr-x---. 2 root root 4096 Sep 24 17:25 zones
如您所见,预定义的 allow-host-ipv6 策略就存放在这里:
Shell > cat /usr/lib/firewalld/policies/allow-host-ipv6.xml
<?xml version="1.0" encoding="utf-8"?>
<policy target="CONTINUE" priority="-15000">
<short>Allow host IPv6</short>
<description>Allows basic IPv6 functionality for the host running firewalld.</description>
<ingress-zone name="ANY" />
<egress-zone name="HOST" />
<rule family="ipv6">
<icmp-type name="neighbour-advertisement" />
<accept />
</rule>
<rule family="ipv6">
<icmp-type name="neighbour-solicitation" />
<accept />
</rule>
<rule family="ipv6">
<icmp-type name="router-advertisement" />
<accept />
</rule>
<rule family="ipv6">
<icmp-type name="redirect" />
<accept />
</rule>
</policy>
文件 Police-Name.xml 中的 Police-Name 即表示策略的唯一性,这样便于管理与识别,文件内容需要以 xml 格式书写。
策略文件的内容
策略文件内容的标准规范:
<?xml version="1.0" encoding="utf-8"?>
<policy [version="versionstring"] [target="CONTINUE|ACCEPT|REJECT|DROP"] [priority="priority"]>
[ <ingress-zone name="zone"/> ]
[ <egress-zone name="zone"/> ]
[ <short>short description</short> ]
[ <description>description</description> ]
[ <service name="string"/> ]
[ <port port="portid[-portid]" protocol="tcp|udp|sctp|dccp"/> ]
[ <protocol value="protocol"/> ]
[ <icmp-block name="string"/> ]
[ <masquerade/> ]
[ <forward-port port="portid[-portid]" protocol="tcp|udp|sctp|dccp" [to-port="portid[-portid]"] [to-addr="IP address"]/> ]
[ <source-port port="portid[-portid]" protocol="tcp|udp|sctp|dccp"/> ]
[
<rule [family="ipv4|ipv6"] [priority="priority"]>
[ <source address="address[/mask]"|mac="MAC"|ipset="ipset" [invert="True"]/> ]
[ <destination address="address[/mask]"|ipset="ipset" [invert="True"]/> ]
[
<service name="string"/> |
<port port="portid[-portid]" protocol="tcp|udp|sctp|dccp"/> |
<protocol value="protocol"/> |
<icmp-block name="icmptype"/> |
<icmp-type name="icmptype"/> |
<masquerade/> |
<forward-port port="portid[-portid]" protocol="tcp|udp|sctp|dccp" [to-port="portid[-portid]"] [to-addr="address"]/>
]
[
<log [prefix="prefix text"] [level="emerg|alert|crit|err|warn|notice|info|debug"]> [<limit value="rate/duration"/>] </log> |
<nflog [group="group id"] [prefix="prefix text"] [queue-size="threshold"]> [<limit value="rate/duration"/>] </nflog>
]
[ <audit> [<limit value="rate/duration"/>] </audit> ]
[
<accept> [<limit value="rate/duration"/>] </accept> |
<reject [type="rejecttype"]> [<limit value="rate/duration"/>] </reject> |
<drop> [<limit value="rate/duration"/>] </drop> |
<mark set="mark[/mask]"> [<limit value="rate/duration"/>] </mark>
]
</rule>
]
</policy>
<?xml version="1.0" encoding="utf-8"?>
– 必需。声明该文件的内容规范与格式。policy
标签对 – 必需。定义策略的开始与结束,每个策略文件中只能出现一次该标签对。target 属性表示数据包不匹配任何规则时的执行动作,默认动作为 CONTINUE。priority 表示优先级,范围为-32768 到 32767,其中值越低,优先级越高ingress-zone
和egress-zone
标签 – 可选。指定流量入站或出站的区域,可多次使用。区域可以常规区域,也可以是符号区域。short
标签对 – 可选。用于简短说明策略description
标签对 – 可选。用户描述策略service
标签 – 可选。要使用或启用的服务,可多次使用。name 属性中写入您要启用的服务。port
标签 – 可选。要使用的单个端口或多个端口(用 – 表示连续的端口),可多次使用。protocol
标签 – 可选。要使用的协议,可多次使用。icmp-block
标签 – 可选。要使用的 icmp-block 条目,可多次使用。masquerade
标签 – 可选。是否启用伪装,只能使用一次。forward-port
标签 – 可选。指定单端口或连续端口转发到特定 IP 地址的单端口或连续端口,可多次使用。source-port
标签 – 可选。指定多个源端口条目,该标签中的所有属性都是必需的,可多次使用。rule
标签对 – 可选。指定要使用的富规则条目,可多次使用。
