使用 FirewallD 構建動態防火牆

發表於2014-12-11

FirewallD 提供了支援網路/防火牆區域(zone)定義網路連結以及介面安全等級的動態防火牆管理工具。它支援 IPv4, IPv6 防火牆設定以及乙太網橋接,並且擁有執行時配置和永久配置選項。它也支援允許服務或者應用程式直接新增防火牆規則的介面。 以前的 system-config-firewall/lokkit 防火牆模型是靜態的,每次修改都要求防火牆完全重啟。這個過程包括核心 netfilter 防火牆模組的解除安裝和新配置所需模組的裝載等。而模組的解除安裝將會破壞狀態防火牆和確立的連線。

相反,firewall daemon 動態管理防火牆,不需要重啟整個防火牆便可應用更改。因而也就沒有必要過載所有核心防火牆模組了。不過,要使用 firewall daemon 就要求防火牆的所有變更都要透過該守護程式來實現,以確保守護程式中的狀態和核心裡的防火牆是一致的。另外,firewall daemon 無法解析由 ip*tables 和 ebtables 命令列工具新增的防火牆規則。

守護程式透過 D-BUS 提供當前啟用的防火牆設定資訊,也透過 D-BUS 接受使用 PolicyKit 認證方式做的更改。

“守護程式”

應用程式、守護程式和使用者可以透過 D-BUS 請求啟用一個防火牆特性。特性可以是預定義的防火牆功能,如:服務、埠和協議的組合、埠/資料包轉發、偽裝、ICMP 攔截或自定義規則等。該功能可以啟用確定的一段時間也可以再次停用。

透過所謂的直接介面,其他的服務(例如 libvirt )能夠透過 iptables 變元(arguments)和引數(parameters)增加自己的規則。

amanda 、ftp 、samba 和 tftp 服務的 netfilter 防火牆助手也被“守護程式”解決了,只要它們還作為預定義服務的一部分。附加助手的裝載不作為當前介面的一部分。由於一些助手只有在由模組控制的所有連線都關閉後才可裝載。因而,跟蹤連線資訊很重要,需要列入考慮範圍。

靜態防火牆(system-config-firewall/lokkit)

使用 system-config-firewall 和 lokkit 的靜態防火牆模型實際上仍然可用並將繼續提供,但卻不能與“守護程式”同時使用。使用者或者管理員可以決定使用哪一種方案。

在軟體安裝,初次啟動或者是首次聯網時,將會出現一個選擇器。透過它你可以選擇要使用的防火牆方案。其他的解決方案將保持完整,可以透過更換模式啟用。

firewall daemon 獨立於 system-config-firewall,但二者不能同時使用。

使用 iptables 和 ip6tables 的靜態防火牆規則

如果你想使用自己的 iptables 和 ip6tables 靜態防火牆規則, 那麼請安裝 iptables-services 並且禁用 firewalld ,啟用 iptables 和ip6tables:

yum install iptables-services
systemctl mask firewalld.service
systemctl enable iptables.service
systemctl enable ip6tables.service

靜態防火牆規則配置檔案是 /etc/sysconfig/iptables 以及 /etc/sysconfig/ip6tables .

注: iptables 與 iptables-services 軟體包不提供與服務配套使用的防火牆規則. 這些服務是用來保障相容性以及供想使用自己防火牆規則的人使用的. 你可以安裝並使用 system-config-firewall 來建立上述服務需要的規則. 為了能使用 system-config-firewall, 你必須停止 firewalld.

為服務建立規則並停用 firewalld 後,就可以啟用 iptables 與 ip6tables 服務了:

systemctl stop firewalld.service
systemctl start iptables.service
systemctl start ip6tables.service

什麼是區域?

網路區域定義了網路連線的可信等級。這是一個一對多的關係,這意味著一次連線可以僅僅是一個區域的一部分,而一個區域可以用於很多連線。

預定義的服務

服務是埠和/或協議入口的組合。備選內容包括 netfilter 助手模組以及 IPv4、IPv6地址。

埠和協議

定義了 tcp 或 udp 埠,埠可以是一個埠或者埠範圍。

ICMP 阻塞

可以選擇 Internet 控制報文協議的報文。這些報文可以是資訊請求亦可是對資訊請求或錯誤條件建立的響應。

偽裝

私有網路地址可以被對映到公開的IP地址。這是一次正規的地址轉換。

埠轉發

埠可以對映到另一個埠以及/或者其他主機。

哪個區域可用?

由firewalld 提供的區域按照從不信任到信任的順序排序:

丟棄(drop)

任何流入網路的包都被丟棄,不作出任何響應。只允許流出的網路連線。

阻塞(block)

任何進入的網路連線都被拒絕,並返回 IPv4 的 icmp-host-prohibited 報文或者 IPv6 的 icmp6-adm-prohibited 報文。只允許由該系統初始化的網路連線。

公開(public)

用以可以公開的部分。該網路中其他的計算機對你來說不可信並且可能傷害你的計算機。只允許選中的連線接入。

外部(external)

用在路由器等啟用偽裝的外部網路。該網路中其他的計算機對你來說不可信並且可能傷害你的計算機。只允許選中的連線接入。

隔離區(dmz)

用以允許隔離區(dmz)中的電腦有限地被外界網路訪問。只接受被選中的連線。

工作(work)

用在工作網路。該網路中的大多數計算機可以信任,不會影響你的計算機。只接受被選中的連線。

家庭(home)

用在家庭網路。該網路中的大多數計算機可以信任,不會影響你的計算機。只接受被選中的連線。

內部(internal)

用在內部網路。該網路中的大多數計算機可以信任,不會影響你的計算機。只接受被選中的連線。

受信任的(trusted)

允許所有網路連線。

我應該選用哪個區域?

例如,公共的 WIFI 連線應該主要為不受信任的,家庭的有線網路應該是相當可信任的。根據與你使用的網路最符合的區域進行選擇。

如何配置或者增加區域?

你可以使用任何一種 firewalld 配置工具來配置或者增加區域,以及修改配置。工具有例如 firewall-config 這樣的圖形介面工具, firewall-cmd 這樣的命令列工具,以及D-BUS介面。或者你也可以在配置檔案目錄中建立或者複製區域檔案。 @PREFIX@/lib/firewalld/zones 被用於預設和備用配置,/etc/firewalld/zones 被用於使用者建立和自定義配置檔案。

如何為網路連線設定或者修改區域

區域設定以 ZONE= 選項 儲存在網路連線的ifcfg檔案中。如果這個選項缺失或者為空,firewalld 將使用配置的預設區域。

如果這個連線受到 NetworkManager 控制,你也可以使用 nm-connection-editor 來修改區域。

由 NetworkManager 控制的網路連線

防火牆不能夠透過 NetworkManager 顯示的名稱來配置網路連線,只能配置網路介面。因此在網路連線之前 NetworkManager 將配置檔案所述連線對應的網路介面告訴 firewalld 。如果在配置檔案中沒有配置區域,介面將配置到 firewalld 的預設區域。如果網路連線使用了不止一個介面,所有的介面都會應用到 fiwewalld。介面名稱的改變也將由 NetworkManager 控制並應用到firewalld。

為了簡化,自此,網路連線將被用作與區域的關係。

如果一個介面斷開了, NetworkManager 也將告訴 firewalld 從區域中刪除該介面。

當 firewalld 由 systemd 或者 init 指令碼啟動或者重啟後,firewalld 將通知 NetworkManager 把網路連線增加到區域。

由指令碼控制的網路

對於由網路指令碼控制的連線有一條限制:沒有守護程式通知 firewalld 將連線增加到區域。這項工作僅在 ifcfg-post 指令碼進行。因此,此後對網路連線的重新命名將不能被應用到firewalld。同樣,在連線活動時重啟 firewalld 將導致與其失去關聯。現在有意修復此情況。最簡單的是將全部未配置連線加入預設區域。

區域定義了本區域中防火牆的特性。

使用 firewalld

你可以透過圖形介面工具 firewall-config 或者命令列客戶端 firewall-cmd 啟用或者關閉防火牆特性。

使用 firewall-cmd

命令列工具 firewall-cmd 支援全部防火牆特性。對於狀態和查詢模式,命令只返回狀態,沒有其他輸出。

一般應用

  • 獲取 firewalld 狀態
 firewall-cmd --state

此舉返回 firewalld 的狀態,沒有任何輸出。可以使用以下方式獲得狀態輸出:

 firewall-cmd --state && echo "Running" || echo "Not running"

在 Fedora 19 中, 狀態輸出比此前直觀:

 # rpm -qf $( which firewall-cmd )
 firewalld-0.3.3-2.fc19.noarch
 # firewall-cmd --state
 not running
  • 在不改變狀態的條件下重新載入防火牆:
 firewall-cmd --reload

如果你使用 --complete-reload ,狀態資訊將會丟失。這個選項應當僅用於處理防火牆問題時,例如,狀態資訊和防火牆規則都正常,但是不能建立任何連線的情況。

  • 獲取支援的區域列表
 firewall-cmd --get-zones

這條命令輸出用空格分隔的列表。

  • 獲取所有支援的服務
 firewall-cmd --get-services

這條命令輸出用空格分隔的列表。

  • 獲取所有支援的ICMP型別
 firewall-cmd --get-icmptypes

這條命令輸出用空格分隔的列表。

  • 列出全部啟用的區域的特性
 firewall-cmd --list-all-zones

輸出格式是:

 <zone>
   interfaces: <interface1> ..
   services: <service1> ..
   ports: <port1> ..
   forward-ports: <forward port1> ..
   icmp-blocks: <icmp type1> ..
   
   ..
  • 輸出區域 <zone> 全部啟用的特性。如果生略區域,將顯示預設區域的資訊。
 firewall-cmd [--zone=<zone>] --list-all
  • 獲取預設區域的網路設定
 firewall-cmd --get-default-zone
  • 設定預設區域
 firewall-cmd --set-default-zone=<zone>

流入預設區域中配置的介面的新訪問請求將被置入新的預設區域。當前活動的連線將不受影響。

  • 獲取活動的區域
 firewall-cmd --get-active-zones

這條命令將用以下格式輸出每個區域所含介面:

 <zone1>: <interface1> <interface2> ..
 <zone2>: <interface3> ..
  • 根據介面獲取區域
 firewall-cmd --get-zone-of-interface=<interface>

這條命令將輸出介面所屬的區域名稱。

  • 將介面增加到區域
 firewall-cmd [--zone=<zone>] --add-interface=<interface>

如果介面不屬於區域,介面將被增加到區域。如果區域被省略了,將使用預設區域。介面在重新載入後將重新應用。

  • 修改介面所屬區域
 firewall-cmd [--zone=<zone>] --change-interface=<interface>

這個選項與 --add-interface 選項相似,但是當介面已經存在於另一個區域的時候,該介面將被新增到新的區域。

  • 從區域中刪除一個介面
 firewall-cmd [--zone=<zone>] --remove-interface=<interface>
  • 查詢區域中是否包含某介面
 firewall-cmd [--zone=<zone>] --query-interface=<interface>

返回介面是否存在於該區域。沒有輸出。

  • 列舉區域中啟用的服務
 firewall-cmd [ --zone=<zone> ] --list-services
  • 啟用應急模式阻斷所有網路連線,以防出現緊急狀況
 firewall-cmd --panic-on
  • 禁用應急模式
 firewall-cmd --panic-off

應急模式在 0.3.0 版本中發生了變化
在 0.3.0 之前的 FirewallD版本中, panic 選項是 --enable-panic 與 --disable-panic.

  • 查詢應急模式
 firewall-cmd --query-panic

此命令返回應急模式的狀態,沒有輸出。可以使用以下方式獲得狀態輸出:

 firewall-cmd --query-panic && echo "On" || echo "Off"

處理執行時區域

執行時模式下對區域進行的修改不是永久有效的。重新載入或者重啟後修改將失效。

  • 啟用區域中的一種服務
 firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]

此舉啟用區域中的一種服務。如果未指定區域,將使用預設區域。如果設定了超時時間,服務將只啟用特定秒數。如果服務已經活躍,將不會有任何警告資訊。

  • 例: 使區域中的 ipp-client 服務生效60秒:
 firewall-cmd --zone=home --add-service=ipp-client --timeout=60
  • 例: 啟用預設區域中的http服務:
 firewall-cmd --add-service=http
  • 禁用區域中的某種服務
 firewall-cmd [--zone=<zone>] --remove-service=<service>

此舉禁用區域中的某種服務。如果未指定區域,將使用預設區域。

  • 例: 禁止 home 區域中的 http 服務:
 firewall-cmd --zone=home --remove-service=http

區域中的服務將被禁用。如果服務沒有啟用,將不會有任何警告資訊。

  • 查詢區域中是否啟用了特定服務
 firewall-cmd [--zone=<zone>] --query-service=<service>

如果服務啟用,將返回1,否則返回0。沒有輸出資訊。

  • 啟用區域埠和協議組合
 firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]

此舉將啟用埠和協議的組合。埠可以是一個單獨的埠 <port> 或者是一個埠範圍 <port>-<port> 。協議可以是 tcp 或 udp

  • 禁用埠和協議組合
 firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
  • 查詢區域中是否啟用了埠和協議組合
 firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

如果啟用,此命令將有返回值。沒有輸出資訊。

  • 啟用區域中的 IP 偽裝功能
 firewall-cmd [--zone=<zone>] --add-masquerade

此舉啟用區域的偽裝功能。私有網路的地址將被隱藏並對映到一個公有IP。這是地址轉換的一種形式,常用於路由。由於核心的限制,偽裝功能僅可用於IPv4。

  • 禁用區域中的 IP 偽裝
 firewall-cmd [--zone=<zone>] --remove-masquerade
  • 查詢區域的偽裝狀態
 firewall-cmd [--zone=<zone>] --query-masquerade

如果啟用,此命令將有返回值。沒有輸出資訊。

  • 啟用區域的 ICMP 阻塞功能
 firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype>

此舉將啟用選中的 Internet 控制報文協議 (ICMP) 報文進行阻塞。 ICMP 報文可以是請求資訊或者建立的應答報文,以及錯誤應答。

  • 禁止區域的 ICMP 阻塞功能
 firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype>
  • 查詢區域的 ICMP 阻塞功能
 firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype>

如果啟用,此命令將有返回值。沒有輸出資訊。

  • 例: 阻塞區域的響應應答報文:
 firewall-cmd --zone=public --add-icmp-block=echo-reply
  • 在區域中啟用埠轉發或對映
 firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> {&nbsp;:toport=<port>[-<port>] |&nbsp;:toaddr=<address> |&nbsp;:toport=<port>[-<port>]:toaddr=<address> }

埠可以對映到另一臺主機的同一埠,也可以是同一主機或另一主機的不同埠。埠號可以是一個單獨的埠 <port> 或者是埠範圍 <port>-<port> 。協議可以為 tcp 或udp 。目標埠可以是埠號 <port> 或者是埠範圍 <port>-<port> 。目標地址可以是 IPv4 地址。受核心限制,埠轉發功能僅可用於IPv4。

  • 禁止區域的埠轉發或者埠對映
 firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> {&nbsp;:toport=<port>[-<port>] |&nbsp;:toaddr=<address> |&nbsp;:toport=<port>[-<port>]:toaddr=<address> }
  • 查詢區域的埠轉發或者埠對映
 firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> {&nbsp;:toport=<port>[-<port>] |&nbsp;:toaddr=<address> |&nbsp;:toport=<port>[-<port>]:toaddr=<address> }

如果啟用,此命令將有返回值。沒有輸出資訊。

  • 例: 將區域 home 的 ssh 轉發到 127.0.0.2
 firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

處理永久區域

永久選項不直接影響執行時的狀態。這些選項僅在過載或者重啟服務時可用。為了使用執行時和永久設定,需要分別設定兩者。 選項 --permanent 需要是永久設定的第一個引數。

  • 獲取永久選項所支援的服務
 firewall-cmd --permanent --get-services
  • 獲取永久選項所支援的ICMP型別列表
 firewall-cmd --permanent --get-icmptypes
  • 獲取支援的永久區域
 firewall-cmd --permanent --get-zones
  • 啟用區域中的服務
 firewall-cmd --permanent [--zone=<zone>] --add-service=<service>

此舉將永久啟用區域中的服務。如果未指定區域,將使用預設區域。

  • 禁用區域中的一種服務
 firewall-cmd --permanent [--zone=<zone>] --remove-service=<service>
  • 查詢區域中的服務是否啟用
 firewall-cmd --permanent [--zone=<zone>] --query-service=<service>

如果服務啟用,此命令將有返回值。此命令沒有輸出資訊。

  • 例: 永久啟用 home 區域中的 ipp-client 服務
 firewall-cmd --permanent --zone=home --add-service=ipp-client
  • 永久啟用區域中的一個埠-協議組合
 firewall-cmd --permanent [--zone=<zone>] --add-port=<port>[-<port>]/<protocol>
  • 永久禁用區域中的一個埠-協議組合
 firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
  • 查詢區域中的埠-協議組合是否永久啟用
 firewall-cmd --permanent [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

如果服務啟用,此命令將有返回值。此命令沒有輸出資訊。

  • 例: 永久啟用 home 區域中的 https (tcp 443) 埠
 firewall-cmd --permanent --zone=home --add-port=443/tcp
  • 永久啟用區域中的偽裝
 firewall-cmd --permanent [--zone=<zone>] --add-masquerade

此舉啟用區域的偽裝功能。私有網路的地址將被隱藏並對映到一個公有IP。這是地址轉換的一種形式,常用於路由。由於核心的限制,偽裝功能僅可用於IPv4。

  • 永久禁用區域中的偽裝
 firewall-cmd --permanent [--zone=<zone>] --remove-masquerade
  • 查詢區域中的偽裝的永久狀態
 firewall-cmd --permanent [--zone=<zone>] --query-masquerade

如果服務啟用,此命令將有返回值。此命令沒有輸出資訊。

  • 永久啟用區域中的ICMP阻塞
 firewall-cmd --permanent [--zone=<zone>] --add-icmp-block=<icmptype>

此舉將啟用選中的 Internet 控制報文協議 (ICMP) 報文進行阻塞。 ICMP 報文可以是請求資訊或者建立的應答報文或錯誤應答報文。

  • 永久禁用區域中的ICMP阻塞
 firewall-cmd --permanent [--zone=<zone>] --remove-icmp-block=<icmptype>
  • 查詢區域中的ICMP永久狀態
 firewall-cmd --permanent [--zone=<zone>] --query-icmp-block=<icmptype>

如果服務啟用,此命令將有返回值。此命令沒有輸出資訊。

  • 例: 阻塞公共區域中的響應應答報文:
 firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply
  • 在區域中永久啟用埠轉發或對映
 firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> {&nbsp;:toport=<port>[-<port>] |&nbsp;:toaddr=<address> |&nbsp;:toport=<port>[-<port>]:toaddr=<address> }

埠可以對映到另一臺主機的同一埠,也可以是同一主機或另一主機的不同埠。埠號可以是一個單獨的埠 <port> 或者是埠範圍 <port>-<port> 。協議可以為 tcp 或udp 。目標埠可以是埠號 <port> 或者是埠範圍 <port>-<port> 。目標地址可以是 IPv4 地址。受核心限制,埠轉發功能僅可用於IPv4。

  • 永久禁止區域的埠轉發或者埠對映
 firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> {&nbsp;:toport=<port>[-<port>] |&nbsp;:toaddr=<address> |&nbsp;:toport=<port>[-<port>]:toaddr=<address> }
  • 查詢區域的埠轉發或者埠對映狀態
 firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> {&nbsp;:toport=<port>[-<port>] |&nbsp;:toaddr=<address> |&nbsp;:toport=<port>[-<port>]:toaddr=<address> }

如果服務啟用,此命令將有返回值。此命令沒有輸出資訊。

  • 例: 將 home 區域的 ssh 服務轉發到 127.0.0.2
 firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

直接選項

直接選項主要用於使服務和應用程式能夠增加規則。 規則不會被儲存,在重新載入或者重啟之後必須再次提交。傳遞的引數 <args> 與 iptables, ip6tables 以及 ebtables 一致。

選項 --direct 需要是直接選項的第一個引數。

  • 將命令傳遞給防火牆。引數 <args> 可以是 iptables, ip6tables 以及 ebtables 命令列引數。
 firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>
  • 為表 <table> 增加一個新鏈 <chain> 。
 firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>
  • 從表 <table> 中刪除鏈 <chain> 。
 firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>
  • 查詢 <chain> 鏈是否存在與表 <table>. 如果是,返回0,否則返回1.
 firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>

如果啟用,此命令將有返回值。此命令沒有輸出資訊。

  • 獲取用空格分隔的表 <table> 中鏈的列表。
 firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>
  • 為表 <table> 增加一條引數為 <args> 的鏈 <chain> ,優先順序設定為 <priority>。
 firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>
  • 從表 <table> 中刪除帶引數 <args> 的鏈 <chain>。
 firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
  • 查詢 帶引數 <args> 的鏈 <chain> 是否存在表 <table> 中. 如果是,返回0,否則返回1.
 firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>

如果啟用,此命令將有返回值。此命令沒有輸出資訊。

  • 獲取表 <table> 中所有增加到鏈 <chain> 的規則,並用換行分隔。
 firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>

當前的 firewalld 特性

D-BUS 介面

D-BUS 介面提供防火牆狀態的資訊,使防火牆的啟用、停用或查詢設定成為可能。

區域

網路或者防火牆區域定義了連線的可信程度。firewalld 提供了幾種預定義的區域。區域配置選項和通用配置資訊可以在firewall.zone(5)的手冊裡查到。

服務

服務可以是一系列本讀埠、目的以及附加資訊,也可以是服務啟動時自動增加的防火牆助手模組。預定義服務的使用使啟用和禁用對服務的訪問變得更加簡單。服務配置選項和通用檔案資訊在 firewalld.service(5) 手冊裡有描述。

ICMP 型別

Internet 控制報文協議 (ICMP) 被用以交換報文和網際網路協議 (IP) 的錯誤報文。在 firewalld 中可以使用 ICMP 型別來限制報文交換。 ICMP 型別配置選項和通用檔案資訊可以參閱 firewalld.icmptype(5) 手冊。

直接介面

直接介面主要用於服務或者應用程式增加特定的防火牆規則。這些規則並非永久有效,並且在收到 firewalld 透過 D-Bus 傳遞的啟動、重啟、過載訊號後需要重新應用。

執行時配置

執行時配置並非永久有效,在重新載入時可以被恢復,而系統或者服務重啟、停止時,這些選項將會丟失。

永久配置

永久配置儲存在配置檔案種,每次機器重啟或者服務重啟、重新載入時將自動恢復。

托盤小程式

托盤小程式 firewall-applet 為使用者顯示防火牆狀態和存在的問題。它也可以用來配置使用者允許修改的設定。

圖形化配置工具

firewall daemon 主要的配置工具是 firewall-config 。它支援防火牆的所有特性(除了由服務/應用程式增加規則使用的直接介面)。 管理員也可以用它來改變系統或使用者策略。

命令列客戶端

firewall-cmd 是命令列下提供大部分圖形工具配置特性的工具。

對於 ebtables 的支援

要滿足 libvirt daemon 的全部需求,在核心 netfilter 級上防止 ip*tables 和 ebtables 間訪問問題,ebtables 支援是需要的。由於這些命令是訪問相同結構的,因而不能同時使用。

/usr/lib/firewalld 中的預設/備用配置

該目錄包含了由 firewalld 提供的預設以及備用的 ICMP 型別、服務、區域配置。由 firewalld 軟體包提供的這些檔案不能被修改,即使修改也會隨著 firewalld 軟體包的更新被重置。 其他的 ICMP 型別、服務、區域配置可以透過軟體包或者建立檔案的方式提供。

/etc/firewalld 中的系統配置設定

儲存在此的系統或者使用者配置檔案可以是系統管理員透過配置介面定製的,也可以是手動定製的。這些檔案將過載預設配置檔案。

為了手動修改預定義的 icmp 型別,區域或者服務,從預設配置目錄將配置複製到相應的系統配置目錄,然後根據需求進行修改。

如果你載入了有預設和備用配置的區域,在 /etc/firewalld 下的對應檔案將被重新命名為 <file>.old 然後啟用備用配置。

正在開發的特性

富語言

富語言特性提供了一種不需要了解iptables語法的透過高階語言配置複雜 IPv4 和 IPv6 防火牆規則的機制。

Fedora 19 提供了帶有 D-Bus 和命令列支援的富語言特性第2個里程碑版本。第3個里程碑版本也將提供對於圖形介面 firewall-config 的支援。

對於此特性的更多資訊,請參閱: firewalld Rich Language

鎖定

鎖定特性為 firewalld 增加了鎖定本地應用或者服務配置的簡單配置方式。它是一種輕量級的應用程式策略。

Fedora 19 提供了鎖定特性的第二個里程碑版本,帶有 D-Bus 和命令列支援。第3個里程碑版本也將提供圖形介面 firewall-config 下的支援。

更多資訊請參閱: firewalld Lockdown

永久直接規則

這項特性處於早期狀態。它將能夠提供儲存直接規則和直接鏈的功能。透過規則不屬於該特性。更多關於直接規則的資訊請參閱Direct options

從 ip*tables 和 ebtables 服務遷移

這項特性處於早期狀態。它將盡可能提供由iptables,ip6tables 和 ebtables 服務配置轉換為永久直接規則的指令碼。此特性在由firewalld提供的直接鏈整合方面可能存在侷限性。

此特性將需要大量複雜防火牆配置的遷移測試。

計劃和提議功能

防火牆抽象模型

在 ip*tables 和 ebtables 防火牆規則之上新增抽象層使新增規則更簡單和直觀。要抽象層功能強大,但同時又不能複雜,並不是一項簡單的任務。為此,不得不開發一種防火牆語言。使防火牆規則擁有固定的位置,可以查詢埠的訪問狀態、訪問策略等普通訊息和一些其他可能的防火牆特性。

對於 conntrack 的支援

要終止禁用特性已確立的連線需要 conntrack 。不過,一些情況下終止連線可能是不好的,如:為建立有限時間內的連續性外部連線而啟用的防火牆服務。

使用者互動模型

這是防火牆中使用者或者管理員可以啟用的一種特殊模式。應用程式所有要更改防火牆的請求將定向給使用者知曉,以便確認和否認。為一個連線的授權設定一個時間限制並限制其所連主機、網路或連線是可行的。配置可以儲存以便將來不需通知便可應用相同行為。 該模式的另一個特性是管理和應用程式發起的請求具有相同功能的預選服務和埠的外部連結嘗試。服務和埠的限制也會限制傳送給使用者的請求數量。

使用者策略支援

管理員可以規定哪些使用者可以使用使用者互動模式和限制防火牆可用特性。

埠後設資料資訊(由 Lennart Poettering 提議)

擁有一個埠獨立的後設資料資訊是很好的。當前對 /etc/services 的埠和協議靜態分配模型不是個好的解決方案,也沒有反映當前使用情況。應用程式或服務的埠是動態的,因而埠本身並不能描述使用情況。

後設資料資訊可以用來為防火牆制定簡單的規則。下面是一些例子:

  • 允許外部訪問檔案共享應用程式或服務
  • 允許外部訪問音樂共享應用程式或服務
  • 允許外部訪問全部共享應用程式或服務
  • 允許外部訪問 torrent 檔案共享應用程式或服務
  • 允許外部訪問 http 網路服務

這裡的後設資料資訊不只有特定應用程式,還可以是一組使用情況。例如:組“全部共享”或者組“檔案共享”可以對應於全部共享或檔案共享程式(如:torrent 檔案共享)。這些只是例子,因而,可能並沒有實際用處。

這裡是在防火牆中獲取後設資料資訊的兩種可能途徑:

第一種是新增到 netfilter (核心空間)。好處是每個人都可以使用它,但也有一定使用限制。還要考慮使用者或系統空間的具體資訊,所有這些都需要在核心層面實現。

第二種是新增到 firewall daemon 中。這些抽象的規則可以和具體資訊(如:網路連線可信級、作為具體個人/主機要分享的使用者描述、管理員禁止完全共享的應歸則等)一起使用。

第二種解決方案的好處是不需要為有新的後設資料組和納入改變(可信級、使用者偏好或管理員規則等等)重新編譯核心。這些抽象規則的新增使得 firewall daemon 更加自由。即使是新的安全級也不需要更新核心即可輕鬆新增。

sysctld

現在仍有 sysctl 設定沒有正確應用。一個例子是,在 rc.sysinit 正執行時,而提供設定的模組在啟動時沒有裝載或者重新裝載該模組時會發生問題。

另一個例子是 net.ipv4.ip_forward ,防火牆設定、libvirt 和使用者/管理員更改都需要它。如果有兩個應用程式或守護程式只在需要時開啟 ip_forwarding ,之後可能其中一個在不知道的情況下關掉服務,而另一個正需要它,此時就不得不重啟它。

sysctl daemon 可以透過對設定使用內部計數來解決上面的問題。此時,當之前請求者不再需要時,它就會再次回到之前的設定狀態或者是直接關閉它。

防火牆規則

netfilter 防火牆總是容易受到規則順序的影響,因為一條規則在鏈中沒有固定的位置。在一條規則之前新增或者刪除規則都會改變此規則的位置。 在靜態防火牆模型中,改變防火牆就是重建一個乾淨和完善的防火牆設定,且受限於 system-config-firewall / lokkit 直接支援的功能。也沒有整合其他應用程式建立防火牆規則,且如果自定義規則檔案功能沒在使用 s-c-fw / lokkit 就不知道它們。預設鏈通常也沒有安全的方式新增或刪除規則而不影響其他規則。

動態防火牆有附加的防火牆功能鏈。這些特殊的鏈按照已定義的順序進行呼叫,因而向鏈中新增規則將不會干擾先前呼叫的拒絕和丟棄規則。從而利於建立更為合理完善的防火牆配置。

下面是一些由守護程式建立的規則,過濾列表中啟用了在公共區域對 ssh , mdns 和 ipp-client 的支援:

*filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 :FORWARD_ZONES - [0:0]
 :FORWARD_direct - [0:0]
 :INPUT_ZONES - [0:0]
 :INPUT_direct - [0:0]
 :IN_ZONE_public - [0:0]
 :IN_ZONE_public_allow - [0:0]
 :IN_ZONE_public_deny - [0:0]
 :OUTPUT_direct - [0:0]
 -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -j INPUT_direct
 -A INPUT -j INPUT_ZONES
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 -A FORWARD -i lo -j ACCEPT
 -A FORWARD -j FORWARD_direct
 -A FORWARD -j FORWARD_ZONES
 -A FORWARD -p icmp -j ACCEPT
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 -A OUTPUT -j OUTPUT_direct
 -A IN_ZONE_public -j IN_ZONE_public_deny
 -A IN_ZONE_public -j IN_ZONE_public_allow
 -A IN_ZONE_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
 -A IN_ZONE_public_allow -d 224.0.0.251/32 -p udp -m udp --dport 5353 -m conntrack --ctstate NEW -j ACCEPT
 -A IN_ZONE_public_allow -p udp -m udp --dport 631 -m conntrack --ctstate NEW -j ACCEPT

使用 deny/allow 模型來構建一個清晰行為(最好沒有衝突規則)。例如: ICMP 塊將進入 IN_ZONE_public_deny 鏈(如果為公共區域設定了的話),並將在 IN_ZONE_public_allow 鏈之前處理。

該模型使得在不干擾其他塊的情況下向一個具體塊新增或刪除規則而變得更加容易。

相關文章