Linux下的防火墙功能是非常丰富的,但阿铭在日常的运维工作中,使用它的情况并不多。所以阿铭打算把一些常用的知识点介绍给大家。
14.4.3 firewalld
介绍完了netfilter,阿铭觉得也有必要再说一下firewalld,毕竟这个才是Rocky8上默认的防火墙。在上一节中,阿铭把firewalld服务给禁掉了,而是打开了iptables服务,现在再反过来关闭iptables服务,打开firewalld服务。操作如下所示:
# 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链的默认策略设置为ACCEPT,因为前面的实验中有将其设置为DROP。在前面介绍的iptables相关的命令,其实也是可以继续使用的,只不过在Rocky8中不用那么操作,而是有firewalld自己的命令。
Firewalld有两个基础概念,分别是zone和service,每一个zone里面有不同的iptables规则,默认一共有9个zone,而默认的zone为public。获取系统所有的zone,命令如下所示:
# firewall-cmd --get-zones block dmz drop external home internal public trusted work
如下命令可以查看系统默认的zone:
# firewall-cmd --get-default-zone public
下面阿铭简单介绍一下上面提到的9个zone。
drop(丢弃):任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制):任何接收的网络连接都被 IPv4 的icmp-host-prohibited信息和 IPv6 的icmp6-adm-prohibited信息所拒绝。
public(公共):在公共区域内使用,不能相信网络内的其他计算机不会对你的计算机造成危害,只能接收经过选取的连接。
external(外部):特别是为路由器启用了伪装功能的外部网。你不能信任来自网络的其他计算,不能相信它们不会对你的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区):用于你的非军事区内的计算机,此区域内可公开访问,可以有限地进入你的内部网络,仅仅接收经过选择的连接。
work(工作):用于工作区。你可以基本相信网络内的其他计算机不会危害你的计算机。仅仅接收经过选择的连接。
home(家庭):用于家庭网络。你可以基本信任网络内的其他计算机不会危害你的计算机。仅仅接收经过选择的连接。
internal(内部):用于内部网络。你可以基本上信任网络内的其他计算机不会威胁你的计算机。仅仅接受经过选择的连接。
trusted(信任):可接受所有的网络连接。
对于以上9个zone简单了解即可,阿铭相信你在日常工作中使用它们的机会不会太多。下面介绍几个关于zone的命令:
# firewall-cmd --set-default-zone=work #设定默认的zone为work success # firewall-cmd --get-zone-of-interface=ens33 #查看指定网卡所在的zone Work # firewall-cmd --zone=public --add-interface=lo #给指定网卡设置zone success # firewall-cmd --zone=dmz --change-interface=lo #针对网卡更改zone success # firewall-cmd --zone=dmz --remove-interface=lo #针对网卡删除zone Success # firewall-cmd --get-active-zones #查看系统所有网卡所在的zone Work interfaces: ens33
阿铭觉得firewalld工具的开发者可能是想简化用户的使用过程,所以提供了这9种zone,这9种zone中,总有一个是适合我们的使用场景的。那到底zone是什么?每一种zone之间到底有什么区别呢?下面阿铭再给大家介绍一个概念——service。其实,之所以有9种zone,是因为每一个zone里面都使用了不同的service,而service就是针对一个服务(端口)做的iptables规则。
# firewall-cmd --get-service #列出当前系统所有的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目录下面(默认为空):
# 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 #查看当前zone下有哪些service cockpit dhcpv6-client ssh # firewall-cmd --zone=public --list-services #查看指定zone下有哪些service
一个zone下面有某个service,意味着这个service是被信任的。比如,当前zone下面有ssh,那么ssh服务(也就是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/下面对应的文件,这些就是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,但这种方法仅仅在内存中生效,并没有修改配置文件,如果想修改配置文件,需要加一个选项:
# firewall-cmd --zone=public --add-service=http --permanent success
一旦更改了某个zone的配置文件,则会在/etc/firewalld/zones/目录下面生成对应zone的配置文件(.xml后缀的文件),其实这个目录下面的配置文件才是真正的配置文件。阿铭在上面介绍的目录,可以说是所有zone的模板配置文件。
下面阿铭举一个实际的例子,帮助你明白zone和service两个概念。需求:假如服务器上配置了一个FTP服务,但端口并非默认的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相关的配置,内容如下# 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.
再来验证一下work zone里面的service是否有FTP:
# firewall-cmd --zone=work --list-services cockpit dhcpv6-client ftp ssh
上面的方法还是有点罗嗦,有没有像上一小节中iptables命令那样简单的方式呢?当然有,下面阿铭再给大家找几个典型例子。
1)放行指定端口:
# firewall-cmd --set-default-zone=public #将默认zone设置为public # firewall-cmd --zone=public --add-port 1000/tcp --permanent #如果不指定--zone默认就是public,增加tcp的1000端口,增加--permanent是为了让其永久生效,否则重启后就失效了 success # firewall-cmd --reload #使其规则生效 # firewall-cmd --list-all #列出当前具体规则,可以看到刚刚增加的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" //放行指定网段 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)删除某条规则:
# firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.0.0/24" accept" success # firewall-cmd --reload
关于firewalld,阿铭就介绍这些。这部分内容要是仔细研究还是蛮多的,但阿铭觉得毕竟在工作中使用得并不多,了解这些内容足够了。
审核编辑:汤梓红
评论
查看更多