Linux網絡服務之firewalld防火牆
1.前言
上一篇文章中(Linux防火牆)我們主要介紹了防火牆的概念,主要針對軟件防火牆(Linux防火牆)進行詳細介紹。本文主要將對Centos7系統中的firewalld防火牆進行相關闡述。
2.firewalld防火牆與iptables防火牆聯繫與區別
firewalld防火牆是Centos7版本系統默認的防火牆管理工具,取代了iptables防火牆,與iptables防火牆一樣也屬於典型的包過濾防火牆或稱之爲網絡層防火牆,都屬於用戶態(又稱用戶空間(User Space)),內部結構都指向netfilter這一強大的網絡過濾子系統(屬於內核態),用以實現包過濾防火牆的功能。
主要區別如下:
Firewalld | iptables | |
---|---|---|
配置文件 | /etc/firewalld/、/usr/lib/firewalld/ | /etc/sysconfig/iptables |
對規則的修改 | 不需要全部刷新策略,不丟失現行連接 | 需要全部刷新策略,丟失連接 |
防火牆類型 | 動態 | 靜態 |
firewalld的優點在於支持動態更新以及加入了防火牆的“zone”概念,firewalld防火牆同時支持ipv4和ipv6地址。
本文將分別從字符管理工具和圖形化管理工具介紹firewalld防火牆。
3.區域的概念
區域 | 描述 |
---|---|
drop(丟失) | 任何接收的網絡數據包都被丟棄,沒有任何回覆。僅能有發送出去的網絡練連接 |
block(限制) | 任何接收的網絡連接都被IPv4的icmp-host-prohibited信息和icmp6-adm-prohibited信息所拒絕 |
public (公共) | 在公共區域內使用,不能相信網絡內的其他計算機不會對您的計算機造成危害,只能接收經過選取的連接 |
external (外部) | 特別是爲路由器啓用了僞裝功能的外部網。您不能信任來自網絡的其他計算,不能相信它們不會對您的計算機造成危害,只能接收經過選擇的連接 |
dmz (非軍事區) | 用於您的非軍事區內的電腦,此區域內可公開訪問,可以有限地進入您的內部網絡,僅僅接收經過選擇的連接 |
work (工作) | 用於工作區。您可以基本相信網絡內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連接用於家庭網絡。 |
home (家庭) | 您可以基本信任網絡內的其他計算機不會危害您的計算機。僅僅接收經過選擇的連接 |
internal (內部) | 用於內部網絡。您可以基本上信任網絡內的其他計算機不會危害您的計算機。僅僅接受經過選擇的連接 |
trusted (信任) | 可接受所有的網絡連接 |
4.Firewalld網絡區域
區域介紹
(1)區域如同進入主機的安全門,每個區域都具有不同限制程度的規則
(2)可以使用一個人或多個區域,但是任何一個活躍區域至少需要關聯源地址或接口
(3)默認情況下,public區域是默認區域,包含所有接口(網卡)
Firewalld數據處理流程
檢查數據來源的源地址
(1)若源地址關聯到特定的區域,則執行該區域所指定的規則
(2)若源地址未關聯到特定的區域,則使用傳入網絡接口的區域並執行該區域所指定的規則。
(3)若網絡接口未關聯到特定的區域,則使用默認區域並執行該區域所指定的規則
5.Firewalld防火牆的配置方法
運行時配置
(1)實時生效,並持續至Firewalld重新啓動或重新加載配置
(2)不中斷現有連接
(3)不能修改服務配置
永久配置
(1)不立即生效。除非Firewalld重新啓動或重新加載配置
(2)中斷現有連接
(3)可以修改服務配置
6.具體操作實例
Firewall-config圖形工具與Firewall-cmd命令行工具都可以對其進行設置
/etc/firewalld/中的配置文件
Firewalld會優先使用/etc/firewalld/中的配置,如果不存在配置文件則使用/usr/lib/firewalld/ 中的配置
- /etc/firewalld/ :用戶自定義配置文件,需要時可通過從/usr/ib/firewalld/中拷貝
- /usr/lib/firewalldl: 默認配置文件,不建議修改,若恢復至默認配置,可直接刪除/etc/firewalld/中的配置
[root@localhost ~]# cd /etc/firewalld/
[root@localhost firewalld]# ls
firewalld.conf icmptypes lockdown-whitelist.xml zones
helpers ipsets services
[root@localhost firewalld]# cd /usr/lib/firewalld/
[root@localhost firewalld]# ls
helpers icmptypes ipsets services xmlschema zones
1)防火牆的啓動停止查看命令
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# systemctl enable firewalld //開機自啓動
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2019-12-10 18:40:56 CST; 32s ago
Docs: man:firewalld(1)
Main PID: 53010 (firewalld)
CGroup: /system.slice/firewalld.service
└─53010 /usr/bin/python -Es /usr/sbin/firewalld --nofork --no...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
12月 10 18:40:56 localhost.localdomain firewalld[53010]: WARNING: COMMA...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# firewall-cmd --state //cmd設置
running
root@localhost ~]# systemctl stop firewalld //停止 firewalld
[root@localhost ~]#systemctl disable firewalld //設置 firewalld 開機不自啓動
2)下面我們結合圖形化界面管理工具(firewall-config)來對照驗證使用命令行操作(firewall-cmd)
首先,我們在命令行輸入firewall-config將會彈出如下的窗口界面:
1.獲取預定義信息
firewall-cmd 預定義信息主要包括三種:可用的區域、可用的服務以及可用的 ICMP 阻塞類型,具體的查看命令如下所示。
[root@localhost ~]# firewall-cmd --get-zones //顯示預定義的區域
work drop internal external trusted home dmz public block
[root@localhost ~]# firewall-cmd --get-service //顯示預定義的服務
RH-Satellite-6 amanda-client amanda-k5-client baculabacula-client cephceph
mondhcp dhcpv6 dhcpv6-client dnsdocker-registry dropbox-lansyncfreeipa-ldap
freeipa-ldapsfreeipa-replication ftp high-availability http https imapimaps
ippipp-clientipseciscsi-target kadminkerberoskpasswdldapldapslibvirt
libvirt-tlsmdns mosh mountdms-wbtmysqlnfsntpopen***pmcdpmproxypmwebapi
pmwebapis pop3 pop3s postgresqlprivoxy proxy-dhcpptppulseaudiopuppetmaster
radiusrpc-bindrsyncd samba samba-client sane smtpsmtpssnmpsnmptrap squid ssh
synergy syslog syslog-tls telnet tftptftp-client tinc tor-socks transmission
clientvdsmvnc-serverwbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
[root@localhost ~]# firewall-cmd --get-icmptypes //顯示預定義的 ICMP 類型
destination-unreachable echo-reply echo-request parameter-problem redirect router
-advertisement router-solicitation source-quench time-exceeded timestamp-reply
timestamp-request
firewall-cmd --get-icmptypes 命令的執行結果中各種阻塞類型的含義分別如下所示。
destination-unreachable:目的地址不可達。
echo-reply:應答迴應(pong)。
parameter-problem:參數問題。
redirect:重新定向。
router-advertisement:路由器通告。
router-solicitation:路由器徵尋。
source-quench:源端抑制。
time-exceeded:超時。
timestamp-reply:時間戳應答迴應。
timestamp-request:時間戳請求。
2.區域管理
--get-default-zone 顯示網絡連接或接口的默認區域
--set-default-zone=<zone> 設置網絡連接或接口的默認區域
--get-active-zones 顯示已激活的所有區域
--get-zone-of-interface=<interface> 顯示指定接口綁定的區域
--zone=<zone> --add-interface=<interface> 爲指定接口綁定區域
--zone=<zone>
--change-interface=<interface>
爲指定的區域更改綁定的網絡接口
--zone=<zone>
--remove-interface=<interface>
爲指定的區域刪除綁定的網絡接口
--list-all-zones 顯示所有區域及其規則
[--zone=<zone>] --list-all 顯示所有指定區域的所有規則,省略--zone=<zone>時表示僅
對默認區域操作
具體操作如下所示。
(1)顯示當前系統中的默認區域。
[root@localhost ~]# firewall-cmd --get-default-zone
public
(2)顯示默認區域的所有規則。
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
(3)顯示網絡接口 ens33 對應區域。
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
public
(4)將網絡接口 ens33 對應區域更改爲 internal 區域。
[root@localhost ~]# firewall-cmd --zone=internal --change-interface=ens33
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[root@localhost ~]# firewall-cmd --zone=internal --list-interfaces
ens33
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
internal
(5)顯示所有激活區域。
[root@localhost ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33
4)服務管理
爲 了 方 便 管 理 , firewalld 預 先 定 義 了 很 多 服 務 , 存 放 在
/usr/lib/firewalld/services/ 目錄中,服務通過單個的 XML 配置文件來指定。這些配置文件則按以下格式命名:service-name.xml,每個文件對應一項具體的網絡服務,如 ssh 服
務等。與之對應的配置文件中記錄了各項服務所使用的 tcp/udp 端口。在最新版本的
firewalld 中默認已經定義了 70 多種服務供我們使用,對於每個網絡區域,均可以配置允
許訪問的服務。當默認提供的服務不適用或者需要自定義某項服務的端口時,我們需要將
service 配置文件放置在 /etc/firewalld/services/ 目錄中。service 配置具有以下優點。
Ø 通過服務名字來管理規則更加人性化。
Ø 通過服務來組織端口分組的模式更加高效,如果一個服務使用了若干個網絡端口,則服
務的配置文件就相當於提供了到這些端口的規則管理的批量操作快捷方式。
表 1-3 列出了 firewall-cmd 命令區域中服務管理的常用選項說明。
表 1-3 firewall-cmd 命令區域中服務管理的常用選項說明
選項 說明
[--zone=<zone>] --list-services 顯示指定區域內允許訪問的所有服務
[--zone=<zone>] --add-service=<service> 爲指定區域設置允許訪問的某項服務
[--zone=<zone>] --remove-service=<service> 刪除指定區域已設置的允許訪問的某項服務
[--zone=<zone>] --list-ports 顯示指定區域內允許訪問的所有端口號
[--zone=<zone>]
--add-port=<portid>[-<portid>]/<protocol>
爲指定區域設置允許訪問的某個/某段端口號
(包括協議名)
[--zone=<zone>]
--remove-port=<portid>[-<portid>]/<protocol>
刪除指定區域已設置的允許訪問的端口號(包括
協議名)
[--zone=<zone>] --list-icmp-blocks 顯示指定區域內拒絕訪問的所有 ICMP 類型
[--zone=<zone>] --add-icmp-block=<icmptype> 爲指定區域設置拒絕訪問的某項 ICMP 類型
[--zone=<zone>] --remove-icmp-block=<icmptype> 刪除指定區域已設置的拒絕訪問的某項 ICMP 類
型,省略--zone=<zone>時表示對默認區域操作
具體操作如下所示。
(1)爲默認區域設置允許訪問的服務。
[root@localhost ~]# firewall-cmd --list-services
ssh dhcpv6-client //顯示默認區域內允許訪問的所有服務
[root@localhost ~]# firewall-cmd --add-service=http
//設置默認區域允許訪問 http 服務success 在圖形化界面中會發現public中HTTP服務打上了√了。
[root@localhost ~]#firewall-cmd --add-service=https
//設置默認區域允許訪問 https 服務
success
[root@localhost ~]# firewall-cmd --list-services
dhcpv6-clientssh https http
(2)爲 internal 區域設置允許訪問的服務。
[root@localhost ~]# firewall-cmd --zone=internal --add-service=mysql
//設置 internal 區域允許訪問 mysql 服務
success
[root@localhost~]#firewall-cmd --zone=internal --remove-service=samba-client
//設置 internal 區域不允許訪問 samba-client 服務
success
[root@localhost ~]# firewall-cmd --zone=internal --list-services
//顯示 internal 區域內允許訪問的所有服務
sshmdns dhcpv6-client mysql
5)端口管理
在進行服務配置時,預定義的網絡服務可以使用服務名配置,服務所涉及的端口就會自
動打開。但是,對於非預定義的服務只能手動爲指定的區域添加端口。例如,執行以下操作
即可實現在 internal 區域打開 443/TCP 端口。
[root@localhost ~]# firewall-cmd --zone=internal --add-port=443/tcp
success
若想實現在 internal 區域禁止 443/TCP 端口訪問,可執行以下命令。
[root@localhost ~]#firewall-cmd --zone=internal --remove-port=443/tcp
success
6)兩種配置模式
前面提到 firewall-cmd 命令工具有兩種配置模式:運行時模式(Runtime mode)表示
當前內存中運行的防火牆配置,在系統或 firewalld 服務重啓、停止時配置將失效;永久模
式(Permanent mode)表示重啓防火牆或重新加載防火牆時的規則配置,是永久存儲在配置
文件中的。
firewall-cmd 命令工具與配置模式相關的選項有三個。
Ø --reload:重新加載防火牆規則並保持狀態信息,即將永久配置應用爲運行時配置。
Ø --permanent:帶有此選項的命令用於設置永久性規則,這些規則只有在重新啓動
firewalld 或重新加載防火牆規則時纔會生效;若不帶有此選項,表示用於設置運行時
規則。
--runtime-to-permanent:將當前的運行時配置寫入規則配置文件中,使之成爲永久性
7.總結
本文主要講述了firewalld的相關概念與具體的配置設置,環境爲Centos7。