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) 說明頁——概述分區狀況以及如何配置它們。

相關文章
相關標籤/搜索