經過 「rich language」 語法,能夠用比直接接口方式更易理解的方法創建複雜防火牆規則。此外,還能永久保留設置。這種語言使用關鍵詞值,是 iptables 工具的抽象表示。這種語言能夠用來配置分區,也仍然支持現行的配置方式。python
在這個部分,全部命令都必須以 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
多規則命令的格式或結構以下所示:工具
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
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
, 全部數據包會被丟棄,而且不會向來源地發送任何信息。
使用 Netfilter 登陸目標能夠完成登陸,也可使用審覈目標。用 「zone_log」 格式命名的新鏈能夠加入到全部分區,其中 zone 爲該分區名。在 deny
鏈以前進行該項處理,以便得到適當的排序。根據規則的行爲,整個規則或者部分規則會按照規則被分別放置在獨立鏈中,以下所示:
zone_logzone_denyzone_allow
全部登陸規則將放在 「zone_log」 鏈中,這會最早被解析。全部 reject
和 drop
規則都被放置在「zone_deny」 鏈,在登陸鏈以後被解析。全部 accept
規則被放在 「zone_allow」 鏈裏,它將在 deny
鏈以後被解析。若是規則中既包含了 log
,又有 deny
或者 allow
,各部分將被放在相應的鏈中。
爲認證報頭協議 AH
使用新的IPv4
和 IPv6
鏈接:
rule protocol value="ah" accept
贊成新的 IPv4
和 IPv6
鏈接 FTP
,並使用審覈每分鐘登陸一次:
rule service name="ftp" log limit value="1/m" audit accept
爲 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
爲 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
轉發帶有 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"
把一個源地址加入白名單,以便容許來自這個源地址的全部鏈接
rule family="ipv4" source address="192.168.2.2" accept
更多示例請查閱 firewalld.richlanguage(5)
說明頁。
若是以 root
身份運行本地應用或者服務(好比 libvirt ),就能更改防火牆設置。由於這個功能,管理員能夠鎖定防火牆設置,這樣不管是不向鎖定的白名單添加應用,仍是僅容許添加應用,均可以要求防火牆更改。鎖定設置默認不啓動,若是啓動,用戶能夠確保本地應用或者服務不須要對防火牆作任何設置更改。
以 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
這樣,命令成功運行。
查詢鎖定是否執行,以 root
身份輸入如下命令:
~]# firewall-cmd --query-lockdown
若是是鎖定狀態,打印退出狀態爲 0
的 yes
。不然,打印退出狀態爲 1
的 no
。
啓動鎖定,以 root
身份輸入如下命令:
~]# firewall-cmd --lockdown-on
關閉鎖定,以 root
身份輸入如下命令:
~]# firewall-cmd --lockdown-off
鎖定白名單能夠包含命令,安全環境,用戶和用戶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
。
默認的白名單配置文件包括 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
路徑之外,還必須被加入白名單。
在一個命令的名字屬性結尾的 「*」 意味着全部以此行開頭的命令都匹配。若是沒有 「*」 ,那麼包括參數的絕對命令必須匹配。
下列信息的來源提供了關於 firewalld
的附加資源。
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)
說明頁——概述分區狀況以及如何配置它們。