如何在 Linux 中設定防火牆 ? CentOS firewall-cmd 設定防火牆規則與 firewall zones 教學




在本文中,我們將深入探討如何在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
常用的 Zones 說明

列出所有的區域與內容

# 列出所有的區域與內容
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
<?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

常見問題解答

  1. Q: 如何禁用 firewalld?
    A: 使用 sudo systemctl disable firewalld 來禁用firewalld服務。
  2. Q: 如何查看firewalld的日誌?
    A: 編輯 /etc/firewalld/firewalld.conf ,找到 LogDenied=off替换成 LogDenied=all重啟防火牆,用 sudo journalctl -u firewalld 可以看到。
  3. Q: 我忘記了一個規則的語法,該怎麼辦?
    A: 使用 man firewall-cmd 來查看firewalld的手冊,其中包含了詳細的語法和示例。
  4. Q: firewalld是否支持IPv6?
    A: 是的,firewalld支持IPv6,你可以使用相同的指令來配置IPv6規則。
  5. 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 指令教學與常用範例整理





主頁 » LINUX » 實用技巧 » 如何在 Linux 中設定防火牆 ? CentOS firewall-cmd 設定防火牆規則與 firewall zones 教學

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *