防火墙06 — Firewalld策略

介绍

在 Firewalld 早期版本中,规则配置中其实还有一个 「直接规则」的划分,它是一种将 iptables 规则直接写入 Firewalld 管理区域的方法。不知是什么原因,在 Firewalld 官方文档中,这个「直接规则」在未来的版本中会被移除,转而使用一个叫做「策略」的东西作为替换。

Q:在 Firewalld 中,明明已经有区域(zone)的概念了,为什么还要有策略(policy)?

策略是对区域之间的流量应用一组规则,其以 有状态单向 方式影响流量,因此您只需要考虑流量的一个方向即可。

策略与区域的关系是通过分配一组入口区域和一组出口区域来定义的。例如,如果入口区域列表包含 "public" 且出口区域列表包含 "internal",则策略将影响从"public"到 "internal" 区域的所有流量。然而由于策略是单向的,因此不适用于从 "internal" 到 "public" 的流量。

注意
请注意,入口区域列表和出口区域列表可以包含多个区域。

仅当以下的所有条件都被满足时,策略才会生效且是活跃的状态:

  • 入口区域列表至少包含一个常规区域(如 public 、work 等)或单个符号区域(Symbolic Zone)
  • 出口区域列表至少包含一个常规区域或单个符号区域(Symbolic Zones)
  • 对于非符号区域,该区域必须处于活跃状态,换言之,它必须具有分配给它的接口(interface)或源(source)。
术语解释
符号区域(Symbolic Zones):常规区域之外的用于特殊场景需求的区域。例如常规区域不能表示流量的流向(流入或流出),但是符号区域可以做到。

注意!符号区域是唯一的,换言之,在入口或出口区域列表中必须是 唯一被允许的区域。例如,您不能在入口区域中同时使用 "public" 和 "HOST"。

符号区域包括:

  1. HOST – 表示流入当前主机的流量或从当前主机流出的流量。类比 iptables 中的 INPUT 链和 OUTPUT 链
  2. 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 一起使用。

策略与区域的区别

尽管策略与区域有一些功能上的重叠,但是它们之间还是有一些区别的:

  1. 流量方向 – 策略允许在所有方向上(input、output和 forward)进行过滤。除了少数例外情况,区域仅允许 input 过滤。
  2. 精准度 – 在 Firewalld 内部,区域是作为一组策略在内部实现的(ls -l /usr/lib/firewalld/zones/),换言之,策略可以比区域实现更加精准的流量控制与数据包过滤
  3. 灵活性 – 对于网络级别的过滤或代表虚拟机和容器进行过滤,策略比区域更加灵活

预定义的策略

在 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-zoneegress-zone 标签 – 可选。指定流量入站或出站的区域,可多次使用。区域可以常规区域,也可以是符号区域。
  • short 标签对 – 可选。用于简短说明策略
  • description 标签对 – 可选。用户描述策略
  • service 标签 – 可选。要使用或启用的服务,可多次使用。name 属性中写入您要启用的服务。
  • port 标签 – 可选。要使用的单个端口或多个端口(用 – 表示连续的端口),可多次使用。
  • protocol 标签 – 可选。要使用的协议,可多次使用。
  • icmp-block 标签 – 可选。要使用的 icmp-block 条目,可多次使用。
  • masquerade 标签 – 可选。是否启用伪装,只能使用一次。
  • forward-port 标签 – 可选。指定单端口或连续端口转发到特定 IP 地址的单端口或连续端口,可多次使用。
  • source-port 标签 – 可选。指定多个源端口条目,该标签中的所有属性都是必需的,可多次使用。
  • rule 标签对 – 可选。指定要使用的富规则条目,可多次使用。
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇