在本文中,我們將深入探討如何在CentOS操作系統上使用 firewalld
指令設定防火牆規則。防火牆是保護你的伺服器免受不法入侵的關鍵元件,正確配置它至關重要。
firewalld 什麼是?
Firewalld是一種強大的工具,用於管理Linux系統上的防火牆規則。它允許你設定哪些網絡流量可以進入或離開你的伺服器,從而增加了系統的安全性。
安裝和啟用 firewalld
在開始配置firewalld之前,確保已經安裝並啟用它。你可以使用以下指令進行安裝和啟用:
# 檢查 iptables 服務是否正在運行
sudo systemctl status iptables
# 停止正在執行的 iptables 服務
sudo systemctl stop iptables
# 將 iptables 服務永久關閉
sudo ystemctl mask iptables
# 安裝 firewalld
sudo yum install firewalld
# 啟用 firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
firewall-cmd
自訂 port 防火牆設定教學
firewalld 都是透過 firewall-cmd
指令來操作的。如果我們想要開啟的連接埠不在 firewalld 的內建服務名單中,也可以直接指定通訊協定( tcp 或 udp )與埠號。
# 開啟 tcp 的 8080 連接埠
sudo firewall-cmd --zone=public --add-port=8080/tcp
# 永久開啟 tcp 的 8080 連接埠
sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp
# 移除規則 8080 port
sudo firewall-cmd --zone=public --permanent --remove-port=8080/tcp --permanent
埠號也可以透過指定範圍的方式,一次開啟多個 port
# 開啟 tcp 的 8000 至 8080 port
sudo firewall-cmd --zone=public --add-port=8000-8080/tcp
# 永久開啟 tcp 的 8000 至 8080 port
sudo firewall-cmd --zone=public --permanent --add-port=8000-8080/tcp
# 永久開啟 tcp 的 8000, 8080 port
sudo firewall-cmd --zone=public --permanent --add-port=8000/tcp --add-port=8080/tcp
# 移除規則 8000, 8080 port
sudo firewall-cmd --zone=public --permanent --remove-port=8000/tcp --remove-port=8080/tcp
firewall-cmd
自訂 ip 防火牆設定教學
只允許特定來源 IP 位址使用服務
若我們希望限制只有某些特定來源 IP 位址的電腦可以使用我們的服務,就可以進行這樣的設定。
# 允許 192.168.0.0/24 使用 http 服務
firewall-cmd --zone=public \
--add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
# 永久允許 192.168.0.0/24 使用 http 服務
firewall-cmd --zone=public \
--add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' \
--permanent
白名單 IP 位址 (最後用 accept)
若要將某個特定的 IP 位址加入白名單,讓該 IP 位址可以連接所有的連接埠,可以進行以下設定:
# 將 192.169.0.0/24 與 231.150.57.66 列為 public 區域的白名單
firewall-cmd --zone=public \
--add-rich-rule 'rule family="ipv4" source address="192.169.0.0/24" accept' \
--add-rich-rule 'rule family="ipv4" source address="231.150.57.66" accept'
# 永久將 192.169.0.0/24 與 231.150.57.66 列為 public 區域的白名單
firewall-cmd --zone=public \
--add-rich-rule 'rule family="ipv4" source address="192.169.0.0/24" accept' \
--add-rich-rule 'rule family="ipv4" source address="231.150.57.66" accept'
--permanent
黑名單 IP 位址 (最後用 reject)
若要將某個特定的 IP 位址加入黑名單,讓該 IP 位址可以連接所有的連接埠,可以進行以下設定:
# 將 192.169.0.0/24 與 231.150.57.66 列為 public 區域的黑名單
firewall-cmd --zone=public \
--add-rich-rule 'rule family="ipv4" source address="192.169.0.0/24" reject' \
--add-rich-rule 'rule family="ipv4" source address="231.150.57.66" reject'
# 永久將 192.169.0.0/24 與 231.150.57.66 列為 public 區域的黑名單
firewall-cmd --zone=public \
--add-rich-rule 'rule family="ipv4" source address="192.169.0.0/24" reject' \
--add-rich-rule 'rule family="ipv4" source address="231.150.57.66" reject'
--permanent
firewall zones (防火牆區域)
了解防火牆區域(firewall zones)是很重要的。防火牆區域定義了一個特定的網絡區域或環境,並指定了該區域的安全級別和預設防火牆規則。每個區域都有不同的規則集,根據伺服器所處的環境,你可以選擇適當的區域。以下是一些常見的防火牆區域以及相應的說明和範例:
# 列出所有的區域
firewall-cmd --get-zones
#輸出
block dmz drop external home internal public trusted work
區域 | 說明 | 新增規則進區域的範例 |
---|---|---|
public | 用於公共網絡,最不安全的區域 | 允許HTTP(端口80)和HTTPS(端口443)流量進入:sudo firewall-cmd --zone=public --add-service=http --add-service=https --permanent |
private | 用於信任的內部網絡,通常允許內部流量 | 允許Samba共享(端口137-139和445):sudo firewall-cmd --zone=private --add-service=samba --permanent |
dmz | 用於託管公開可訪問的服務,但希望隔離它們以保護內部網絡 | 允許SMTP(端口25)和HTTP(端口80)流量進入:sudo firewall-cmd --zone=dmz --add-service=smtp --add-service=http --permanent |
trusted | 最信任的區域,用於高度受信任的環境 | 允許任何流量進入: sudo firewall-cmd --zone=trusted --add-service=any --permanent |
列出所有
的區域與內容
# 列出所有的區域與內容
sudo firewall-cmd --list-all-zones
列出指定
的區域與內容
# 列出指定的區域與內容
sudo firewall-cmd --zone=public --list-all
firewall zones 預設區域
如果網路介面或連線沒有指定區域,系統就會將其加入預設區域。如果您要查詢目前的預設區域,您可以執行以下動作:
# 列出預設區域
firewall-cmd --get-default-zonepublic
# 設定預設區域
firewall-cmd --set-default-zone=home
# 列出預設區域
firewall-cmd --get-default-zonehome
介面所屬區域
列出目前所有運作中的區域,以及各個網路介面所屬的區域:
# 查詢運作中的區域
firewall-cmd --get-active-zonespublic
輸出:
public
interfaces: enp7s0d1 ib0
# 查詢網路介面所屬區域
firewall-cmd --get-zone-of-interface=enp7s0d1
輸出:
public
# 更改指定網路介面的所屬區域
# 暫時將 enp7s0d1 網路介面設定至 home 區域
sudo firewall-cmd --zone=home --change-interface=enp7s0d1
如果想要永久調整網路介面的設定值,就需要直接更改底下的設定檔。以 enp7s0d1
為例,就要修改 ifcfg-enp7s0d1
這個檔案中的 ZONE 設定值。
ZONE=dmz
firewall zones 的服務
如果要允許一些對外服務的連接埠通過防火牆,可以在區域設定中新增服務設定。Firewalld 預先定義了一些常用的服務名稱,可以使用指令查詢。
# 列出服務清單
firewall-cmd --get-services
輸出
dhcpv6-client dhcpv6-server http https ssh
# 針對 public 的 zone 列出服務清單
sudo firewall-cmd --zone=public --permanent --list-services
輸出
http https
如果在 public
區域開啟網頁的 80 port,就可以讓外部使用者連線到我們的網站。由於現今的網站都提供安全加密的網頁,因此最好也一併開啟 HTTPS 的 443 port。
# 將 https 服務新增至 public 區域中
sudo firewall-cmd --zone=public --add-service=https
# 永久將 https 服務新增至 public 區域中
sudo firewall-cmd --zone=public --permanent --add-service=https
新增自訂服務名稱
若要新增服務名稱,可以在 /etc/firewalld/services
新增服務的 XML 設定檔,XML 設定檔的語法可參考 /usr/lib/firewalld/services/
中的範例,例如 http.xml
就是定義 http 服務的設定檔:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/>
</service>
撰寫自己的服務設定檔然後另外儲存成一個新的檔案,放在 /etc/firewalld/services
目錄下,檔名要設定為服務的名稱加上 XML 的附檔名,例如 service.xml
,
# 接著讓 firewalld 重新載入設定
sudo firewall-cmd --reload
# 重新查詢一次支援的服務名稱,應該就可以看到新加入的 service 服務了
firewall-cmd --get-services
記得,所有防火牆都需要 reload 讓變更生效
當你完成所有的設定後,記得重新載入防火牆以使變更生效:
sudo firewall-cmd --reload
常見問題解答
- Q: 如何禁用 firewalld?
A: 使用sudo systemctl disable firewalld
來禁用firewalld服務。 - Q: 如何查看firewalld的日誌?
A: 編輯/etc/firewalld/firewalld.conf
,找到LogDenied=off
替换成LogDenied=all
重啟防火牆,用sudo journalctl -u firewalld
可以看到。 - Q: 我忘記了一個規則的語法,該怎麼辦?
A: 使用man firewall-cmd
來查看firewalld的手冊,其中包含了詳細的語法和示例。 - Q: firewalld是否支持IPv6?
A: 是的,firewalld支持IPv6,你可以使用相同的指令來配置IPv6規則。 - Q: 如何封鎖特定IP地址的所有流量?
A: 使用sudo firewall-cmd --zone=public --add-rich-rule='rule source address=192.168.1.100 drop' --permanent
來封鎖特定IP地址的所有流量。
這就是關於在CentOS上使用firewalld指令設定防火牆規則的基本教學。希望這對你有所幫助,並增強你伺服器的安全性。如果你有更多問題,請隨時提問!
- 中文參考資料:
- 英文參考資料:
延伸閱讀:如何快速在Linux中開機自動化?5分鐘使用教學 /etc/rc.local
延伸閱讀:如何精準快速處理文字資料? 5分鐘學會 cut 指令教學與常用範例整理