Linux下的防火墻功能是非常豐富的,但阿銘在日常的運維工作中,使用它的情況并不多。所以阿銘打算把一些常用的知識點介紹給大家。
14.4.3firewalld
介紹完了netfilter,阿銘覺得也有必要再說一下firewalld,畢竟這個才是Rocky8上默認(rèn)的防火墻。
在上一節(jié)中,阿銘把firewalld服務(wù)給禁掉了,而是打開了iptables服務(wù),現(xiàn)在再反過來關(guān)閉iptables服務(wù),打開firewalld服務(wù)。
操作如下所示:
# iptables –P INPUT ACCEPT # yum remove -y iptables # systemctl enable firewalld Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service. Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service. # systemctl start firewalld首先將INPUT鏈的默認(rèn)策略設(shè)置為ACCEPT,因為前面的實驗中有將其設(shè)置為DROP。
在前面介紹的iptables相關(guān)的命令,其實也是可以繼續(xù)使用的,只不過在Rocky8中不用那么操作,而是有firewalld自己的命令。
Firewalld有兩個基礎(chǔ)概念,分別是zone和service,每一個zone里面有不同的iptables規(guī)則,默認(rèn)一共有9個zone,而默認(rèn)的zone為public。
獲取系統(tǒng)所有的zone,命令如下所示:
# firewall-cmd --get-zones block dmz drop external home internal public trusted work
如下命令可以查看系統(tǒng)默認(rèn)的zone:
# firewall-cmd --get-default-zone public
下面阿銘簡單介紹一下上面提到的9個zone。
drop(丟棄):任何接收的網(wǎng)絡(luò)數(shù)據(jù)包都被丟棄,沒有任何回復(fù)。僅能有發(fā)送出去的網(wǎng)絡(luò)連接。
block(限制):任何接收的網(wǎng)絡(luò)連接都被 IPv4 的icmp-host-prohibited信息和 IPv6 的icmp6-adm-prohibited信息所拒絕。
public(公共):在公共區(qū)域內(nèi)使用,不能相信網(wǎng)絡(luò)內(nèi)的其他計算機(jī)不會對你的計算機(jī)造成危害,只能接收經(jīng)過選取的連接。
external(外部):特別是為路由器啟用了偽裝功能的外部網(wǎng)。你不能信任來自網(wǎng)絡(luò)的其他計算,不能相信它們不會對你的計算機(jī)造成危害,只能接收經(jīng)過選擇的連接。
dmz(非軍事區(qū)):用于你的非軍事區(qū)內(nèi)的計算機(jī),此區(qū)域內(nèi)可公開訪問,可以有限地進(jìn)入你的內(nèi)部網(wǎng)絡(luò),僅僅接收經(jīng)過選擇的連接。
work(工作):用于工作區(qū)。你可以基本相信網(wǎng)絡(luò)內(nèi)的其他計算機(jī)不會危害你的計算機(jī)。僅僅接收經(jīng)過選擇的連接。
home(家庭):用于家庭網(wǎng)絡(luò)。你可以基本信任網(wǎng)絡(luò)內(nèi)的其他計算機(jī)不會危害你的計算機(jī)。僅僅接收經(jīng)過選擇的連接。
internal(內(nèi)部):用于內(nèi)部網(wǎng)絡(luò)。你可以基本上信任網(wǎng)絡(luò)內(nèi)的其他計算機(jī)不會威脅你的計算機(jī)。僅僅接受經(jīng)過選擇的連接。
trusted(信任):可接受所有的網(wǎng)絡(luò)連接。
對于以上9個zone簡單了解即可,阿銘相信你在日常工作中使用它們的機(jī)會不會太多。下面介紹幾個關(guān)于zone的命令:
# firewall-cmd --set-default-zone=work #設(shè)定默認(rèn)的zone為work success # firewall-cmd --get-zone-of-interface=ens33 #查看指定網(wǎng)卡所在的zone Work # firewall-cmd --zone=public --add-interface=lo #給指定網(wǎng)卡設(shè)置zone success # firewall-cmd --zone=dmz --change-interface=lo #針對網(wǎng)卡更改zone success # firewall-cmd --zone=dmz --remove-interface=lo #針對網(wǎng)卡刪除zone Success # firewall-cmd --get-active-zones #查看系統(tǒng)所有網(wǎng)卡所在的zone Work interfaces: ens33
阿銘覺得firewalld工具的開發(fā)者可能是想簡化用戶的使用過程,所以提供了這9種zone,這9種zone中,總有一個是適合我們的使用場景的。
那到底zone是什么?每一種zone之間到底有什么區(qū)別呢?
下面阿銘再給大家介紹一個概念——service。其實,之所以有9種zone,是因為每一個zone里面都使用了不同的service,而service就是針對一個服務(wù)(端口)做的iptables規(guī)則。
# firewall-cmd --get-service #列出當(dāng)前系統(tǒng)所有的service RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache 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 prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 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
這些service都是由一個個配置文件定義的,配置文件的模板在/usr/lib/firewalld/services/目錄下,真正生效的配置在/etc/firewalld/services目錄下面(默認(rèn)為空):
# ls /usr/lib/firewalld/services/ amanda-client.xml dhcpv6-client.xml git.xml kpasswd.xml murmur.xml prometheus.xml sip.xml tentacle.xml amanda-k5-client.xml dhcpv6.xml grafana.xml kprop.xml mysql.xml proxy-dhcp.xml slp.xml tftp-client.xml amqps.xml dhcp.xml gre.xml kshell.xml nfs3.xml ptp.xml smtp-submission.xml tftp.xml amqp.xml distcc.xml high-availability.xml ldaps.xml nfs.xml pulseaudio.xml smtps.xml tile38.xml apcupsd.xml dns-over-tls.xml https.xml ldap.xml nmea-0183.xml puppetmaster.xml smtp.xml tinc.xml audit.xml dns.xml http.xml libvirt-tls.xml nrpe.xml quassel.xml snmptrap.xml tor-socks.xml bacula-client.xml docker-registry.xml imaps.xml libvirt.xml ntp.xml radius.xml snmp.xml transmission-client.xml bacula.xml docker-swarm.xml imap.xml lightning-network.xml nut.xml rdp.xml spideroak-lansync.xml upnp-client.xml bb.xml dropbox-lansync.xml ipp-client.xml llmnr.xml openvpn.xml redis-sentinel.xml spotify-sync.xml vdsm.xml bgp.xml elasticsearch.xml ipp.xml managesieve.xml ovirt-imageio.xml redis.xml squid.xml vnc-server.xml bitcoin-rpc.xml etcd-client.xml ipsec.xml matrix.xml ovirt-storageconsole.xml RH-Satellite-6.xml ssdp.xml wbem-https.xml bitcoin-testnet-rpc.xml etcd-server.xml ircs.xml mdns.xml ovirt-vmconsole.xml rpc-bind.xml ssh.xml wbem-http.xml bitcoin-testnet.xml finger.xml irc.xml memcache.xml plex.xml rsh.xml steam-streaming.xml wsmans.xml bitcoin.xml freeipa-4.xml iscsi-target.xml minidlna.xml pmcd.xml rsyncd.xml svdrp.xml wsman.xml bittorrent-lsd.xml freeipa-ldaps.xml isns.xml mongodb.xml pmproxy.xml rtsp.xml svn.xml xdmcp.xml ceph-mon.xml freeipa-ldap.xml jenkins.xml mosh.xml pmwebapis.xml salt-master.xml syncthing-gui.xml xmpp-bosh.xml ceph.xml freeipa-replication.xml kadmin.xml mountd.xml pmwebapi.xml samba-client.xml syncthing.xml xmpp-client.xml cfengine.xml freeipa-trust.xml kdeconnect.xml mqtt-tls.xml pop3s.xml samba-dc.xml synergy.xml xmpp-local.xml cockpit.xml ftp.xml kerberos.xml mqtt.xml pop3.xml samba.xml syslog-tls.xml xmpp-server.xml condor-collector.xml ganglia-client.xml kibana.xml mssql.xml postgresql.xml sane.xml syslog.xml zabbix-agent.xml ctdb.xml ganglia-master.xml klogin.xml ms-wbt.xml privoxy.xml sips.xml telnet.xml zabbix-server.xml
阿銘剛剛說過,每個zone里面都有不同的service,那如何查看一個zone下面有哪些service呢?
# firewall-cmd --list-services #查看當(dāng)前zone下有哪些service cockpit dhcpv6-client ssh # firewall-cmd --zone=public --list-services #查看指定zone下有哪些service
一個zone下面有某個service,意味著這個service是被信任的。
比如,當(dāng)前zone下面有ssh,那么ssh服務(wù)(也就是22)端口是放行的。
我們可以給一個zone添加一個service,命令如下:
# firewall-cmd --zone=public --add-service=http // 把http增加到public zone下面 success # firewall-cmd --zone=public --list-service cockpit dhcpv6-client http ssh
對于每個zone來說,都有自己的配置文件,你可以查看目錄/usr/lib/firewalld/zones/下面對應(yīng)的文件,這些就是zone的配置文件:
# ls /usr/lib/firewalld/zones/ block.xml dmz.xml drop.xml external.xml home.xml internal.xml public.xml trusted.xml work.xml
剛剛阿銘教給你一個命令,可在一個zone里面增加一個service,但這種方法僅僅在內(nèi)存中生效,并沒有修改配置文件,如果想修改配置文件,需要加一個選項:
# firewall-cmd --zone=public --add-service=http --permanent success
一旦更改了某個zone的配置文件,則會在/etc/firewalld/zones/目錄下面生成對應(yīng)zone的配置文件(.xml后綴的文件),其實這個目錄下面的配置文件才是真正的配置文件。
阿銘在上面介紹的目錄,可以說是所有zone的模板配置文件。
下面阿銘舉一個實際的例子,幫助你明白zone和service兩個概念。
需求:假如服務(wù)器上配置了一個FTP服務(wù),但端口并非默認(rèn)的21,而是1121,并且需要在work zone下面放行FTP。
具體的做法如下:
#cp/usr/lib/firewalld/services/ftp.xml/etc/firewalld/services/ #這個和上面阿銘提到的情況一樣,///usr/lib/firewalld/services/目錄下面為所有service的模板配置文件 # vi /etc/firewalld/services/ftp.xml #把里面的21改為1121 # cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/ # vi /etc/firewalld/zones/work.xml #在里面增加一行FTP相關(guān)的配置,內(nèi)容如下 WorkFor use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted. # firewall-cmd --reload #重新加載
再來驗證一下work zone里面的service是否有FTP:
# firewall-cmd --zone=work --list-services cockpit dhcpv6-client ftp ssh
上面的方法還是有點羅嗦,有沒有像上一小節(jié)中iptables命令那樣簡單的方式呢?當(dāng)然有,下面阿銘再給大家找?guī)讉€典型例子。
1)放行指定端口:
# firewall-cmd --set-default-zone=public #將默認(rèn)zone設(shè)置為public # firewall-cmd --zone=public --add-port 1000/tcp --permanent #如果不指定--zone默認(rèn)就是public,增加tcp的1000端口,增加--permanent是為了讓其永久生效,否則重啟后就失效了 success # firewall-cmd --reload #使其規(guī)則生效 # firewall-cmd --list-all #列出當(dāng)前具體規(guī)則,可以看到剛剛增加的1000端口 public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: cockpit dhcpv6-client http ssh ports: 1000/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
2)添加多個端口:
# firewall-cmd --add-port 3000-3010/tcp --permanent #3000-3010指定一個范圍 success # firewall-cmd --reload # firewall-cmd --list-all |grep ports #用grep過濾只含有’ports’字符的行 ports: 1000/tcp 3000-3010/tcp forward-ports: source-ports: # firewall-cmd --add-port 80/tcp --add-port 8080/tcp --permanent #如果要增加多個port,那就要寫多個--add-port # firewall-cmd --reload
3)刪除指定端口:
# firewall-cmd --remove-port 8080/tcp --permanent success # firewall-cmd --reload success # firewall-cmd --list-all |grep ports ports: 1000/tcp 3000-3010/tcp 80/tcp forward-ports: source-ports:
4)針對某個ip開放指定端口:
# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.72.166" port protocol="tcp" port="6379" accept" success # firewall-cmd --reload success # firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: cockpit dhcpv6-client http ssh ports: 1000/tcp 3000-3010/tcp 80/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="192.168.72.166" port port="6379" protocol="tcp" accept # firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/24" accept" //放行指定網(wǎng)段 success # firewall-cmd --reload success # firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: cockpit dhcpv6-client http ssh ports: 1000/tcp 3000-3010/tcp 80/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="192.168.72.166" port port="6379" protocol="tcp" accept rule family="ipv4" source address="192.168.0.0/24" accept
5)刪除某條規(guī)則:
# firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.0.0/24" accept" success # firewall-cmd --reload
關(guān)于firewalld,阿銘就介紹這些。這部分內(nèi)容要是仔細(xì)研究還是蠻多的,但阿銘覺得畢竟在工作中使用得并不多,了解這些內(nèi)容足夠了。
審核編輯:劉清
-
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208717 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
590瀏覽量
27316 -
防火墻
+關(guān)注
關(guān)注
0文章
416瀏覽量
35576 -
路由器
+關(guān)注
關(guān)注
22文章
3693瀏覽量
113426 -
FTP
+關(guān)注
關(guān)注
0文章
106瀏覽量
40568
原文標(biāo)題:Linux下防火墻-firewalld
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論