Linux下的防火墻功能是非常豐富的,但阿銘在日常的運(yùn)維工作中,使用它的情況并不多。所以阿銘打算把一些常用的知識(shí)點(diǎn)介紹給大家。
14.4.3 firewalld
介紹完了netfilter,阿銘覺(jué)得也有必要再說(shuō)一下firewalld,畢竟這個(gè)才是Rocky8上默認(rèn)的防火墻。在上一節(jié)中,阿銘把firewalld服務(wù)給禁掉了,而是打開(kāi)了iptables服務(wù),現(xiàn)在再反過(guò)來(lái)關(guān)閉iptables服務(wù),打開(kāi)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,因?yàn)榍懊娴膶?shí)驗(yàn)中有將其設(shè)置為DROP。在前面介紹的iptables相關(guān)的命令,其實(shí)也是可以繼續(xù)使用的,只不過(guò)在Rocky8中不用那么操作,而是有firewalld自己的命令。
Firewalld有兩個(gè)基礎(chǔ)概念,分別是zone和service,每一個(gè)zone里面有不同的iptables規(guī)則,默認(rèn)一共有9個(gè)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
?
下面阿銘簡(jiǎn)單介紹一下上面提到的9個(gè)zone。
drop(丟棄):任何接收的網(wǎng)絡(luò)數(shù)據(jù)包都被丟棄,沒(méi)有任何回復(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ī)不會(huì)對(duì)你的計(jì)算機(jī)造成危害,只能接收經(jīng)過(guò)選取的連接。
external(外部):特別是為路由器啟用了偽裝功能的外部網(wǎng)。你不能信任來(lái)自網(wǎng)絡(luò)的其他計(jì)算,不能相信它們不會(huì)對(duì)你的計(jì)算機(jī)造成危害,只能接收經(jīng)過(guò)選擇的連接。
dmz(非軍事區(qū)):用于你的非軍事區(qū)內(nèi)的計(jì)算機(jī),此區(qū)域內(nèi)可公開(kāi)訪(fǎng)問(wèn),可以有限地進(jìn)入你的內(nèi)部網(wǎng)絡(luò),僅僅接收經(jīng)過(guò)選擇的連接。
work(工作):用于工作區(qū)。你可以基本相信網(wǎng)絡(luò)內(nèi)的其他計(jì)算機(jī)不會(huì)危害你的計(jì)算機(jī)。僅僅接收經(jīng)過(guò)選擇的連接。
home(家庭):用于家庭網(wǎng)絡(luò)。你可以基本信任網(wǎng)絡(luò)內(nèi)的其他計(jì)算機(jī)不會(huì)危害你的計(jì)算機(jī)。僅僅接收經(jīng)過(guò)選擇的連接。
internal(內(nèi)部):用于內(nèi)部網(wǎng)絡(luò)。你可以基本上信任網(wǎng)絡(luò)內(nèi)的其他計(jì)算機(jī)不會(huì)威脅你的計(jì)算機(jī)。僅僅接受經(jīng)過(guò)選擇的連接。
trusted(信任):可接受所有的網(wǎng)絡(luò)連接。
對(duì)于以上9個(gè)zone簡(jiǎn)單了解即可,阿銘相信你在日常工作中使用它們的機(jī)會(huì)不會(huì)太多。下面介紹幾個(gè)關(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 #針對(duì)網(wǎng)卡更改zone success # firewall-cmd --zone=dmz --remove-interface=lo #針對(duì)網(wǎng)卡刪除zone Success # firewall-cmd --get-active-zones #查看系統(tǒng)所有網(wǎng)卡所在的zone Work interfaces: ens33
?
阿銘覺(jué)得firewalld工具的開(kāi)發(fā)者可能是想簡(jiǎn)化用戶(hù)的使用過(guò)程,所以提供了這9種zone,這9種zone中,總有一個(gè)是適合我們的使用場(chǎng)景的。那到底zone是什么?每一種zone之間到底有什么區(qū)別呢?下面阿銘再給大家介紹一個(gè)概念——service。其實(shí),之所以有9種zone,是因?yàn)槊恳粋€(gè)zone里面都使用了不同的service,而service就是針對(duì)一個(gè)服務(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都是由一個(gè)個(gè)配置文件定義的,配置文件的模板在/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
?
阿銘剛剛說(shuō)過(guò),每個(gè)zone里面都有不同的service,那如何查看一個(gè)zone下面有哪些service呢?
?
# firewall-cmd --list-services #查看當(dāng)前zone下有哪些service cockpit dhcpv6-client ssh # firewall-cmd --zone=public --list-services #查看指定zone下有哪些service
?
一個(gè)zone下面有某個(gè)service,意味著這個(gè)service是被信任的。比如,當(dāng)前zone下面有ssh,那么ssh服務(wù)(也就是22)端口是放行的。我們可以給一個(gè)zone添加一個(gè)service,命令如下:
?
# firewall-cmd --zone=public --add-service=http // 把http增加到public zone下面 success # firewall-cmd --zone=public --list-service cockpit dhcpv6-client http ssh
?
對(duì)于每個(gè)zone來(lái)說(shuō),都有自己的配置文件,你可以查看目錄/usr/lib/firewalld/zones/下面對(duì)應(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
?
剛剛阿銘教給你一個(gè)命令,可在一個(gè)zone里面增加一個(gè)service,但這種方法僅僅在內(nèi)存中生效,并沒(méi)有修改配置文件,如果想修改配置文件,需要加一個(gè)選項(xiàng):
?
# firewall-cmd --zone=public --add-service=http --permanent success
?
一旦更改了某個(gè)zone的配置文件,則會(huì)在/etc/firewalld/zones/目錄下面生成對(duì)應(yīng)zone的配置文件(.xml后綴的文件),其實(shí)這個(gè)目錄下面的配置文件才是真正的配置文件。阿銘在上面介紹的目錄,可以說(shuō)是所有zone的模板配置文件。
下面阿銘舉一個(gè)實(shí)際的例子,幫助你明白zone和service兩個(gè)概念。需求:假如服務(wù)器上配置了一個(gè)FTP服務(wù),但端口并非默認(rèn)的21,而是1121,并且需要在work zone下面放行FTP。具體的做法如下:
?
#?cp?/usr/lib/firewalld/services/ftp.xml?/etc/firewalld/services/? #這個(gè)和上面阿銘提到的情況一樣,//?/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)容如下# firewall-cmd --reload #重新加載 Work For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
?
再來(lái)驗(yàn)證一下work zone里面的service是否有FTP:
?
# firewall-cmd --zone=work --list-services cockpit dhcpv6-client ftp ssh
?
上面的方法還是有點(diǎn)羅嗦,有沒(méi)有像上一小節(jié)中iptables命令那樣簡(jiǎn)單的方式呢?當(dāng)然有,下面阿銘再給大家找?guī)讉€(gè)典型例子。
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)添加多個(gè)端口:
?
# firewall-cmd --add-port 3000-3010/tcp --permanent #3000-3010指定一個(gè)范圍 success # firewall-cmd --reload # firewall-cmd --list-all |grep ports #用grep過(guò)濾只含有’ports’字符的行 ports: 1000/tcp 3000-3010/tcp forward-ports: source-ports: # firewall-cmd --add-port 80/tcp --add-port 8080/tcp --permanent #如果要增加多個(gè)port,那就要寫(xiě)多個(gè)--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)針對(duì)某個(gè)ip開(kāi)放指定端口:
?
# 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ì)研究還是蠻多的,但阿銘覺(jué)得畢竟在工作中使用得并不多,了解這些內(nèi)容足夠了。
審核編輯:湯梓紅
評(píng)論
查看更多