CentOS 防火牆設定 : firewalld 指令範例教學


CentOS 7 版本之後的版本會使用 firewalld 這個服務來管理防火牆,而防火牆設定在Linux的世界裡也算是常會遇到的課題,因此,本文將以CentOS 7做為測試平台,來示範如何管理或者查詢防火牆的相關資訊,適合一般新手閱讀。

CetnOS - 防火牆 firewalld 指令範例教學

防火牆區域簡介

firewalld是用區域(zone)的概念來管理防火牆,我們可以針對每個區域進行不同的設定或規則,各區域的預設作用在此不多做介紹,但一般我們比較常接觸到的區域是「public」,完整的區域介紹可以參考此文章的說明。
註:在使用firewalld指令進行操作時,若想要針對某個區域做查詢,可加上–zone=區域名稱來限定範圍,如設定有變更,建議要養成重新載入設定的習慣:sudo firewall-cmd –reload

firewalld 指令教學

以下就列出幾個比較常見的firewalld的相關指令以及範例供大家參考:

查看防火牆的運作狀況

查看防火牆是否有開啟,或者它的運作情況,如果「Active」的值是inactive就是沒有在運作,active即是正常運作中

指令:systemctl status firewalld 或 firewall-cmd --state
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 三 2018-08-01 13:34:09 CST; 10s ago
     Docs: man:firewalld(1)
 Main PID: 861 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─861 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

PS1:如果是用「firewall-cmd –state」來查詢的話,防火牆有運行時會顯示「running」,沒有運行時則顯示「not running」,利用此方法查詢需要足夠權限

啟動、停止、重啟firewalld服務

firewalld會以service的方式運行,所以要啟動、停止、動啟防火牆的服務,一樣直接用「systemctl」來管理即可:

啟動:sudo systemctl start firewalld
停止:sudo systemctl stop firewalld
重啟:sudo systemctl restart firewalld
查詢以及設定預設的區域
查詢預設區域:firewall-cmd --get-default-zone
設定預設區域:sudo firewall-cmd --set-default-zone=work
查看已知(支援)的服務
firewall-cmd --get-services
查看有開Port的服務

和「–get-service」不太相同,這是列出目前區域中有開Port的服務

sudo firewall-cmd --list-services
列出運行中的區域

這個指令個人覺得還蠻實用的,可以同時查網路介面的代號,或者用–list-all指令也可以

firewall-cmd --get-active-zones
public
  interfaces: ens33 (網路介面)
  sources: 11.22.33.44/24
開啟連接埠

如果我們有特別的Port想要開啟,那麼可以利用以下指令來達成
–zone:指定區域
–add-port:加入欲開啟的連接埠,並指定通訊協定
–remove-port:移除開啟的連接埠,並指定通訊協定

sudo firewall-cmd --zone=public --add-port=6666/tcp

上面的指令是暫時性開啟,重開系統就會失效,如果想要永久生效,那麼需要再指令後面多加–permanent

sudo firewall-cmd --zone=public --add-port=6666/tcp --permanent

而開Port時,也可以一次開啟多個,例如以下的例子就會同時開啟6666 ~ 6670等5個Port

sudo firewall-cmd --zone=public --add-port=6666-6670/tcp
查詢已開啟的連接埠

承上,如果在開啟連接埠之後,可以利用–list-ports來查詢連接埠的開啟狀況,以確保有開啟成功

sudo firewall-cmd --list-ports

想移除已開啟的Port,則利用–remove-port來達成:

sudo firewall-cmd --zone=public --remove-port=6666/tcp --permanent
新增、移除服務

在前面有提到「–get-service」是列出已知的服務,因此,我們可以藉由這些服務名稱,直接透過–add-service的方式來開放此服務,例如:

sudo firewall-cmd --zone=public --add-service=mysql --permanent

要將加入的服務移除的話,則使用–remove-service

sudo firewall-cmd --zone=public --remove-service=mysql --permanent
列出區域的詳細設定

可以指定區域來查詢,該指令會列出此區域中設定的相關細節

sudo firewall-cmd --zone=public --list-all
重新載入防火牆設定
sudo firewall-cmd --reload
Port Forwarding 連接埠轉發

利用–add-forward-port參數,可以將來自連接埠A的資料轉發至連接埠B,如以下的例子就是將來自Port=22的訊息轉發至Port=2233

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233

承上,以下的例子沒有用到toport,而是用了toaddr,這樣表示要把資訊轉發到位址192.168.10.1的相同連接埠,也就是22

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.10.1

那如果同時指定toporttoaddr呢?也是可以的,例如以下範例是把來自本機22連接埠的資料轉發至192.168.10.1主機上是2233連接埠

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233:toaddr=192.168.10.1

註:連接埠轉發如果是不同主機的話,那麼要先利用–add-masquerade來開啟防火牆偽裝,移除的話則使用–remove-masquerade

sudo firewall-cmd --zone=public --add-masquerade
白名單

利用–add-source將IP加入白名單內,移除則用–remove-source

firewall-cmd --zone=public --add-source=192.168.100.0/24 --permanent

Rich rules

Rich rules在官方文件中有詳細的用法說明,主要會用–add-rich-rule–remove-rich-rule來管理操作一些比較複雜的狀況,以下就舉幾個平常比較有機會遇到的實務案例供大家參考:

IP白名單:允IP存取

允許來自指定IP的存取請求,即加入該IP進白名單,範例如下:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.10.10 accept'

在還沒使用「–add-rich-rule」之前,如果利用–list-rich-rules來查詢已加入的rich rules,加到的結果會是空的(預設值),而當我們執行過上述的指令,再一次進行rich rules的查詢,就可以看到剛剛已加入的條件了:

sudo firewall-cmd --list-rich-rules
執行結果:rule family="ipv4" source address="192.168.10.1" accept
IP黑名單:拒絕IP存取

承上,有允許IP進入當然就有拒絕的設定,要拒絕某個IP的請求,只要把上述指令中的accept改成reject就行了,在這邊我們做一點小變化,加入一些其他的條件,例如下面的例子是拒絕來自192.168.1.10且Port=22的存取請求

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.10.10" port port=22 protocol=tcp reject'
Port Forwarding 連接埠轉發

我們也可以利用rich rules來設定連接埠轉發,例如下面範例就是將主機192.168.19.1、連接埠80上的流量導到8080連接埠上

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=192.168.10.1 forward-port port=80 protocol=tcp to-port=8080'

而下面的範例則是將連接埠80的資料導到主機192.168.10.2的8080連接埠上(如果轉發至不同主機的話,masquerade要開啟)

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.10.2'

延伸閱讀:
[教學] MariaDB/MySQL 常用指令操作與語法範例