Linux 中的 15 個(gè)強(qiáng)大的 firewall-cmd 命令,牛牛牛!

企業(yè)中,因?yàn)闃I(yè)務(wù)的重要性,通常會(huì)對(duì)網(wǎng)絡(luò)安全十分重視,那么一個(gè)好的防火墻系統(tǒng)就是強(qiáng)有力的利器!
本文,將帶大家了解 CentOS 7新的防火墻服務(wù)firewalld的基本原理,它有個(gè)非常強(qiáng)大的過(guò)濾系統(tǒng),稱(chēng)為 Netfilter,它內(nèi)置于內(nèi)核模塊中,用于檢查穿過(guò)系統(tǒng)的每個(gè)數(shù)據(jù)包。
這意味著它可以在到達(dá)目的地之前以編程方式檢查、修改、拒絕或丟棄任何網(wǎng)絡(luò)數(shù)據(jù)包,如傳入、傳出或轉(zhuǎn)發(fā),從 Centos-7 開(kāi)始,firewalld 成為管理基于主機(jī)的防火墻服務(wù)的默認(rèn)工具,firewalld 的守護(hù)進(jìn)程是從 firewalld 包安裝的,它將在操作系統(tǒng)的所有基本安裝上可用,但在最小安裝上不可用。
使用 FirewallD 優(yōu)于“iptables”的優(yōu)點(diǎn):
在運(yùn)行時(shí)所做的任何配置更改都不需要重新加載或重新啟動(dòng) firewalld 服務(wù)
通過(guò)將整個(gè)網(wǎng)絡(luò)流量安排到區(qū)域中來(lái)簡(jiǎn)化防火墻管理
每個(gè)系統(tǒng)可以設(shè)置多個(gè)防火墻配置以更改網(wǎng)絡(luò)環(huán)境
使用 D-Bus 消息系統(tǒng)來(lái)交互/維護(hù)防火墻設(shè)置
在 CentOS 7 或更高版本中,我們?nèi)匀豢梢允褂媒?jīng)典的 iptables,如果要使用 iptables,需要停止并禁用 firewalld 服務(wù)。同時(shí)使用firewalld 和 iptables會(huì)使系統(tǒng)混亂,因?yàn)樗鼈儽舜瞬患嫒荨?/p>
建議使用 firewalld 來(lái)管理防火墻服務(wù),除非我們有一些特定的理由繼續(xù)使用經(jīng)典的 iptables。
Firewalld 設(shè)計(jì)了強(qiáng)大的過(guò)濾系統(tǒng),并且在處理防火墻管理方面也更加靈活。為了利用這種設(shè)計(jì),firewalld 將傳入流量分類(lèi)到源地址定義的接口上的區(qū)域中。
每個(gè)區(qū)域都旨在根據(jù)指定的標(biāo)準(zhǔn)管理流量。如果沒(méi)有進(jìn)行任何修改,默認(rèn)區(qū)域?qū)⒃O(shè)置為 public,并且關(guān)聯(lián)的網(wǎng)絡(luò)接口將附加到 public。
所有預(yù)定義的區(qū)域規(guī)則都存儲(chǔ)在兩個(gè)位置:系統(tǒng)指定的區(qū)域規(guī)則在“/usr/lib/firewalld/zones/
”下,用戶指定的區(qū)域規(guī)則在/etc/firewalld/zones/
下。如果在系統(tǒng)區(qū)域配置文件中進(jìn)行了任何修改,它將自動(dòng)復(fù)制到 /etc/firewalld/zones/
。
本文將詳細(xì)介紹firewalld 服務(wù)基礎(chǔ)知識(shí),了解如何在 RHEL/CentOS 7 中使用 firewall-cmd 命令。
本文目錄如下:
安裝并啟用firewallD服務(wù)
區(qū)域
1.如何查看firewalld中的所有可用區(qū)域?
2. 如何找出哪個(gè)是默認(rèn)區(qū)域?
3. 如何查找活動(dòng)區(qū)域和相關(guān)網(wǎng)絡(luò)接口的列表?
4. 如何查看活動(dòng)公共區(qū)域是否有任何規(guī)則列出?
5. 如何查看所有可用區(qū)域的列表?
6. 如何將默認(rèn)區(qū)域更改為特定區(qū)域?
7. 如何將網(wǎng)絡(luò)接口從一個(gè)區(qū)域更改為另一個(gè)區(qū)域?
8. 如何建立自定義的firewalld zone?
服務(wù)
1.如何列出firewalld中所有可用的服務(wù)?
2. ?如何列出特定區(qū)域內(nèi)的所有可用服務(wù)?
3. 如何將現(xiàn)有服務(wù)添加到默認(rèn)區(qū)域?
firewalld兩種模式
1. 如何永久添加服務(wù)?
2. 如何將我的運(yùn)行時(shí)設(shè)置遷移到永久設(shè)置?
端口
1. 如何在公共區(qū)域?yàn)閟amba服務(wù)開(kāi)放端口?
超時(shí)
前置條件:
操作系統(tǒng):CentOS 7 或更高版本
軟件包:firewalld
用戶帳戶:root 用戶或具有 sudo 權(quán)限的用戶帳戶
建議使用 sudo 權(quán)限而不是 root 來(lái)運(yùn)行所有管理命令
有三種方式配置防火墻:
在“
/etc/firewalld
”配置文件中直接編輯圖形界面“firewall-config”工具
終端中的命令行“firewall-cmd”
注意:本文我們將只關(guān)注“firewall-cmd”命令。
安裝并啟用firewallD服務(wù)
首先,更新包的最新當(dāng)前版本。
sudo?yum?update?-y
Firewalld在 CentOS 7 的所有基本安裝上可用,但在最小安裝上不可用,在這種情況下,我們可以使用以下命令進(jìn)行安裝:
$?sudo?yum?install?firewalld?-y
使用以下命令啟動(dòng)和啟用服務(wù)
$?sudo?systemctl?start?firewalld.service
$?sudo?systemctl?啟用?firewalld.service
使用以下命令驗(yàn)證防火墻服務(wù)的狀態(tài):
$?sudo?firewall-cmd?--state
Output:
running$?sudo?systemctl?status?firewalld
詳細(xì)輸出:
firewalld.service?-?firewalld?-?dynamic?firewall?daemon
Loaded:?loaded?(/usr/lib/systemd/system/firewalld.service;?enabled)
Active:?active?(running)?since?Sat?2020-04-18?22:39:56?IST;?2h?52min?ago
Main?PID:?759?(firewalld)
CGroup:?/system.slice/firewalld.service
└─759?/usr/bin/python?-Es?/usr/sbin/firewalld?--nofork?--nopid
Apr?18?22:39:56?localhost.localdomain?systemd[1]:?Started?firewalld?-?dynamic...
提示:有些行被省略,使用 -l 顯示完整。
區(qū)域
Firewalld 為不同的目的引入了幾個(gè)預(yù)定義的區(qū)域和服務(wù),主要目的之一是更輕松地處理 firewalld 管理。
基于這些區(qū)域和服務(wù),我們可以阻止任何形式的系統(tǒng)傳入流量,除非它明確允許在區(qū)域中使用一些特殊規(guī)則。
1.如何查看firewalld中的所有可用區(qū)域?
$?sudo?firewall-cmd?--get-zones

這是 firewalld 中的默認(rèn)預(yù)定義區(qū)域
2. 如何找出哪個(gè)是默認(rèn)區(qū)域?
$?firewall-cmd?--get-default-zone
Output:
public
根據(jù)上面的輸出,可以看到公共區(qū)域被標(biāo)記為默認(rèn)區(qū)域,我們可以根據(jù)我們的要求更改它,我們將在接下來(lái)的例子中進(jìn)一步討論。
3. 如何查找活動(dòng)區(qū)域和相關(guān)網(wǎng)絡(luò)接口的列表?
$?firewall-cmd?--get-active-zones
Output:
public
interfaces:?enp1s0
在上面的輸出中,您可以看到公共區(qū)域處于活動(dòng)狀態(tài)并與“enp1s0”網(wǎng)絡(luò)接口相關(guān)聯(lián),如果沒(méi)有任何接口未指定給特定區(qū)域,它將自動(dòng)附加到默認(rèn)區(qū)域。
4. 如何查看活動(dòng)公共區(qū)域是否有任何規(guī)則列出?
$?sudo?firewall-cmd?--list-all?--zone="public"

上面的輸出顯示公共區(qū)域處于活動(dòng)狀態(tài)并設(shè)置為默認(rèn)值,網(wǎng)絡(luò)接口“enp1so”與活動(dòng)區(qū)域相關(guān)聯(lián),在此區(qū)域中,dhcpv6-client 和 ssh 被允許通過(guò)防火墻服務(wù)。
5. 如何查看所有可用區(qū)域的列表?
$?sudo?firewall-cmd?--list-all-zones
與前面的例子類(lèi)似,這里也會(huì)分別列出每個(gè)可用區(qū)域的詳細(xì)配置頁(yè)面,請(qǐng)自行檢查,因?yàn)檩敵隽斜頃?huì)很長(zhǎng)。
6. 如何將默認(rèn)區(qū)域更改為特定區(qū)域?
在更改到新區(qū)域之前,讓我們檢查現(xiàn)有的可用區(qū)域。
$?sudo?firewall-cmd?--get-default-zone
Output:
public
在輸出中,可以看到公共區(qū)域設(shè)置為默認(rèn)區(qū)域,現(xiàn)在讓我們嘗試將區(qū)域從公共更改為工作。
$?sudo?firewall-cmd?--set-default-zone=work
Output:
success
如您所見(jiàn),上述命令的輸出是成功的,讓我們驗(yàn)證一下。
$?sudo?firewall-cmd?--get-default-zone
Output:
work??????<==
7. 如何將網(wǎng)絡(luò)接口從一個(gè)區(qū)域更改為另一個(gè)區(qū)域?
如果系統(tǒng)有兩個(gè)網(wǎng)絡(luò)接口,比如“enp1s0 和 enp1s1”,默認(rèn)情況下,所有接口都將被分配到默認(rèn)區(qū)域,通過(guò)使用以下命令可以將接口更改為另一個(gè)區(qū)域。
$?sudo?firewall-cmd?--zone=internal?--change-interface=enp1s1
可以使用以下命令進(jìn)行驗(yàn)證:
$?sudo?firewall-cmd?--get-active-zones
8. 如何建立自定義的firewalld zone?
我們知道,所有系統(tǒng)指定的配置文件都位于“/usr/lib/firewalld/zones
”,用戶指定的文件位于“/etc/firewalld/zones
”。
使用以下命令創(chuàng)建自定義區(qū)域文件允許使用端口號(hào) 80 和 22 的 ssh 和 apache 服務(wù)。
確保新文件應(yīng)以 .xml 格式保存在用戶定義的位置,目前,名稱(chēng)區(qū)域文件的長(zhǎng)度僅限于 17 個(gè)字符。
$?sudo?vi?/etc/firewalld/zones/?linuxtecksecure?.xml
<?xml?version="1.0"?encoding="utf-8"?>
<zone>
<short>linuxtecksecure</short>
<description>用于企業(yè)領(lǐng)域。</description>
<service?name="apache"/>
<service?name="ssh"/>
<port?protocol="tcp"?port="80"/>
<port?protocol="tcp"?port="22"/>
</zone>
保存并退出。
重新加載防火墻服務(wù):
$?sudo?firewall-cmd?--reload
Output:
success
現(xiàn)在,重新檢查 firewalld 中的可用區(qū)域
$?sudo?firewall-cmd?--get-zones
Output:
block?dmz?drop?external?home?internal?"linuxtecksecure"?public?trusted?work
使用上面的命令,我們可以創(chuàng)建一個(gè)新的 (linuxtecksecure) zone 來(lái)默認(rèn)僅啟用 apache 和 ssh 服務(wù),創(chuàng)建文件后,我們需要“重新加載”firewalld 服務(wù),以便將區(qū)域激活到firewalld
請(qǐng)記住:在對(duì)現(xiàn)有區(qū)域文件進(jìn)行任何更改/更新后,請(qǐng)務(wù)必重新加載您的firewalld 服務(wù)激活,否則防火墻中的更改不會(huì)受到影響。
服務(wù)
firewalld 有另一個(gè)名為“服務(wù)”的組件,這些服務(wù)可以在區(qū)域文件中用于管理防火墻設(shè)置中的流量規(guī)則,每個(gè)預(yù)定義的“服務(wù)”在區(qū)域文件的默認(rèn)配置中使用.
dhcpv6-client
管理DHCP v6客戶端的本地流量,使用udp端口546。
ssh
管理ssh服務(wù)器服務(wù)的本地通信量,并使用tcp端口22。
Samba-client
管理Windows FLES/打印機(jī)共享服務(wù)的本地通信量,并使用137(UDP)和138(UDP)端口
lpp-client
管理用于打印服務(wù)器服務(wù)的本地通信量,并使用udp端口631。
mdns
管理多播本地鏈路服務(wù),并使用udp端口5353。
1.如何列出firewalld中所有可用的服務(wù)?
$?sudo?firewall-cmd?--get-services
RH-Satellite-6?amanda-client?amanda-k5-client?amqp?amqps?apcupsd?audit?bacula?bacula-client?bgp?bitcoin?bitcoin-rpc?bitcoin-testnet?bitcoin-testnet-rpc?
ceph?ceph-mon?cfengine?condor-collector?ctdb?dhcp?dhcpv6?dhcpv6-client?distcc?dns?docker-registry?docker-swarm?dropbox-lansync?elasticsearch?
etcd-client?etcd-server?finger?freeipa-ldap?freeipa-ldaps?freeipa-replication?freeipa-trust?ftp?ganglia-client?ganglia-master?git?gre?
high-availability?http?https?imap?imaps?ipp?ipp-client?ipsec?irc?ircs?iscsi-target?isns?jenkins?kadmin?kerberos?kibana?klogin?kpasswd?kprop?
kshell?ldap?ldaps?libvirt?libvirt-tls?lightning-network?llmnr?managesieve?matrix?mdns?minidlna?mongodb?mosh?mountd?mqtt?mqtt-tls?ms-wbt?mssql?
murmur?mysql?nfs?nfs3?nmea-0183?nrpe?ntp?nut?openvpn?ovirt-imageio?ovirt-storageconsole?ovirt-vmconsole?plex?pmcd?pmproxy?pmwebapi?pmwebapis?
pop3?pop3s?postgresql?privoxy?proxy-dhcp?ptp?pulseaudio?puppetmaster?quassel?radius?redis?rpc-bind?rsh?rsyncd?rtsp?salt-master?samba?samba-client?
samba-dc?sane?sip?sips?slp?smtp?smtp-submission?smtps?snmp?snmptrap?spideroak-lansync?squid?ssh?steam-streaming?svdrp?svn?syncthing?syncthing-gui?
synergy?syslog?syslog-tls?telnet?tftp?tftp-client?tinc?tor-socks?transmission-client?upnp-client?vdsm?vnc-server?wbem-http?wbem-https?wsman?wsmans?
xdmcp?xmpp-bosh?xmpp-client?xmpp-local?xmpp-server?zabbix-agent?zabbix-server
2. ?如何列出特定區(qū)域內(nèi)的所有可用服務(wù)?
$?sudo?firewall-cmd?--zone=work?--list-services
Output:
dhcpv6-client?ssh
輸出顯示在“工作”區(qū)域中僅啟用了兩個(gè)服務(wù)。
3. 如何將現(xiàn)有服務(wù)添加到默認(rèn)區(qū)域?
$?sudo?firewall-cmd?--add-service=samba
Output:
success
在此示例中,我已將名為 samba 的現(xiàn)有服務(wù)添加到默認(rèn)區(qū)域,您可以使用以下命令進(jìn)行驗(yàn)證:
$?sudo?firewall-cmd?--zone=public?--list-services
Output:
dhcpv6-client?samba?ssh
同樣,我們可以將服務(wù)添加到默認(rèn)區(qū)域以外的其他區(qū)域。使用以下命令:
$?sudo?firewall-cmd?--zone=internal?--add-service=ftp
firewalld兩種模式
默認(rèn)情況下,firewalld 支持兩種獨(dú)立的模式,永久和運(yùn)行時(shí)(立即)。
當(dāng)我們啟動(dòng)防火墻時(shí),它會(huì)將所有永久配置文件加載到運(yùn)行時(shí)中。
您進(jìn)行添加或更新的任何機(jī)會(huì)都將應(yīng)用于運(yùn)行時(shí)配置,并且不會(huì)自動(dòng)啟用到永久配置。
為了使其成為永久規(guī)則,我們需要使用“--permanent
”參數(shù),為了在 firewalld 中啟用這些更改,我們需要重新加載或重新啟動(dòng)防火墻服務(wù)。
1. 如何永久添加服務(wù)?
$?sudo?firewall-cmd?--permanent?--add-service=ftp
Output:
success$?sudo?firewall-cmd?--reload
Output:
success
請(qǐng)記住,無(wú)論何時(shí)使用“--permanent”標(biāo)志,都不要忘記重新加載防火墻服務(wù)。
2. 如何將我的運(yùn)行時(shí)設(shè)置遷移到永久設(shè)置?
$?sudo?firewall-cmd?--runtime-to-permanent
Output:
success
通常,我們?cè)谶\(yùn)行時(shí)環(huán)境中測(cè)試所有規(guī)則,一旦規(guī)則成功運(yùn)行,然后我們使用“--permanent”選項(xiàng)使它們永久化,使用上述命令一次性將所有運(yùn)行時(shí)設(shè)置遷移到永久模式,如果防火墻設(shè)置無(wú)效,則只需重新加載/重新啟動(dòng)防火墻服務(wù)即可使這些規(guī)則在永久配置中工作。
端口
firewalld 允許我們直接處理網(wǎng)絡(luò)端口,美妙之處在于,甚至無(wú)需在系統(tǒng)中安裝特定服務(wù),我們就可以在防火墻中打開(kāi)和關(guān)閉相關(guān)端口。
1. 如何在公共區(qū)域?yàn)閟amba服務(wù)開(kāi)放端口?
$?sudo?firewall-cmd?--zone=public?--add-port=137/udp
$?sudo?firewall-cmd?--zone=public?--add-port=138/udp
$?sudo?firewall-cmd?--zone=public?--add-port=139/tcp
$?sudo?firewall-cmd?--zone=public?--add-port=445/tcpOutput:
success
使用上面的命令,我們已經(jīng)成功打開(kāi)了samba服務(wù)的端口
驗(yàn)證一下:
$?sudo?firewall-cmd?--list-ports
Output:
137/udp?138/udp?139/tcp?445/tcp
成功測(cè)試后,如果您希望將這些規(guī)則作為防火墻的永久規(guī)則繼續(xù)使用,則將“--permanent”標(biāo)志與上述命令一起使用或使用運(yùn)行時(shí)作為永久命令,不要忘記重新加載服務(wù)。
超時(shí)
Firewalld 還有一個(gè)有趣的功能叫做超時(shí)。此功能將幫助許多系統(tǒng)管理員在其運(yùn)行時(shí)設(shè)置中添加臨時(shí)規(guī)則,例如,如果用戶想通過(guò) FTP 服務(wù)從服務(wù)器下載文件。
由于這只是一次性操作,因此不需要永久規(guī)則。
下載文件可能只需要 2-5 分鐘(可能會(huì)因文件大小而異)。
在我們的例子中,我們可以允許 FTP 服務(wù) 5 分鐘,它會(huì)在給定的時(shí)間后自動(dòng)斷開(kāi)連接。
$?sudo?firewall-cmd?--zone=public?--add-service=ftp?--timeout=5m
我們可以以秒 (s)、分鐘 (m) 或小時(shí) (h) 為單位指定超時(shí)。
感謝您抽出寶貴時(shí)間閱讀!我希望這篇文章可以幫助您通過(guò)示例了解“firewall-cmd”命令的基本用法,如果你喜歡這篇文章,請(qǐng)分享給其他人。