如何在 Linux 系統中配置 firewalld 防火牆策略

夢共裡醉發表於2022-08-16
防火牆對於控制進出   伺服器的網路流量至關重要。它能夠定義一組防火牆規則來控制主機上的傳入流量。本文介紹如何新增、刪除、啟用和禁用防火牆規則和區域。
什麼是FirewallD

“firewalld”是firewall daemon。它提供了一個動態管理的防火牆,帶有一個非常強大的過濾系統,稱為 Netfilter,由 Linux 核心提供。

FirewallD 使用zones和services的概念,而 iptables 使用chain和rules。與 iptables 相比,“FirewallD”提供了一種非常靈活的方式來處理防火牆管理。

每個zones都可以按照指定的標準進行配置,以根據你的要求接受或拒絕某些服務或埠,並且它可以與一個或多個網路介面相關聯。預設區域為public區域。
[yijiFirewalld zones[/yiji]
以下 列出 FirewallD 提供的zones。執行以下 以列出zones:

[root@server1 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
  • block: 對於 IPv4,任何傳入連線都會被 icmp-host-prohibited 訊息拒絕,對於 IPv6 則是 icmp6-adm-prohibited。
  • dmz:應用於你的DMZ區域的計算機,這些計算機可公開訪問,但對內部網路的訪問受到限制。僅接受選定的傳入連線。
  • drop:任何傳入連線都將在沒有任何通知的情況下被丟棄。只允許傳出連線。
  • external:用於在系統中充當路由器時啟用 NAT 偽裝的外部網路。只允許選定的傳入連線。
  • home:用於家庭網路。僅接受選定的傳入連線。
  • internal:用於內部網路,網路上的其他系統通常是可信任的。僅接受選定的傳入連線。
  • public:用於公共區域,僅接受選定的傳入連線。
  • trusted:接受所有網路連線。
  • work:用於工作區域,同一網路上的其他計算機大多受信任。僅接受選定的傳入連線。
Firewalld services

Firewalld 的service配置是預定義的服務。要列出可用的服務模組,請執行以下命令:

[root@server1 ~]# firewall-cmd --get-services

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則

Firewalld的臨時設定和永久設定

Firewalld 使用兩個獨立的配置,即臨時設定和永久設定:

  • 臨時設定: 臨時設定不會在系統重啟時保持不變。這意味著臨時設定不會自動儲存到永久設定中。
  • 永久設定: 永久設定會儲存在配置檔案中,將在每次重新啟動時載入併成為新的臨時設定。
啟用、禁用Firewalld

Firewalld預設安裝在 7/8中,下面命令時如何啟用或者停用firewalld:

# 啟用Firewalld
[root@server1 ~]# systemctl start firewalld
# 禁用Firewalld
[root@server1 ~]# systemctl stop firewalld
# 開機啟動
[root@server1 ~]# systemctl enable firewlald
# 禁止開機啟動
[root@server1 ~]# systemctl disable firewalld

檢視firewlald的狀態:

[root@server1 ~]# systemctl status firewalld
或者
[root@server1 ~]# firewall-cmd --state
running

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則

zone管理

Firewalld 為每個區域提供不同級別的安全性,公共區域設定為預設區域。下面命令檢視預設區域:

[root@server1 ~]# firewall-cmd --get-default-zone 
public

下面命令檢視預設區域的配置:

[root@server1 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ntp ssh
  ports: 2222/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
透過使用選項"--zone”和“--change-interface”的組合,可以輕鬆更改zone中的介面。例如,要將“ens33”介面分配給“home”區域,請執行以下命令:

[root@server1 ~]# firewall-cmd --zone=home --change-interface=ens33
success
[root@server1 ~]# firewall-cmd --zone=home --list-all
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
要檢視所有活動的zone,請執行以下命令:

[root@server1 ~]# firewall-cmd --get-active-zones 
home
  interfaces: ens33
public
  interfaces: ens160

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
要更改預設zone,請使用以下命令。例如,要將預設區域更改為 home,請執行以下命令:

[root@server1 ~]# firewall-cmd --set-default-zone=home

要找出與 ens160 介面關聯的區域,請執行以下命令:

[root@server1 ~]# firewall-cmd --get-zone-of-interface=ens160
public

要建立新zone,請使用以下命令。例如,要建立一個名為“test”的新區域,並永久生效,請執行:

[root@server1 ~]# firewall-cmd --permanent --new-zone=test
success
[root@server1 ~]# firewall-cmd --reload
success
開放和關閉埠

開啟特定埠允許使用者從外部訪問系統,這代表了安全風險。因此,僅在必要時為某些服務開啟所需的埠。

要獲取當前區域中開放的埠列表,請執行以下命令:

[root@server1 ~]# firewall-cmd --list-ports 
2222/tcp

下面例項將特定埠永久新增到列表中:

[root@server1 ~]# firewall-cmd --permanent --add-port=8080/tcp
success
[root@server1 ~]# firewall-cmd --reload
success

同樣,要刪除特定埠,請執行以下命令:

[root@server1 ~]# firewall-cmd --remove-port=8080/tcp
success

可以使用以下命令每次確認埠是否已新增或刪除:

[root@server1 ~]# firewall-cmd --list-ports

如果要為特定區域開放埠,例如,以下命令將為 home 區域開啟埠 80:

[root@server1 ~]# firewall-cmd --permanent --zone=home --add-port=80/tcp
success
[root@server1 ~]# firewall-cmd --reload
success

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
同樣,要從開放的埠中刪除特定區域的特定埠,請執行:

[root@server1 ~]# firewall-cmd --zone=home --remove-port=80/tcp
success
新增和移除服務型別

Firewalld 服務配置是預定義的服務,如果啟用了服務,則會自動載入。使用預定義服務使使用者可以更輕鬆地啟用和禁用對服務的訪問。

預定義的服務配置檔案位於 /usr/lib/firewalld/services目錄中。

Firewalld的服務,你不需要記住任何埠,並且可以一次性允許所有埠。

例如,執行以下命令允許 samba 服務。samba 服務需要啟用以下一組埠:“139/tcp 和 445/tcp”以及“137/udp 和 138/udp”。

新增'samba'服務後,所有埠都會同時啟用,因為所有埠資訊都在samba服務配置中。下面是Firewalld中預定義的samba的服務配置檔案:

[root@server1 ~]# cat /usr/lib/firewalld/services/samba.xml

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
下面是在home區域放行samba服務:

[root@server1 ~]# firewall-cmd --permanent --zone=home --add-service=samba
success
[root@server1 ~]# firewall-cmd --reload
success

要獲取有關 samba 服務的更多資訊,請執行以下命令:

[root@server1 ~]# firewall-cmd --info-service=samba
samba
  ports: 137/udp 138/udp 139/tcp 445/tcp
  protocols: 
  source-ports: 
  modules: netbios-ns
  destination:

要一次新增多個服務,請執行以下命令。例如,要新增 http 和 https 服務,請執行以下命令:

[root@server1 ~]# firewall-cmd --permanent --zone=home --add-service={http,https}
success
[root@server1 ~]# firewall-cmd --reload
success

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則

設定埠轉發

埠轉發是一種將任何傳入網路流量從一個埠轉發到另一個內部埠或另一臺機器上的外部埠的方法。

注意:埠轉發必須開啟IP偽裝。使用下面顯示的命令為 external區域啟用偽裝。

[root@server1 ~]# firewall-cmd --permanent --zone=external --add-masquerade

要檢查是否為區域啟用了 IP 偽裝,請執行以下命令:

[root@server1 ~]# firewall-cmd --zone=external --query-masquerade 
yes

顯示yes,表示已經開啟偽裝。

要將埠重定向到同一系統上的另一個埠,例如:將80埠的所有資料包重定向到8080埠:

[root@server1 ~]# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
success

如果要將流量轉發到另一臺伺服器,例如:將所有 80 埠的資料包重定向到 IP 為 10.0.0.75 的伺服器上的 8080 埠:

[root@server1 ~]# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.0.75
success

例如,要允許來自特定源地址的流量,僅允許從特定子網連線到伺服器,請執行以下命令:

[root@server1 ~]# firewall-cmd --permanent --zone=home --add-source=192.168.1.0/24
success
富規則設定

富規則允許使用易於理解的命令建立更復雜的防火牆規則,但豐富的規則很難記住,可以檢視手冊 man firewalld.richlanguage並找到示例。

富規則的一般規則結構如下:
rule
  [source]
  [destination]
  service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
  [log]
  [audit]
  [accept|reject|drop|mark]

要允許來自地址 192.168.0.0/24 的訪問,請執行以下命令:

[root@server1 ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" accept'
success

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
要允許來自地址 192.168.0.0/24 的連線訪問 ssh 服務,請執行以下命令:

[root@server1 ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" accept'
success

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
要拒絕來自192.168.10.0/24的流量訪問ssh服務,請執行以下命令:

[root@server1 ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port=22 protocol=tcp reject'
success

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
要刪除任何富規則,請使用 --remove-rich-rule選項,下面使用 --list-rich-rules列出富規則,然後刪除掉富規則:

[root@server1 ~]# firewall-cmd --zone=public --list-rich-rules 
rule family="ipv4" source address="192.168.0.0/24" accept
rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" accept
rule family="ipv4" source address="192.168.10.0/24" port port="22" protocol="tcp" reject
[root@server1 ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.0/24" accept'
success
[root@server1 ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" accept'
success
[root@server1 ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="22" protocol="tcp" reject'
success

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則

Firewalld的Direct規則

Direct規則類似於 iptables 命令,對於熟悉 iptables 命令的使用者很有用。或者,您可以編輯 /etc/firewalld/direct.xml檔案中的規則並重新載入防火牆以啟用這些規則。Direct規則主要由服務或應用程式用來新增特定的防火牆規則。

以下Direct規則將在伺服器上開啟埠 8080:

[root@server1 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT
success
[root@server1 ~]# firewall-cmd --reload
success

要列出當前區域中的Direct規則,請執行:

[root@server1 ~]# firewall-cmd --direct --get-all-rules 
ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
使用下面命令刪除Direct規則:

[root@server1 ~]# firewall-cmd --direct --get-all-rules 
ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT
[root@server1 ~]# firewall-cmd --permanent --direct --remove-rule ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
success
[root@server1 ~]# firewall-cmd --reload
success

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則
如何清空一個表的鏈?下面是語法和例項:

firewall-cmd --direct --remove-rules ipv4 [table] [chain]
[root@server1 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 filter INPUT
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server1 ~]# firewall-cmd --direct --get-all-rules

如何在 Linux 中配置 firewalld 規則如何在 Linux 中配置 firewalld 規則

總結

本文帶你瞭解了 firewalld 的完整用法,例如zones、允許/拒絕服務和埠、埠轉發、Rich Rules、Direct規則等。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524109/viewspace-2910696/,如需轉載,請註明出處,否則將追究法律責任。

相關文章