centos7中firewall的使用-3

给复杂防火墙规则配置“Rich Language" 语法

经过 rich language 语法,能够用比直接接口方式更易理解的方法创建复杂防火墙规则。此外,还能永久保留设置。这种语言使用关键词值,是 iptables 工具的抽象表示。这种语言能够用来配置分区,也仍然支持现行的配置方式。python

4.5.15.1. 多语言命令的格式

在这个部分,全部命令都必须以 root 用户身份运行。增长一项规则的命令格式以下:linux

firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout 9=seconds]

这样将为 zone 分区增长一项多语言规则 rule 。这个选项能够屡次指定。若是分区被省略,将使用默认分区。若是出现超时,规则将在指定的秒数内被激活,并在以后被自动移除。安全

移除一项规则:网络

firewall-cmd [--zone=zone] --remove-rich-rule='rule'

这将为 zone 分区移除一项多语言规则 (rule) 。这个选项能够屡次指定。若是分区被省略,将使用默认分区。app

检查一项规则是否存在:tcp

firewall-cmd [--zone=zone] --query-rich-rule='rule'

这将复查是否已经为区域(zone) 增长一个多语言规则 (rule) 。若是可用,屏幕会显示 yes,退出状态为 0; 不然,屏幕显示 no,退出状态为 1。若是省略 zone,默认区域将被使用。编辑器

使用在分区配置文件里的多语言表述的相关信息,可查阅 firewalld.zone(5) 说明。ide

4.5.15.2. 理解多规则结构

多规则命令的格式或结构以下所示:工具

rule [family="<rule family>"]
    [ source address="<address>" [invert="True"] ]
    [ destination address="<address>" [invert="True"] ]
    [ <element> ]
    [ log [prefix="<prefix text>"] [level="<log level>"] [limit value="rate/duration"] ]
    [ audit ]
    [ accept|reject|drop ]

一个规则是关联某个特定分区的,一个分区能够有几个规则。若是几个规则互相影响或者冲突,则执行和数据包相匹配的第一个规则。若是提供了规则系列,它能够是 ipv4 或者 ipv6 。规则系列把规则限定在 IPv4 或 IPv6 。若是没有提供规则系列, 将为 IPv4 和 IPv6 增长规则。若是源地址或者目标地址在一个规则中被使用,那么必须提供规则系列。端口转发也存在这种状况。ui

4.5.15.3. 理解多规则命令

  • source

  • 经过制定源地址,一个尝试链接的源头能够被限制在源地址中。一个源地址或者地址范围是一个为 IPv4 或者 IPv6 作掩护的 IP 地址或者一个网络 IP 地址。网络系列( IPv4 或 IPv6 )将被自动覆盖。针对 IPv4 的假装能够是一个网络假装或者一个普通数字。针对 IPv4 的假装是一个简单数字。不支持使用主机名。能够经过增长 invert="true" 或 invert="yes" 来颠倒源地址命令的意思。全部提供的地址都匹配。

  • destination

  • 经过制定目的地址,目标能够被限制在目的地址中。目标地址使用跟源地址相同的语法。原地址和目标地址的使用是有选择的,不可能目标地址的全部要素都使用。这取决于目标地址的使用,例如在服务项中,这个要素只能够是如下要素类型之一: service , port , protocol , masquerade , icmp-block 和 forward-port 。

  • service

  • 服务名称是 firewalld 提供的其中一种服务。要得到被支持的服务的列表,输入如下命令: firewall-cmd --get-services 。若是一个服务提供了一个目标地址,它将和规则中的目标地址冲突,而且致使一个错误。使用内部目的地址的服务大可能是使用了多路传送的服务。命令为如下形式:

    service name=service_name
  • port

  • 端口既能够是一个独立端口数字,又或者端口范围,例如,5060-5062。协议能够指定为 tcp 或 udp。命令为如下形式:

    port port=number_or_range protocol=protocol
  • protocol

  • 协议值能够是一个协议 ID 数字,或者一个协议名。预知可用协议,请查阅 /etc/protocols。命令为如下形式:

    protocol value=protocol_name_or_ID

  • icmp-block

  • 用这个命令阻绝一个或多个 ICMP 类型。 ICMP 类型是 firewalld 支持的 ICMP 类型之一。要得到被支持的 ICMP 类型列表,输入如下命令:

    ~]$ firewall-cmd --get-icmptypes

    在此,指定一个动做是不被容许的。icmp-block 在内部使用 reject 动做。命令为如下形式:

    icmp-block name=icmptype_name
  • masquerade

  • 打开规则里的 IP 假装。用源地址而不是目的地址来把假装限制在这个区域内。在此,指定一个动做是不被容许的。

  • forward-port

  • 从一个带有指定为 tcp 或 udp 协议的本地端口转发数据包到另外一个本地端口,或另外一台机器,或另外一台机器上的另外一个端口。 port 和 to-port 能够是一个单独的端口数字,或一个端口范围。而目的地址是一个简单的 IP 地址。在此,指定一个动做是不被容许的。 forward-port 命令使用内部动做 accept 。这个命令为如下形式:

    forward-port port=number_or_range protocol=protocol /
                to-port=number_or_range to-addr=address
  • log

  • 注册含有内核记录的新的链接请求到规则中,好比系统记录。您能够定义一个前缀文本——能够把记录信息做为前缀加入。记录等级能够是 emerg 、 alert 、 crit 、 error 、warning 、 notice、 info 或者 debug 中的一个。能够选择记录的用法,能够按如下方式限制注册:

    log [prefix=prefix text] [level=log level] limit value=rate/duration

    等级用正的天然数 [1, ..] 表达,持续时间的单位为 s 、 m 、 h 、 d 。 s 表示秒, m 表示分钟, h 表示小时, d 表示天。最大限定值是 1/d ,意为天天最多有一条日志进入。

  • audit

  • 审核为发送到 auditd 服务的审核记录来注册提供了另外一种方法。审核类型能够是 ACCEPT 、 REJECT 或 DROP 中的一种,但不能在 audit 命令后指定,由于审核类型将会从规则动做中自动收集。审核不包含自身参数,但能够选择性地增长限制。审核的使用是可选择的。

  • accept|reject|drop

  • 能够是 accept 、reject 或 drop 中的一个行为。规则中仅仅包含一个要素或者来源。若是规则中包含一个要素,那么行为能够处理符合要素的新链接。若是规则中包含一个来源,那么指定的行为能够处理来自源地址的一切内容。

    accept | reject [type=reject type] | drop

    选择 accept 全部新的链接请求都会被容许。选择 reject ,链接将被拒绝,链接来源将接到一个拒绝信息。拒绝的类型能够被设定为使用另外一种值。选择 drop , 全部数据包会被丢弃,而且不会向来源地发送任何信息。

4.5.15.4. 使用多规则登陆命令

使用 Netfilter 登陆目标能够完成登陆,也可使用审核目标。用 zone_log 格式命名的新链能够加入到全部分区,其中 zone 为该分区名。在 deny 链以前进行该项处理,以便得到适当的排序。根据规则的行为,整个规则或者部分规则会按照规则被分别放置在独立链中,以下所示:

zone_logzone_denyzone_allow

全部登陆规则将放在 zone_log 链中,这会最早被解析。全部 reject 和 drop 规则都被放置在zone_deny 链,在登陆链以后被解析。全部 accept 规则被放在 zone_allow 链里,它将在 deny 链以后被解析。若是规则中既包含了 log ,又有 deny 或者 allow ,各部分将被放在相应的链中。

4.5.15.4.1. 多规则登陆命令使用示例 1

为认证报头协议 AH 使用新的IPv4 和 IPv6 链接:

rule protocol value="ah" accept
4.5.15.4.2. 多规则登陆命令使用示例 2

赞成新的 IPv4 和 IPv6 链接 FTP,并使用审核每分钟登陆一次:

rule service name="ftp" log limit value="1/m" audit accept
4.5.15.4.3. 多规则登陆命令使用示例 3

为 TFTP 协议赞成来自 192.168.0.0/24 地址的新的 IPv4 链接,而且使用系统日志每分钟登陆一次:

rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept
4.5.15.4.4. 多规则登陆命令使用示例 4

为 RADIUS 协议拒绝全部来自 1:2:3:4:6:: 的新 IPv6 链接,并每分钟在级别3登陆。接受来自其余来源的新的 IPv6 链接:

rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject
rule family="ipv6" service name="radius" accept
4.5.15.4.5. 多规则登陆命令使用示例 5

转发带有 TCP 协议的端口 4011 上的来自 1:2:3:4:6:: 的 IPv6 包,到端口 4012 上的 1::2:3:4:7

rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"
4.5.15.4.6. 多规则登陆命令使用示例 6

把一个源地址加入白名单,以便容许来自这个源地址的全部链接

rule family="ipv4" source address="192.168.2.2" accept

更多示例请查阅 firewalld.richlanguage(5) 说明页。

4.5.16. 锁定防火墙

若是以 root 身份运行本地应用或者服务(好比 libvirt ),就能更改防火墙设置。由于这个功能,管理员能够锁定防火墙设置,这样不管是不向锁定的白名单添加应用,仍是仅容许添加应用,均可以要求防火墙更改。锁定设置默认不启动,若是启动,用户能够确保本地应用或者服务不须要对防火墙作任何设置更改。

4.5.16.1. 设置防火墙锁定

以 root 身份运行一个编辑器,把如下行增长到 /etc/firewalld/firewalld.conf 文件:

Lockdown=yes

以 root 身份使用如下命令重启防火墙:

~]# firewall-cmd --reload

欲在默认区内使用 imaps 服务,则以管理员帐户,也就是 wheel 组中的用户(一般是系统的第一位用户),使用如下命令:

~]$ firewall-cmd --add-service=imapsError: ACCESS_DENIED: lockdown is enabled

欲使用 firewall-cmd ,以 root 身份输入如下命令:

~]# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/firewall-cmd*'

若是须要重启后会继续使用此设定,增长 --permanent 选项。

以 root 身份重启防火墙:

~]# firewall-cmd --reload

以管理员帐户输入如下命令,尝试在默认区里再次启动 imaps 服务。您将被提示输入用户密码:

~]$ firewall-cmd --add-service=imaps

这样,命令成功运行。

4.5.16.2. 用命令行客户端配置锁定

查询锁定是否执行,以 root 身份输入如下命令:

~]# firewall-cmd --query-lockdown

若是是锁定状态,打印退出状态为 0 的 yes。不然,打印退出状态为 1 的 no

启动锁定,以 root 身份输入如下命令:

~]# firewall-cmd --lockdown-on

关闭锁定,以 root 身份输入如下命令:

~]# firewall-cmd --lockdown-off

4.5.16.3. 用命令行配置锁定白名单选项

锁定白名单能够包含命令,安全环境,用户和用户ID。若是白名单上输入的一个命令以一个星号 * 结束,那么全部以这个命令开始的命令行都匹配。若是没有 * ,那么包括参数的绝对命令必须匹配。

环境,是指一个正在运行的应用或者服务的安全 (SELinux) 环境。用如下命令获取一个正在运行的应用的环境:

~]$ ps -e --context

这个命令检查全部运行中的应用。经过 grep 工具将输出转移,获得须要的应用。好比:

~]$ ps -e --context | grep example_program

列出白名单上的全部命令行,以 root 身份输入如下命令:

~]# firewall-cmd --list-lockdown-whitelist-commands

增长一个command 命令到白名单,以 root 身份输入如下命令:

~]# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'

从白名单移除一个 command 命令,以 root 身份输入如下命令:

~]# firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'

查询 command 命令是否在白名单上,以 root 身份输入如下命令:

~]# firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'

若是存在,显示退出状态为 0 的 yes ,不然,显示退出状态为 1 的 no 。

列出白名单上的全部安全环境,以 root 身份输入如下命令:

~]# firewall-cmd --list-lockdown-whitelist-contexts

增长一个环境 context 到白名单,以 root 身份输入如下命令:

~]# firewall-cmd --add-lockdown-whitelist-context=context

要使这个命令持续,增长 --permanent 选项。

从白名单移除一个环境 context ,以 root 身份输入如下命令:

~]# firewall-cmd --remove-lockdown-whitelist-context=context

要使这个命令持续,增长 --permanent 选项。

查询白名单上是否有环境 context ,以 root 身份输入如下命令:

~]# firewall-cmd --query-lockdown-whitelist-context=context

若是存在,显示退出状态为 0 的 yes ,不然,显示退出状态为 1 的 no 。

列出白名单上全部用户 ID ,以 root 身份输入如下命令:

~]# firewall-cmd --list-lockdown-whitelist-uids

增长一个用户 ID uid 到白名单,以 root 身份输入如下命令:

~]# firewall-cmd --add-lockdown-whitelist-uid=uid

要使这个命令持续,增长 --permanent 选项。

从白名单上移除一个用户 ID uid ,以root 身份输入如下命令:

~]# firewall-cmd --remove-lockdown-whitelist-uid=uid

要使这个命令持续,增长 --permanent 选项。

查询用户 ID uid 是否在白名单上,输入如下命令:

~]$ firewall-cmd --query-lockdown-whitelist-uid=uid

若是存在,显示退出状态为 0 的 yes ,不然,显示退出状态为 1 的 no 。

列出白名单上全部用户名,以 root 身份输入如下命令:

~]# firewall-cmd --list-lockdown-whitelist-users

增长一个用户名 user 到白名单,以 root 身份输入如下命令:

~]# firewall-cmd --add-lockdown-whitelist-user=user

要使这个命令持续,增长 --permanent 选项。

从白名单移除一个用户名 user ,以 root 身份输入如下命令:

~]# firewall-cmd --remove-lockdown-whitelist-user=user

要使这个命令持续,增长 --permanent 选项。

查询用户名 user 是否在白名单上,输入如下命令:

~]$ firewall-cmd --query-lockdown-whitelist-user=user

若是存在,显示退出状态为 0 的 yes ,不然,显示退出状态为 1 的 no 。

4.5.16.4. 用配置文件来配置锁定白名单选项

默认的白名单配置文件包括 NetworkManager 环境和 libvirt 的默认环境。列表里也有用户 ID 0。

<?xml version="1.0" encoding="utf-8"?>
<whitelist>
  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
  <selinux context="system_u:system_r:virtd_t:s0-s0:c0.c1023"/>
  <user id="0"/>
</whitelist>

这里跟随了一个示例白名单配置文件,它启动用于 firewall-cmd 功能的全部命令,为名为 user、用户 ID 为 815 的用户:

<?xml version="1.0" encoding="utf-8"?>
<whitelist>
  <command name="/usr/bin/python -Es /bin/firewall-cmd*"/>
  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
  <user id="815"/>
  <user name="user"/>
</whitelist>

在这个范例里,咱们出示了 user id 和 user name 两样,但只须要一个便可。Python 是一个解释器,因此写在命令行的最前面。您也可使用一个很是特别的命令,好比:

/usr/bin/python /bin/firewall-cmd --lockdown-on

在这例子里,只有 --lockdown-on 命令会被容许。

注意

在 Red Hat Enterprise Linux 7 中,全部功能如今都放在 /usr/bin/ 中,并且 /bin/ 目录被系统连接到 /usr/bin/ 目录。换言之,尽管以 root 身份运行的 firewall-cmd 路径可能解析到 /bin/firewall-cmd,可是如今会使用 /usr/bin/firewall-cmd 。全部新的脚本可使用新的地址,但要意识到,若是以 root 身份运行的脚本被写入使用 /bin/firewall-cmd 路径,那么,命令路径除了是传统意义上仅用于非 root 用户的 /usr/bin/firewall-cmd 路径之外,还必须被加入白名单。

在一个命令的名字属性结尾的 * 意味着全部以此行开头的命令都匹配。若是没有 * ,那么包括参数的绝对命令必须匹配。

4.5.17. 附加资源

下列信息的来源提供了关于 firewalld 的附加资源。

4.5.17.1. 已安装的文档

  • firewalld(1) 说明页——描述 firewalld 的命令选项。

  • firewalld.conf(5) 说明页——包括配置 firewalld 的信息。

  • firewall-cmd(1) 说明页——描述 firewalld 命令行客户端的命令选项。

  • firewalld.icmptype(5) 操做手册 — 描述了 ICMP 过滤的 XML 配置文件。

  • firewalld.service(5) 操做手册 — 描述了 firewalld service 的 XML 配置文件。

  • firewalld.zone(5) 操做手册 — 描述了配置 firewalld 区域的 XML 配置文件。

  • firewalld.direct(5) 说明页——描述 firewalld 直接接口配置文件。

  • firewalld.lockdown-whitelist(5) 说明页——描述 firewalld 白名单锁定配置文件。

  • firewall.richlanguage(5) 说明页——描述 firewalld 多语言规则语法。

  • firewalld.zones(5) 说明页——概述分区状况以及如何配置它们。

相关文章
相关标签/搜索