CentOS 7 版本之後的版本會使用 firewalld 這個服務來管理防火牆,而防火牆設定在Linux的世界裡也算是常會遇到的課題,因此,本文將以CentOS 7做為測試平台,來示範如何管理或者查詢防火牆的相關資訊,適合一般新手閱讀。
防火牆區域簡介
firewalld是用區域(zone)的概念來管理防火牆,我們可以針對每個區域進行不同的設定或規則,各區域的預設作用在此不多做介紹,但一般我們比較常接觸到的區域是「public」,完整的區域介紹可以參考此文章的說明。
註:在使用firewalld指令進行操作時,若想要針對某個區域做查詢,可加上
firewalld 指令教學
以下就列出幾個比較常見的firewalld的相關指令以及範例供大家參考:
查看防火牆的運作狀況
查看防火牆是否有開啟,或者它的運作情況,如果「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
列出運行中的區域
這個指令個人覺得還蠻實用的,可以同時查網路介面的代號,或者用
firewall-cmd --get-active-zones
public
interfaces: ens33 (網路介面)
sources: 11.22.33.44/24
開啟連接埠
如果我們有特別的Port想要開啟,那麼可以利用以下指令來達成
.
.
.
sudo firewall-cmd --zone=public --add-port=6666/tcp
上面的指令是暫時性開啟,重開系統就會失效,如果想要永久生效,那麼需要再指令後面多加
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
查詢已開啟的連接埠
承上,如果在開啟連接埠之後,可以利用
sudo firewall-cmd --list-ports
想移除已開啟的Port,則利用
sudo firewall-cmd --zone=public --remove-port=6666/tcp --permanent
新增、移除服務
在前面有提到「–get-service」是列出已知的服務,因此,我們可以藉由這些服務名稱,直接透過
sudo firewall-cmd --zone=public --add-service=mysql --permanent
要將加入的服務移除的話,則使用
sudo firewall-cmd --zone=public --remove-service=mysql --permanent
列出區域的詳細設定
可以指定區域來查詢,該指令會列出此區域中設定的相關細節
sudo firewall-cmd --zone=public --list-all
重新載入防火牆設定
sudo firewall-cmd --reload
Port Forwarding 連接埠轉發
利用
sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233
承上,以下的例子沒有用到
sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.10.1
那如果同時指定
sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233:toaddr=192.168.10.1
註:連接埠轉發如果是不同主機的話,那麼要先利用
sudo firewall-cmd --zone=public --add-masquerade
白名單
利用
firewall-cmd --zone=public --add-source=192.168.100.0/24 --permanent
Rich rules
Rich rules在官方文件中有詳細的用法說明,主要會用
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」之前,如果利用
sudo firewall-cmd --list-rich-rules
執行結果:rule family="ipv4" source address="192.168.10.1" accept
IP黑名單:拒絕IP存取
承上,有允許IP進入當然就有拒絕的設定,要拒絕某個IP的請求,只要把上述指令中的
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 常用指令操作與語法範例