认识理解firewalld

什么是firewalld?

firewalld是一个防火墙管理工具。

Linux中提供防火墙功能的其实是netfilter,netfilter就是在tcp/ip协议栈中放置HOOK(俗称钩子函数),数据包被协议栈处理时,遇到HOOK函数,就执行HOOK函数中的操作:数据包过滤、NAT、连接跟踪。
firewalld和iptables都只是防火墙管理工具。并且firewalld底层调用的仍然是iptables的命令。

firewalld与iptables的区别

  1. firewalld实行白名单机制,iptables实行黑名单机制。
  2. firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。

如何使用firewalld?

zones管理

有哪些zones?

  • drop(丢弃)
    任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连
    接。
  • block(限制)
    任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的icmp6-adm-prohibited 信息所拒绝。
  • public(公共)
    在公共区域内使用,不能相信网络内的其他计算机,只能接收经过选取的连
    接。
  • external(外部)
    特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算
    机,只能接收经过选择的连接。
  • dmz(非军事区)
    用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内
    部网络,仅仅接收经过选择的连接。
  • work(工作)
    用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接
    收经过选择的连接。
  • home(家庭)
    用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。
    仅仅接收经过选择的连接。
  • internal(内部)
    用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。
    仅仅接受经过选择的连接。
  • trusted(信任)
    可接受所有的网络连接。

除开以上自带的9个zones,我们还可以自己添加自己的zone。
# firewall-cmd --new-zone=test --permanent
当然这个zone是什么功能可以自己通过规则定义。

如何使用zones?

其实就是把某一张网卡指定在某一个zone中,这样这张网卡的网络就受到这个zone中规则的保护。
一张网卡只能指定一个zone。
firewalld默认的区域是public。

常用操作:

  • 查看所有zone:# firewall-cmd --get-zones
  • 把ens3指定在public:# firewall-cmd --zone=public --add-interface=ens3
  • 把ens3的zone修改为block:# firewall-cmd --zone=block --change-interface=ens3
  • 从block中删除ens3:# firewall-cmd --zone=block --remove-interface=ens3

服务和端口管理

放行服务和端口

以下这些服务都是firewalld记录了端口号的:

# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine cockpit 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

他们记录在/usr/lib/firewalld/services/目录下的xml文件中:

# cat /usr/lib/firewalld/services/ssh.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>

这样的好处就是就算你不记得服务的端口号也没有关系。
当然如果你需要开放的服务firewalld没有记录,你也可以在/usr/lib/firewalld/services/添加你的xml文件,或者直接开放端口。

# firewall-cmd --zone=work --add-service=ssh
# firewall-cmd --zone=work --add-port=22/tcp

以上以ssh为例,效果是一样的,都是在work中开放ssh的端口。

端口转发

# firewall-cmd --zone=external --add-masquerade
# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3777

打开端口伪装功能,然后把22端口收到的转发至3777端口。

direct interface

前面我们提到firewalld底层调用的是iptables的命令,其实我们可以直接的使用iptables的规则。
firewalld有一个功能叫direct interface。

direct interface如何使用

# iptables -t filter -A INPUT_direct -p tcp --dport 443 -j ACCEPT
# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 443 -j ACCEPT

以上两条命令的效果是一致的,firewall-cmd的命令中数字0代表优先级。

富语言

firewalld的富语言(rich language)提供了一种不需要了解iptables语法的通过高级语言配置复杂IPv4和IPv6防火墙规则的机制。
富语言的功能特别丰富举个例子:

firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'

总结

firewalld的功能十分强大,也十分人性化,爸爸妈妈再也不用担心我搞不懂iptables的四表五链了。
其实iptables的四表五链还是要懂的,我记得我曾经做过一个数据包从网卡A(外网)进网卡B(内网NAT环境)出的项目,还是用direct interface调的iptables的命令。富语言没那么好用。

posted @ 2020-09-29 10:50  Gean  阅读(456)  评论(0编辑  收藏  举报