防火牆對于控制進出 Linux 伺服器的網絡流量至關重要。它能夠定義一組防火牆規則來控制主機上的傳入流量。本文介紹如何添加、删除、啟用和禁用防火牆規則和區域。 |
什麼是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
Firewalld的臨時設定和永久設定
Firewalld 使用兩個獨立的配置,即臨時設定和永久設定:
- 臨時設定: 臨時設定不會在系統重新開機時保持不變。這意味着臨時設定不會自動儲存到永久設定中。
- 永久設定: 永久設定會存儲在配置檔案中,将在每次重新啟動時加載并成為新的臨時設定。
啟用、禁用Firewalld
Firewalld預設安裝在Centos7/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
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:
通過使用選項"--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:
要檢視所有活動的zone,請運作以下指令:
[root@server1 ~]# firewall-cmd --get-active-zones
home
interfaces: ens33
public
interfaces: ens160
要更改預設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
同樣,要從開放的端口中删除特定區域的特定端口,請運作:
[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
下面是在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
設定端口轉發
端口轉發是一種将任何傳入網絡流量從一個端口轉發到另一個内部端口或另一台機器上的外部端口的方法。
注意:端口轉發必須開啟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
要允許來自位址 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
要拒絕來自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
http://www.cctime.com/html/2022-8-1/1625654.htm
http://www.dzwww.com/synr/sycj/202208/t20220801_10611161.htm
http://www.techweb.com.cn/it/2022-08-09/2901128.shtml
要删除任何富規則,請使用
--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
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
使用下面指令删除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
如何清空一個表的鍊?下面是文法和執行個體:
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
總結
本文帶你了解了 firewalld 的完整用法,例如zones、允許/拒絕服務和端口、端口轉發、Rich Rules、Direct規則等。
TRANSLATE with x
English
Arabic | Hebrew | Polish |
Bulgarian | Hindi | Portuguese |
Catalan | Hmong Daw | Romanian |
Chinese Simplified | Hungarian | Russian |
Chinese Traditional | Indonesian | Slovak |
Czech | Italian | Slovenian |
Danish | Japanese | Spanish |
Dutch | Klingon | Swedish |
English | Korean | Thai |
Estonian | Latvian | Turkish |
Finnish | Lithuanian | Ukrainian |
French | Malay | Urdu |
German | Maltese | Vietnamese |
Greek | Norwegian | Welsh |
Haitian Creole | Persian |
TRANSLATE with
COPY THE URL BELOW
Back
EMBED THE SNIPPET BELOW IN YOUR SITE
Enable collaborative features and customize widget: Bing Webmaster Portal