Linux Firewalld 基礎介紹
技術標籤:技術
網際網路上提供了各種網路服務,而防火牆可以設定各種規則來限制訪問,保護伺服器。
概述
Linux
的防火牆體系主要工作在網路層,針對TCP/IP
資料包實施過濾和限制,屬於典型的包過濾防火牆。
Linux
系統的防火牆體系基於核心編碼實現,具有非常穩定的效能和極高的效率。
三種防火牆
netfilter
- 指
linux
核心中實現包過濾防火牆的內部結構 - 屬於
核心態
的防火牆功能體系
iptables
- 指管理
linux
防火牆的命令程式 - 屬於
使用者態
的防火牆管理體系
Firewalld
CentOS 7
預設的防火牆管理工具,取代之前的iptables
防火牆- 屬於
使用者態
firewalld
和iptables
netfilter
這個強大的網路過濾子系統,以實現包過濾防火牆功能- 支援動態更新、加入防火牆
zone
概念 - 支援
IPv4
和IPv6
地址 - 字元管理工具
firewall-cmd
和圖形化管理工具firewall-config
區別
名稱 | Firewalld | iptables |
---|---|---|
配置檔案 | /usr/lib/firewalld/和/etc/firewalld/ | /etc/sysconfig/iptables |
對規則的修改 | 不需要全部重新整理策略,不丟失現行連線 | 需要全部重新整理策略,丟失連線 |
防火牆型別 | 動態防火牆 | 靜態防火牆 |
網路區域
區域介紹
區域 | 描述 |
---|---|
drop (丟棄) | 任何接收的網路資料包都被丟棄,沒有任何回覆。僅能有傳送出去的網路連線 |
block (限制) | 任何接收的網路連線都被IPv4 的icmp-host-prohibited 資訊和IPv6 的icmp6-adm-prohibited 資訊所拒絕 |
public (公共) | 在公共區域內使用,不能相信網路內的其他計算機不會對您的計算機造成危害,只能接收經過選取的連線 |
external (外部) | 特別是為路由器啟用了偽裝功能的外部網。您不能信任來自網路的其他計算,不能相信它們不會對您的計算機造成危害,只能接收經過選擇的連線 |
dmz (非軍事區) | 用於您的非軍事區內的電腦,此區域內可公開訪問,可以有限地進入您的內部網路,僅僅接收經過選擇的連線 |
work (工作) | 用於工作區。您可以基本相信網路內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連線 |
home (家庭) | 用於家庭網路。您可以基本信任網路內的其他計算機不會危害您的計算機。僅僅接收經過選擇的連線 |
internal (內部) | 用於內部網路。您可以基本上信任網路內的其他計算機不會威脅您的計算機。僅僅接受經過選擇的連線 |
trusted (信任) | 可接受所有的網路連線 |
- 每個區域都具有不同限制程度的規則
- 可以使用一個或多個區域,但是任何一個活躍區域至少需要關聯源地址或介面
- 預設情況下,public區域是預設區域,包含所有介面(網絡卡)
資料處理流程
檢查資料來源的源地址
- 若源地址關聯到特定的區域,則執行該區域所指定的規則
- 若源地址未關聯到特定的區域,則使用傳入網路介面的區域並執行該區域所指定的規則
- 若網路介面未關聯到特定的區域,則使用預設區域並執行該區域所指定的規則
配置方法
執行時配置
- 實時生效,並持續至
Firewalld
重新啟動或重新載入配置 - 不中斷現有連線
- 不能修改服務配置
永久配置
- 不立即生效,除非
Firewalld
重新啟動或重新載入配置 - 中斷現有連線
- 可以修改服務配置
配置檔案
Firewalld
會優先使用/etc/firewalld/
中的配置,如果不存在配置檔案,則使用/usr/ib/firewalld/
中的配置
-
/etc/firewalld/
:使用者自定義配置檔案,需要時可通過從/usr/ib/firewalld/
中拷貝 -
/usr/ib/firewalld/
:預設配置檔案,不建議修改,若恢復至預設配置,可直接刪除/etc/firewalld/
中的配置
圖形工具
[[email protected] ~]# firewall-config
命令列工具
[[email protected] ~]# firewall-cmd 命令
- 以下是整理的一些命令
--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>
為指定的區域刪除繫結的網路介面
--query-interface=<interface>
查詢區域中是否包含某介面
--list-all-zones
顯示所有區域及其規則
[--zone=<zone>] --list-all
顯示所有指定區域的所有規則
[--zone=<zone>] --list-services
顯示指定區域內允許訪問的所有服務
[--zone=<zone>] --add-service=<service>
為指定區域設定允許訪問的某項服務
[--zone=<zone>] --remove-service=<service>
刪除指定區域已設定的允許訪問的某項服務
[--zone=<zone>] --query-service=<service>
查詢指定區域中是否啟用了某項服務
[--zone=<zone>] --list-ports
顯示指定區域內允許訪問的所有埠號
[--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]
啟用區域埠和協議組合,可選配置超時時間
[--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
禁用區域埠和協議組合
[--zone=<zone>] --query-port=<port>[-<port>]/<protocol>
查詢區域中是否啟用了埠和協議組合
[--zone=<zone>] --list-icmp-blocks
顯示指定區域內阻塞的所有ICMP型別
[--zone=<zone>] --add-icmp-block=<icmptype>
為指定區域設定阻塞的某項ICMP型別
[--zone=<zone>] --remove-icmp-block=<icmptype>
刪除指定區域已阻塞的某項ICMP型別
[--zone=<zone>] --query-icmp-block=<icmptype>
查詢指定區域的ICMP阻塞功能
firewall-cmd
狀態操作
- 停止、啟動
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl start firewalld
- 禁止/允許開機啟動
[[email protected] ~]# systemctl disable firewalld
[[email protected] ~]# systemctl enable firewalld
- 檢視狀態
[[email protected] ~]# systemctl status firewalld
[[email protected] ~]# firewall-cmd --state
running
獲取預定義資訊
預定義資訊主要包括三種:可用的區域、可用的服務以及可用的
ICMP
阻塞型別
- 顯示預定義的區域
[[email protected] ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
- 顯示預定義的服務
[[email protected] ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openv*n ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
- 顯示預定義的
icmp
阻塞型別
[[email protected] ~]# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
- 各種阻塞型別的含義分別如下所示:
destination-unreachable
:目的地址不可達。echo-reply
:應答迴應(pong)。parameter-problem
:引數問題。redirect
:重新定向。router-advertisement
:路由器通告。router-solicitation
:路由器徵尋。source-quench
:源端抑制。time-exceeded
:超時。timestamp-reply
:時間戳應答迴應。timestamp-request
:時間戳請求。
區域管理
使用
firewall-cmd
命令可以實現獲取和管理區域,為指定區域繫結網路介面等功能。
--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>時表示僅對預設區域操作
- 顯示當前系統中的預設區域
[[email protected] ~]# firewall-cmd --get-default-zone
public
- 顯示預設區域的所有規則
[[email protected] ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 顯示網路介面
ens33
對應的區域
[[email protected] ~]# firewall-cmd --get-zone-of-interface=ens33
public
- 將網路介面
ens33
對應區域改為internal
區域
[[email protected] ~]# firewall-cmd --zone=internal --change-interface=ens33
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[[email protected] ~]# firewall-cmd --get-zone-of-interface=ens33
internal
- 顯示
internal
區域下有哪些網路介面
[[email protected] ~]# firewall-cmd --zone=internal --list-interfaces
ens33
- 顯示所有已啟用的區域
[[email protected] ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33
服務管理
為了方便管理,firewalld
預先定義了很多服務,存放在/usr/lib/firewalld/services/
目錄中,服務通過單個的XML
配置檔案來指定。
這些配置檔案則按以下格式命名:service-name.xml
,每個檔案對應一項具體的網路服務,如ssh
服務等。
與之對應的配置檔案中記錄了各項服務所使用的tcp/udp
埠。在最新版本的firewalld
中預設已經定義了70
多種服務供我們使用,對於每個網路區域,均可以配置允許訪問的服務。
當預設提供的服務不適用或者需要自定義某項服務的埠時,我們需要將service
配置檔案放置在/etc/firewalld/services/
目錄中。
service
配置具有以下優點。
- 通過服務名字來管理規則更加人性化。
- 通過服務來組織埠分組的模式更加高效,如果一個服務使用了若干個網路埠,則服務的配置檔案就相當於提供了到這些埠的規則管理的批量操作快捷方式。
[--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>時表示對預設區域操作
- 顯示預設區域允許訪問的所有服務
[[email protected] ~]# firewall-cmd --list-services
ssh dhcpv6-client
- 設定預設區域允許訪問
http
服務
[[email protected] ~]# firewall-cmd --add-service=http
success
- 設定預設區域允許訪問
https
服務
[[email protected] ~]# firewall-cmd --add-service=https
success
- 顯示預設區域允許訪問的所有服務
[[email protected] ~]# firewall-cmd --list-services
ssh dhcpv6-client http https
- 顯示
internal
區域內允許訪問的所有服務
[[email protected] ~]# firewall-cmd --zone=internal --list-services
ssh mdns samba-client dhcpv6-client
- 設定
internal
區域允許訪問mysql
服務
[[email protected] ~]# firewall-cmd --zone=internal --add-service=mysql
success
- 設定
internal
區域不允許訪問samba-client
服務
[[email protected] ~]# firewall-cmd --zone=internal --remove-service=samba-client
success
- 顯示
internal
區域內允許訪問的所有服務
[[email protected] ~]# firewall-cmd --zone=internal --list-services
ssh mdns dhcpv6-client mysql
埠管理
在進行服務配置時,預定義的網路服務可以使用服務名配置,服務所涉及的埠就會自動開啟。
但是,對於非預定義的服務只能手動為指定的區域新增埠。
- 在
internal
區域開啟443/TCP
埠
[[email protected] ~]# firewall-cmd --zone=internal --add-port=443/tcp
success
- 在
internal
區域禁止443/TCP
埠訪問
[[email protected] ~]# firewall-cmd --zone=internal --remove-port=443/tcp
success
兩種配置模式
前面提到firewall-cmd
命令工具有兩種配置模式:
- 執行時模式
Runtime mode
表示當前記憶體中執行的防火牆配置,在系統或firewalld
服務重啟、停止時配置將失效。 - 永久模式
Permanent mode
表示重啟防火牆或重新載入防火牆時的規則配置,是永久儲存在配置檔案中的。
firewall-cmd
命令工具與配置模式相關的選項有三個。
-
--reload
:重新載入防火牆規則並保持狀態資訊,即將永久配置應用為執行時配置。 -
--permanent
:帶有此選項的命令用於設定永久性規則,這些規則只有在重新啟動firewalld
或重新載入防火牆規則時才會生效;若不帶有此選項,表示用於設定執行時規則。 -
--runtime-to-permanent
:將當前的執行時配置寫入規則配置檔案中,使之成為永久性。
[[email protected] ~]# firewall-cmd --runtime-to-permanent
success