從 RHEL/CentOS 7開始,使用新的防火墻服務——firewalld。這里介紹該防火墻服務的基本用法
一、防火墻服務管理:從 RHEL/CentOS 7開始采用Systemd作為新的系統管理器,而systemctl則是Systemd中用于管理服務的命令
# 啟動防火墻服務
systemctl start firewalld# 停止防火墻服務
systemctl stop firewalld# 重啟防火墻服務
systemctl restart firewalld# 查看防火墻服務狀態
systemctl status firewalld# 防火墻服務 設置開機自啟
systemctl enable firewalld# 防火墻服務 取消開機自啟
systemctl disable firewalld
二、防火墻配置
firewalld提供了命令行客戶端——firewall-cmd用于實現配置、修改防火墻規則
在firewalld中引入zone區域的概念。可以按網卡接口、網絡連接的源地址將網絡流量歸屬到不同的區域下進行管理。每個區域使用獨立的防火墻規則。故一個網格連接只能屬于一個區域,但一個區域擁有多個網絡連接。當一個網絡流量不屬于任何一個區域管理時,則會使用默認區域(通常,該默認區域為public區域)
# 查看所有區域的名稱
firewall-cmd --get-zones# 查看所有區域的詳情
firewall-cmd --list-all-zones# 查看指定區域的詳情(防火墻規則)
firewall-cmd --zone=<區域名稱> --list-all# 查看默認區域
firewall-cmd --get-default-zone# 設置默認區域
firewall-cmd --set-default-zone <區域名稱># 查看活動的區域 及其配置的 網卡接口、源地址
# (一個區域如果配置了 網卡接口 或 網絡連接的源地址,即為active zone活動區域)
firewall-cmd --get-active-zones# 查看指定網卡接口所屬的區域
firewall-cmd --get-zone-of-interface=<網卡接口名稱># 向指定區域 添加 網卡接口
firewall-cmd --zone=<區域名稱> --add-interface=<網卡接口名稱># 從指定區域 移除 網卡接口
firewall-cmd --zone=<區域名稱> --remove-interface=<網卡接口名稱># 查看指定源地址所屬的區域
firewall-cmd --get-zone-of-source=<源地址># 向指定區域 添加 源地址
firewall-cmd --zone=<區域名稱> --add-source=<源地址># 從指定區域 移除 源地址
firewall-cmd --zone=<區域名稱> --remove-source=<源地址>
三、控制端口
開放端口
# 對指定區域,開放端口
firewall-cmd --zone=<區域名稱> --add-port=<端口號>[-端口號]/<協議># 對public區域,開放tcp協議83端口
firewall-cmd --zone=public --add-port=83/tcp# 對public區域,開放udp協議的10、11、12、13、14、15端口
firewall-cmd --zone=public --add-port=10-15/udp
刪除端口,相當于禁用端口
# 從指定區域,刪除端口
firewall-cmd --zone=<區域名稱> --remove-port=<端口號>[-端口號]/<協議># 對public區域,刪除tcp協議的83端口
firewall-cmd --zone=public --remove-port=83/tcp# 對public區域,刪除udp協議的10、11、12、13、14、15端口
firewall-cmd --zone=public --remove-port=10-15/udp
查看所有開放的端口
# 查看指定區域下,所有開放的端口
firewall-cmd --zone=<區域名稱> --list-ports# 查詢指定區域下,指定協議的端口是否開放,結果yes表示開放,結果no表示未開放
firewall-cmd --zone=<區域名稱> --query-port=<端口>/<協議># 查看public區域下,tcp協議的19999端口是否開放
firewall-cmd --zone=public --query-port=19999/tcp
使用服務
在firewalld中引入了服務service的概念,可以將其理解為一系列端口的集合。這樣只需添加相應的服務到防火墻規則中,即可打開該服務關聯的所有端口。firewalld中已經預定義了一部分service服務及其相應的端口
# 查看所有預定義的服務
firewall-cmd --get-services
預定義服務的xml文件位于 /usr/lib/firewalld/services/ 下,可通過查看相應服務的xml文件確認其所關聯的端口
此外我們還可以自定義服務及其關聯的端口集合,自定義服務xml文件的寫法可以去抄預定義服務xml文件的作業;然后將自定義服務的xml文件存放于 /etc/firewalld/services 路徑下;最后執行 firewall-cmd --reload 命令,使得自定義服務的xml文件生效。此時就可以像使用預定義服務一樣,去使用自定義服務了(自定義服務的服務名即為xml文件的文件名,例如demo1.xml文件對應的服務名即為demo1)
# 查看指定區域下添加的服務
firewall-cmd --zone=<區域名稱> --list-service# 查詢指定區域下,指定的服務是否被添加到該區域,結果yes表示已添加,結果no表示未添加
firewall-cmd --zone=<區域名稱> --query-service=<服務名># 向指定區域中添加服務
firewall-cmd --zone=<區域名稱> --add-service=<服務名># 從指定區域中移除服務
firewall-cmd --zone=<區域名稱> --remove-service=<服務名>
Note
Runtime Mode 運行時模式、Permanent Mode 永久模式
Runtime Mode 運行時模式:通過 firewall-cmd 修改防火墻配置時,默認只會對當前立即有效,即所謂的Runtime Mode 運行時模式。防火墻服務重啟后將會失效
Permanent Mode 永久模式:如果期望防火墻服務重啟后使用新配置,可在firewall-cmd命令中使用 --permanent選項。此時新配置將不會在當前立即生效,而是在重啟防火墻服務后永久生效。即所謂的Permanent Mode 永久模式
如果期望同時修改兩種模式(運行時模式、永久模式)下的配置,可有下述兩種方式實現。這里推薦使用方式1,這樣可以實現在將新配置應用到永久模式前,能夠立即驗證修改配置的效果
# 在 運行時模式下 修改防火墻配置
firewall-cmd <other options># 將修改后的所有配置保存到永久模式下,使得防火墻服務重啟后新配置依然生效。即修改了永久模式的配置
firewall-cmd --runtime-to-permanent
# 在 永久模式下 修改防火墻配置
firewall-cmd --permanent <other options># 重新加載配置,使得修改后的所有配置在當前立即生效。即修改了運行時模式的配置
firewall-cmd --reload
timeout 選項
通過遠程訪問服務器時,一旦使用錯誤配置可能會導致用戶鎖定自身的機器,無法再次登陸訪問。故可以使用 --timeout 選項 避免發生該問題。在達到超時時間后,相關更改會恢復到之前的狀態。此外使用該選項時,將無法使用–permanent選項
# 向pulbic區域添加名為demo6的服務,并在5分鐘后撤銷此配置
firewall-cmd --zone=public --add-service=demo6 --timeout 5m