firewalld動態防火牆管理-centos7.5技能
firewalld動態防火牆管理
前言:防火牆是 Linux 系統的主要的安全工具,可以提供基本的安全防護,在 Linux 歷史上已經使用過的防火牆工具包括:ipfwadm、ipchains、iptables。在 Firewalld 中新引入了區域(Zones)這個概念。本文介紹一下使用最新版本的 firewalld 構建動態防火牆的方法和使用技巧。
firewalld 簡介
firewalld 提供了支援網路 / 防火牆區域 (zone) 定義網路連結以及介面安全等級的動態防火牆管理工具。它支援 IPv4, IPv6 防火牆設定以及乙太網橋接,並且擁有執行時配置和永久配置選項。它也支援允許服務或者應用程式直接新增防火牆規則的介面。以前的 iptables 防火牆是靜態的,每次修改都要求防火牆完全重啟。這個過程包括核心 netfilter 防火牆模組的解除安裝和新配置所需模組的裝載等。而模組的解除安裝將會破壞狀態防火牆和確立的連線。現在 firewalld 可以動態管理防火牆,firewalld 把 Netfilter 的過濾功能於一身見圖 1。
圖 1 核心中的防火牆 firewalld 守護程序
firewalld 主要功能
實現動態管理,對於規則的更改不再需要重新建立整個防火牆。
一個簡單的系統托盤區圖示來顯示防火牆狀態,方便開啟和關閉防火牆。
提供 firewall-cmd 命令列介面進行管理及配置工作。
為 libvirt 提供介面及介面,會在必須的 PolicyKit 相關許可權完成的情況下實現。
實現 firewall-config 圖形化配置工具。
實現系統全域性及使用者程序的防火牆規則配置管理。
區域支援。
firewalld 防火牆堆疊示意圖見圖 2,iptables 服務在 /etc/sysconfig/iptables 中儲存配置,而 firewalld 將配置儲存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各種 XML 檔案裡,使用 iptables 的時候每一個單獨更改意味著清除所有舊有的規則和從 /etc/sysconfig/iptables 裡讀取所有新的規則,使用 firewalld 卻不會再建立任何新的規則;僅僅執行規則中的不同。因此 firewalld 可以在執行時改變設定而不丟失現行配置。圖 5 是 firewalld 防火牆堆疊示意圖。
圖 2 firewalld 防火牆堆疊示意圖
firewalld 的基本命令列操作
安裝軟體包
yum install firewalld firewall-config
啟動服務
systemctl enable firewalld.service
systemctl start firewalld.service
檢視防火牆狀態
systemctl status firewalld
區域管理
網路區域簡介
通過將網路劃分成不同的區域(通常情況下稱為 zones),制定出不同區域之間的訪問控制策略來控制不同任程度區域間傳送的資料流。例如網際網路是不可信任的區域,而內部網路是高度信任的區域。以避免安全策略中禁止的一些通訊。它有控制資訊基本的任務在不同信任的區域。典型信任的區域包括網際網路 ( 一個沒有信任的區域 ) 和一個內部網路 ( 一個高信任的區域 )。最終目標是提供受控連通性在不同水平的信任區域通過安全政策的執行和連通性模型之間根據最少特權原則。例如:公共 WIFI 網路連線應該不信任,而家庭有線網路連線就應該完全信任。網路安全模型可以在安裝、初次啟動和首次建立網路連線時選擇初始化。該模型描述了主機所聯的整個網路環境的可信級別,並定義了新連線的處理方式。在 /etc/firewalld/ 的區域設定是一系列可以被快速執行到網路介面的預設定。有幾種不同的初始化區域:
drop(丟棄)
任何接收的網路資料包都被丟棄,沒有任何回覆。僅能有傳送出去的網路連線。
block(限制)
任何接收的網路連線都被 IPv4 的 icmp-host-prohibited 資訊和 IPv6 的 icmp6-adm-prohibited 資訊所拒絕。
public(公共)
在公共區域內使用,不能相信網路內的其他計算機不會對您的計算機造成危害,只能接收經過選取的連線。
external(外部)
特別是為路由器啟用了偽裝功能的外部網。您不能信任來自網路的其他計算,不能相信它們不會對您的計算機造成危害,只能接收經過選擇的連線。
dmz(非軍事區)
用於您的非軍事區內的電腦,此區域內可公開訪問,可以有限地進入您的內部網路,僅僅接收經過選擇的連線。
work(工作)
用於工作區。您可以基本相信網路內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連線。
home(家庭)
用於家庭網路。您可以基本信任網路內的其他計算機不會危害您的計算機。僅僅接收經過選擇的連線。
internal(內部)
用於內部網路。您可以基本上信任網路內的其他計算機不會威脅您的計算機。僅僅接受經過選擇的連線。
trusted(信任)
可接受所有的網路連線。
說明:firewalld 的預設區域是 public。
顯示支援的區域列表
firewall-cmd --get-zones
block drop work internal external home dmz public trusted
設定為家庭區域
firewall-cmd --set-default-zone=home
檢視當前的區域
#firewall-cmd --get-active-zones
設定當前的區域的介面
#firewall-cmd --get-zone-of-interface=enp03s
顯示所有公共區域(public)
firewall-cmd --zone=public --list-all
臨時修改網路介面 enp0s3 為 內部區域(internal)
firewall-cmd --zone=internal --change-interface=enp03s
永久修改網路介面 enp0s3 為 內部區域(internal)
firewall-cmd --permanent --zone=internal --change-interface=enp03s
服務管理
顯示服務列表
amanda 、ftp 、samba 和 tftp 等最重要的服務已被 Firewalld 提供相應的服務,可以使用命令檢視:
firewall-cmd --get-services
cluster-suite pop3s bacula-client smtp ipp radius bacula ftp mdns samba dhcpv6-client https open*** imaps samba-client http dns telnet libvirt ssh ipsec ipp-client amanda-client tftp-client nfs tftp libvirt-tls
允許 ssh 服務通過
firewall-cmd --enable service=ssh
禁止 ssh 服務通過
firewall-cmd --disable service=ssh
臨時允許 samba 服務通過 600 秒
firewall-cmd --enable service=samba --timeout=600
顯示當前服務
firewall-cmd --list-services dhcpv6-client ssh
新增 http 服務到內部區域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload
將一個服務加入到分割槽
要把一個服務加入到分割槽,例如允許 SMTP 接入工作區:
firewall-cmd --zone=work --add-service=smtp
firewall-cmd --reload
從一個分割槽移除服務,要從分割槽移除服務,比如從工作區移除 SMTP:
firewall-cmd --zone=work --remove-service=smtp
firewall-cmd --reload
埠管理
開啟埠
開啟 443/tcp 埠在內部區域(internal):
firewall-cmd --zone=internal --add-port=443/tcp
firewall-cmd – reload
埠轉發
firewall-cmd --zone=external --add-masquerade
firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3777
上面的兩個命令的意思是,首先啟用偽裝(masquerade),然後把外部區域(external)的 22 埠轉發到 3777。
直接介面設定 firewalld 有一個被稱為“direct interface”(直接介面),它可以直接通過 iptables、ip6tables 和 ebtables 的規則。它適用於應用程式,而不是使用者。firewalld 保持對所增加專案的追蹤,所以它還能質詢 firewalld 和發現由使用直接埠模式的程式造成的更改。直接埠由增加 --direct 選項到 firewall-cmd 命令來使用。直接埠模式適用於服務或者程式,以便在執行時間內增加特定的防火牆規則。這些規則不是永久性的,它們需要在每次通過 D-BU S 從 firewalld 接到啟動、重新啟動和重新載入資訊後運用。例如新增埠 tcp 9999 埠。
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
firewall-cmd --reload
給複雜防火牆規則配置富規則(Rich Language)
通過“rich language”語法,可以用比直接介面方式更易理解的方法建立複雜防火牆規則。此外還能永久保留設定。這種語言可以用來配置分割槽,也仍然支援現行的配置方式。所有命令都必須以 root 使用者身份執行。增加一項規則的命令格式如下:
#firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout 9=seconds]
移除一項規則:
#firewall-cmd [--zone=zone] --remove-rich-rule='rule'
檢查一項規則是否存在:
#firewall-cmd [--zone=zone] --query-rich-rule='rule'
一個具體例子,假設在一個 IP 地址(192.168.0.0)的伺服器配置防火牆允許如下服務 http, https, vnc-server, PostgreSQL。
程式碼:
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' --permanent
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="https" accept'
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="https" accept' --permanent
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="vnc-server" accept'
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="vnc-server" accept' --permanent
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="postgresql" accept'
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="postgresql" accept' –permanent
firewall-cmd --reload
在防火牆配置檔案中建立自己的服務
首先假設這裡筆者需要建立的服務是 RTMP(RTMP 是 Real Time Messaging Protocol(實時訊息傳輸協議)的首字母縮寫。該協議基於 TCP)埠號 1935。在 /etc/firewalld/services/ 目錄中,利用現有的配置檔案如 nfs.xml 作為模板。
cd /etc/firewalld/services/
說明:該目錄中存放的是定義好的網路服務和埠引數,只用於參考,不能修改。這個目錄中只定義了一部分通用網路服務。在該目錄中沒有定義的網路服務,也不必再增加相關 xml 定義,後續通過管理命令可以直接增加。
cp /usr/lib/firewalld/services/nfs.xml /etc/firewalld/services/
說明:從上面目錄中將需要使用的服務的 xml 檔案拷至這個目錄中,如果埠有變化則可以修改檔案中的數值。
cd /etc/firewalld/services/ 下面修改 nfs.xml 為 rtmp.xml
#mv nfs.xml rtmp.xml 下面使用 vi 編輯器修改 rtmp.xml 檔案為如下內容
清單 1. rtmp.xml 檔案內容
rtmp services
RTMP Stream
每一個服務定義都需要一個簡短的名字、描述和埠網路用於指定需要使用的協議、埠和模組名。然後把此服務加入防火牆規則中。
firewall-cmd --add-service=rtmp
firewall-cmd --add-service=rtmp –permanent
firewall-cmd --reload
關閉 firewalld 服務