linux入門系列10--firewalld防火牆管理
上一篇文章學習了使用者及檔案相關許可權,本篇繼續學習防火牆技術。
防火牆作為公網與內網之間的保護屏障,對系統至關重要。防火牆又分為硬體防火牆和軟體防火牆,主要功能都是依據設定的策略對穿越防火牆的流量進行過濾。本篇主要講解Centos7系統自帶的軟體防火牆。
由於在初學階段為了避免干擾很多時候我們都是直接關閉防火牆,但在生產環境這樣做是很不安全的,因此我們需要掌握防火牆的相關配置方法。
一、Linux防火牆概述
Linux系統包含兩個層面的防火牆,一種是基於TCP/IP的流量過濾工具,另外一種是TCP Wrappers服務。前者包括iptables、firewalld等防火牆,後者是能允許或禁止Linux系統提供服務的防火牆,在更高層面保護系統的安全。
在RHEL7系統中,firewalld取代了之前版本的iptables防火牆,成為預設的防火牆。二者有很大區別,iptables的防火牆策略是交由核心層面的netfilter網路過濾器來處理的,而firewalld則是交由核心層面的nftables包過濾框架來處理。
嚴格意義上說,iptables和firewalld都不是真正的防火牆,只是用來定義防火牆策略的防火牆管理工具而已,他們都是一種服務。
防火牆管理工具主要是為了方便運維管理人員對防火牆策略進行配置和管理,這類工具思路大同小異,只要掌握一個即可,本文主要講解firewalld這款防火牆管理工具。
二、firewalld防火牆管理工具
Centos7中集成了多款防火牆工具,其中預設的是firewalld,全稱為:Dynamic Firewall Manager of Linux systems,Linux系統的動態防火牆管理器。它用於命令列介面CLI或圖形使用者介面GUI兩種管理方式,下文將分別進行介紹。
firewalld相比之前傳統的防火牆管理配置工具,它支援動態更新技術並加入了區域(zone)的概念。簡單說就是事先定義幾套防火牆策略模板,使用者根據實際場景進行選擇,從而實現策略之間的快速切換。比如設定好home和work區域的策略後,在家就選擇home區域,在公司就選擇work策略,極大提升了防火牆策略的應用效率。
firewalld中蟬蛹的區域名稱和策略規則如下:
區域 | 預設策略規則 |
---|---|
trusted | 執行所有的資料包 |
home | 拒絕流入的流量,除非與流出的流量相關。如果流量與ssh、mdns、ipp-client、amba-client、dhcpv6-client服務相關則允許流量 |
internal | 同home |
work | 拒絕流入的流量,除非與流出的流量數相關。如果流量與 ssh、ipp-client 與 dhcpv6-client 服務相關,則允許流量 |
public | 拒絕流入的流量,除非與流出的流量相關。如果流量與 ssh、dhcpv6-client 服務 相關,則允許流量 |
external | 拒絕流入的流量,除非與流出的流量相關;而如果流量與 ssh 服務相關,則允許流量 |
dmz | 拒絕流入的流量,除非與流出的流量相關;而如果流量與 ssh 服務相關,則允許流量 |
block | 拒絕流入的流量,除非與流出的流量相關 |
drop | 同block |
2.1 firewall-cmd
firewall-cmd是 firewalld 防火牆配置管理工具的 CLI(命令列介面)版本。它的引數一般都是以“長格式”來提供的。它的引數較多,但是由於centos7已經支援此命令的引數補齊了,所以要多用tab鍵。下表列出常用的引數及作用,更多引數自行通過man命令進行檢視。
引數 | 作用 |
---|---|
--get-default-zone | 查詢預設的區域名稱 |
--set-default-zone=<區域名稱> | 設定預設的區域,使其永久生效 |
--get-zones | 顯示可用的區域 |
--get-active-zones | 顯示當前正在使用的區域與網絡卡名稱 |
--get-services | 顯示預先定義的服務 |
--add-source= | 將源自此 IP 或子網的流量導向指定的區域 |
--remove-source= | 不再將源自此 IP 或子網的流量導向某個指定區域 |
--add-interface=<網絡卡名稱> | 將源自該網絡卡的所有流量都導向某個指定區域 |
--change-interface=<網絡卡名稱> | 將某個網絡卡與區域進行關聯 |
--list-all | 顯示當前區域的網絡卡配置引數、資源、埠以及服務等資訊 |
--list-all-zones | 顯示所有區域的網絡卡配置引數、資源、埠以及服務等資訊 |
--add-service=<服務名> | 設定預設區域允許該服務的流量 |
--add-port=<埠號/協議> | 設定預設區域允許該埠的流量 |
--remove-service=<服務名> | 設定預設區域不再允許該服務的流量 |
--remove-port=<埠號/協議> | 設定預設區域不再允許該埠的流量 |
--reload | 讓“永久生效”的配置規則立即生效,並覆蓋當前的配置規則 |
--panic-on | 開啟應急狀況模式 |
--panic-off | 關閉應急狀況模式 |
使用firewall配置策略有兩種模式:執行時模式(runtime)、永久模式(permanent)。執行時模式又稱為當前生效模式,而且隨著系統的重啟會失效,它是預設的模式。而如果需要配置永久生效,就需要新增--permanent 引數。
主要注意的是永久模式配置的策略只有重啟之後才能自動生效,如果想讓配置的策略立即生效,需要手動執行firewall-cmd --reload 命令。
2.1.1 防火牆狀態管理
如果安裝本系列教程逐步操作的話,系統以及是預設安裝了firewalld服務,如果你用的是其他系統或未安裝firewalld服務,可以通過命令自行安裝即可。安裝命令:yum install firewalld firewall-config
- 檢視防火牆狀態
[root@heimatengyun ~]# firewall-cmd --state
running
[root@heimatengyun ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sat 2019-12-21 21:26:53 CST; 1h 31min ago
Main PID: 915 (firewalld)
CGroup: /system.slice/firewalld.service
└─915 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Dec 21 21:26:53 heimatengyun systemd[1]: Started firewalld - dynamic firewal....
Hint: Some lines were ellipsized, use -l to show in full.
可以使用firewall-cmd --state 或systemctl status firewalld檢視防火牆狀態。
- 重啟防火牆服務
[root@heimatengyun ~]# systemctl restart firewalld.service
注意等同於systemctl restart firewalld,可以省略服務字尾名。
- 停止防火牆服務
[root@heimatengyun ~]# systemctl stop firewalld
[root@heimatengyun ~]# firewall-cmd --state
not running
- 啟動防火牆服務
[root@heimatengyun ~]# systemctl start firewalld
[root@heimatengyun ~]# firewall-cmd --state
running
2.1.2 防火牆配置檔案
配置檔案說明:firewalld 存放配置檔案有兩個目錄,/usr/lib/firewalld/和/etc/firewalld/。前者存放了一些預設的檔案,後者主要是存放使用者自定義的資料,所以我們新增的service或者rule都在後者下面進行。
[root@heimatengyun ~]# ls /usr/lib/firewalld/
icmptypes services zones
[root@heimatengyun ~]# ls /etc/firewalld/
firewalld.conf icmptypes lockdown-whitelist.xml services zones
server:儲存服務資料,就是一組定義好的規則。
zones:儲存區域規則。
firewalld.conf:預設配置檔案,可以設定預設使用的區域,預設區域為 public,對應 zones目錄下的public.xml。
2.1.3 常用配置命令及案例
- 檢視當前使用的區域
[root@heimatengyun ~]# firewall-cmd --get-default-zone
public
- 檢視當前使用的區域是否允許請求ssh和https協議的流量
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=https
no
- 設定https協議流量為永久允許並立即生效
[root@heimatengyun ~]# firewall-cmd --zone=public --add-service=https
success
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=https
yes
[root@heimatengyun ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@heimatengyun ~]# firewall-cmd --reload
success
- 允許8080和8081埠流量,僅限當前生效
[root@heimatengyun ~]# firewall-cmd --zone=public --list-ports
[root@heimatengyun ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@heimatengyun ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
2.2 firewall-config
firewall-config是 firewalld 防火牆配置管理工具的 GUI(圖形使用者介面)版本,幾 乎可以實現所有以命令列來執行的操作。即使沒有紮實的 Linux 命令基 礎,也完全可以通過它來妥善配置 RHEL 7 中的防火牆策略。
2.2.1 主介面
輸入命令後,將開啟主介面
[root@heimatengyun ~]# firewall-config
頂部的Configuration對應選擇是執行模式還是永久模式。
左邊Zones選項卡對應的是不同的區域。
2.2.2 配置案例
在使用 firewall-config 工具配置完防火牆策略之後,無須進行二次確認,因為只要有修改內容,它就自動進行儲存。
- 配置允許當前區域中http服務流量且僅限當前有效
- 試新增一條防火牆策略規則,使其放行訪問 8080~8088 埠(TCP 協議)的流量, 並將其設定為永久生效
新增規則後,還需要reload讓配置的策略立即生效。
三、TCP Wrappers服務
TCP Wrappers是RHEL7系統中預設啟用的一款流量監控程式,它能夠根據來訪主機的地址與本機的目標服務程式作出允許或拒絕的操作。
前文已提到firewalld是基於TCP/IP 協議的流量過濾工具,而 TCP Wrappers 服務則是能允許或 禁止 Linux 系統提供服務的防火牆,從而在更高層面保護了 Linux 系統的安全執行。
TCP Wrappers 服務的防火牆策略由兩個控制列表檔案所控制,使用者可以編輯允許控制列表文 件來放行對服務的請求流量,也可以編輯拒絕控制列表檔案來阻止對服務的請求流量。
控制列表 檔案修改後會立即生效,系統將會先檢查允許控制列表檔案(/etc/hosts.allow),如果匹配到相應 的允許策略則放行流量;如果沒有匹配,則去進一步匹配拒絕控制列表檔案(/etc/hosts.deny),若 找到匹配項則拒絕該流量。如果這兩個檔案全都沒有匹配到,則預設放行流量。
3.1 配置原則
編寫拒絕策略規則時,填寫的是服務名稱,而非協議名稱;
建議先編寫拒絕策略規則,再編寫允許策略規則。
3.2 常用配置引數
TCP Wrappers服務的控制列表檔案中常用的引數如下表:
客戶端型別 | 示例 | 滿足條件的客戶端列表 |
---|---|---|
單一主機 | 192.168.1.1 | ip地址為192.168.1.1的主機 |
指定網段 | 192.168.1. | ip段為192.168.1.0/24的主機 |
指定網段 | 192.168.10.0/255.255.255.0 | IP 段為 192.168.10.0/24 的主機 |
指定 DNS 字尾 | .heimatengyun.com | 所有後綴為.heimatengyun.com的主機 |
指定主機名稱 | www.heimatengyun.com | 主機名稱為www.heimatengyun.com的主機 |
指定所有客戶端 | ALL或* | 所有主機全部包括在內 |
3.3 案例
- 配置指定ip能遠端登入到伺服器
編輯hosts.deny檔案
[root@heimatengyun ~]# vi /etc/hosts.deny
新增:sshd:* 儲存並退出。
此時退出遠端連線工具,再次遠端連線,將無法連線進去。
直接登入虛擬機器,並編輯/etc/hosts.allow檔案,允許本地電腦的ip能遠端連線伺服器。
[root@heimatengyun ~]# vi /etc/hosts.allow
新增:sshd:192.168.78. 儲存並退出
注意此處的192.168.78. 為你將訪問linux的ip地址,根據實際情況進行設定。本文演示的環境中取的是VMnet8的ip地址,而不是宿主機的ip。
然後再次用遠端連線工具,發現可以連線上了