随着各个GNU/Linux系统厂商和社区逐渐采用新内核作为其发行版的默认内核,防火墙机制采用更新后的nftables防火墙机制。虽然RedHat提供了firewalld.service防火墙服务组件和相关的配置管理命令firewall-config和firewall-cmd来管理防火墙,但是该服务组件并没有在其他发行版或社区版本中统一使用。为了更好的帮助读者朋友们理解防火墙机制,笔者在工作中直接使用nftables手动创建配置,从而使系统具备本地IPS能力。目前大多数主流的GNU/Linux系统新发行版在默认安装完成后,都在systemd系统和服务管理器中添加了一个新的nftables.serivce子服务配置文件。同时仍然支持iptables规则和iptables命令,但是为了将防火墙完全升级到nftables机制,我们可以直接在没有firewalld.service的分发系统中启用nftables.service服务来使用新的防火墙。通过执行命令vi/lib/systemd/system/nftables.service,从文件中的语句ExecStart=/usr/sbin/nft-f/etc/nftables.conf可以清楚的看出nftables防火墙的默认配置和规则文件一般放在系统的/etc/nftables.conf目录下,但默认的配置文件只包含一个简单的IPv4/IPv6防火墙列表,名为inetfilter。inetfilter可以应用于IPv4和IPv6规则,但是不能用于NAT类型的链,只能用于filter类型的链。为了保持与iptables防火墙规则的类比,让用户更容易熟悉,我们可以使用如下的nftables命令创建相应的表和链接,搭建一个类似于传统iptables防火墙的框架。创建过程如下:1.nft表的创建与iptables中的表不同,nftables中没有内置表,表的数量和名称由用户决定。但是,每个表只有一个地址簇,并且只适用于该簇的数据包。该表可以指定五个(ip、ip6、inet、arp、bridge)簇之一,用户可以依次执行以下命令:nftaddtableipfilternftaddtableip6filternftaddtablebridgefilter”nftables将创建三个簇对我们来说分别是ip、ipv6、bridgecluster和tablename是filterfirewallframework。2.创建一个包含链的链表,链的目的是保存规则。与iptables中的链不同,nftables没有内置链。这意味着与iptables不同,如果一条链不匹配nftables框架中的集群或钩子,则流经这些链的数据包将不会被nftables触及。有两种类型的链。底层链是指定hook的网络栈数据包的入口点,其实可以理解为iptables防火墙的默认规则。正则链可以理解为其他用户自定义的规则链。使用以下命令为每个表创建INPUT、FORWARD、OUTPUT链,并设置基本链,其中ipclusterfiltertableINPUTchain对应的命令格式,默认丢弃所有数据包,如下所示。添加对应的ipclusterfiltertable链命令集:nftaddchainipfilterINPUT{typefilterhookinputpriority0\;政策下降\;}nftaddchainipfilterFORWARD{typefilterhookforwardpriority0\;政策接受\;}nftaddchainipfilterOUTPUT{typefilterhookoutputpriority0\;政策接受\;}添加对应的ipv6集群过滤表链命令集:nftaddchainip6filterINPUT{typefilterhookinputpriority0\;政策接受\;}nftaddchainip6filterFORWARD{typefilterhookforwardpriority0\;政策接受\;}nftaddchainip6filterOUTPUT{typefilterhookoutputpriority0\;政策接受\;}添加桥簇过滤表对应的链命令集:nftaddchainbridgefilterINPUT{typefilterhookinputpriority0\;政策接受\;}nftaddchainbridgefilterFORWARD{typefilterhookforwardpriority0\;政策接受\;}nftaddchainbridgefilterOUTPUT{typefilterhookforwardpriority0\;政策接受\;}3.添加规则规则由语句或表达式组成,包含在链中。使用以下语法将规则添加到链中:nftaddrulefamilytablechainhandlestatement将规则添加到句柄中,这是可选的。如果未指定,则将规则添加到链的末尾,类似于iptables-A方法。以下语法用于将规则插入到指定位置:nftinsertrulefamilytablechainhandlestatement如果没有指定句柄,则将规则插入到链的开头,类似于iptables-I方法。下面是用户根据自己的实际情况添加的具体规则:允许本地环回接口的所有流量lo:nftaddruleipfilterINPUTiifloaccept允许建立的和相关的数据包,这个很重要,因为大部分外部访问的数据包在收到对端主机的回复时通常处于这两种状态。如果INPUT链中没有放行此类数据包,即使本地OUTPUT链默认为ACCEPT,所有数据包都发送出去,系统也会主动丢弃INPUT链中对应的返回包,导致失败数据交互。具体命令如下:nftaddruleipfilterINPUTctstateestablished,relatedaccept阻断具有重大安全风险的系统端口,包括勒索病毒等已经公布的端口。在nftables配置过程中,当用户使用端口添加时,nftables会自动将该端口转换为服务模式,用户可以通过命令nftdescribetcpdport查看。屏蔽存在安全风险的系统端口的具体命令如下:nftaddruleipfilterINPUTmetal4prototcptcpdport{loc-srv,136,netbios-ns,netbios-dgm,netbios-ssn,microsoft-ds,3389,radmin-port}counterdropnft添加规则ipfilterINPUTmetal4protoudpudpdport{loc-srv,136,netbios-ns,netbios-dgm,netbios-ssn,microsoft-ds,3389,radmin-port}counterdroptolimit服务流量为防止DDoS攻击或CC攻击导致系统服务中断,可以通过limit限制通信速率。下面是接受每秒最多10个web或https或dns查询请求的数据包的具体规则。同时,2个数据包可以超过限制。命令:nftaddruleipfilterINPUTmetal4prototcptcpdport{80,443,53}ctstatenewlimitrate10/secondburst4packetsacceptnftaddruleipfilterINPUTmetal4protoudpudpdport{80,443,53}newctlimitstate10/secondburst4packetsaccept总结经过以上配置,我们的主机已经具备了很好的本地IPS能力。无论是跨路由器的南北向访问流量,还是本地网络内的东西向访问流量,常规的恶意扫描或恶意攻击基本就足够了。之后用户可以使用命令nftlistruleset>/etc/nftables.conf将这些规则保存在nftables的默认配置文件中,并使用systemctlenablenftables.service开启服务的默认启动方式,然后系统将在启动nftables防火墙时自动启动并应用适当的规则。用户也可以直接根据相应规则编辑文件,通过命令vi/etc/nftables.conf修改防火墙配置,确保自己的系统处于本地防火墙IPS能力的保护之下。希望这篇文章对你有用和有帮助。
