过渡到 nftables

开源世界中的每一个主要发行版都在演进,逐渐将 nftables 做为了默认防火墙。换言之,古老的 iptables 如今已经消亡。本文是有关如何构建 nftables 的教程。linux

当前,有一个与 nftables 兼容的 iptables-nft 后端,可是很快,即便是它也再也不提供了。另外,正如 Red Hat 开发人员所指出的那样,有时它可能会错误地转换规则。咱们须要知道如何构建本身的 nftables,而不是依赖于 iptables 到 nftables 的转换器。git

在 nftables 中,全部地址族都遵循一个规则。与 iptables 不一样,nftables 在用户空间中运行,iptables 中的每一个模块都运行在内核(空间)中。它不多须要更新内核,并带有一些新功能,例如映射、地址族和字典。github

地址族

地址族肯定要处理的数据包的类型。在 nftables 中有六个地址族,它们是:后端

  • ip
  • ipv6
  • inet
  • arp
  • bridge
  • netdev

在 nftables 中,ipv4 和 ipv6 协议能够被合并为一个称为 inet 的单一地址族。所以,咱们不须要指定两个规则:一个用于 ipv4,另外一个用于 ipv6。若是未指定地址族,它将默认为 ip 协议,即 ipv4。咱们感兴趣的领域是 inet 地址族,由于大多数家庭用户将使用 ipv4 或 ipv6 协议。bash

nftables

典型的 nftables 规则包含三个部分:表、链和规则。网络

表是链和规则的容器。它们由其地址族和名称来标识。链包含 inet/arp/bridge/netdev 等协议所需的规则,并具备三种类型:过滤器、NAT 和路由。nftables 规则能够从脚本加载,也能够在终端键入,而后另存为规则集。tcp

对于家庭用户,默认链为过滤器。inet 系列包含如下钩子:工具

  • Input
  • Output
  • Forward
  • Pre-routing
  • Post-routing

使用脚本仍是不用?

最大的问题之一是咱们是否可使用防火墙脚本。答案是:这是你本身的选择。这里有一些建议:若是防火墙中有数百条规则,那么最好使用脚本,可是若是你是典型的家庭用户,则能够在终端中键入命令,而后(保存并在重启时)加载规则集。每种选择都有其自身的优缺点。在本文中,咱们将在终端中键入它们以构建防火墙。post

nftables 使用一个名为 nft 的程序来添加、建立、列出、删除和加载规则。确保使用如下命令将 nftables 与 conntrackd 和 netfilter-persistent 软件包一块儿安装,并删除 iptables:测试

apt-get install nftables conntrackd netfilter-persistent
apt-get purge iptables
复制代码

nft 须要以 root 身份运行或使用 sudo 运行。使用如下命令分别列出、刷新、删除规则集和加载脚本。

nft list ruleset
nft flush ruleset
nft delete table inet filter
/usr/sbin/nft -f /etc/nftables.conf
复制代码

输入策略

就像 iptables 同样,防火墙将包含三部分:输入(input)、转发(forward)和输出(output)。在终端中,为输入(input)策略键入如下命令。在开始以前,请确保已刷新规则集。咱们的默认策略将会删除全部内容。咱们将在防火墙中使用 inet 地址族。将如下规则以 root 身份添加或使用 sudo 运行:

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; counter \; policy drop \; }
复制代码

你会注意到有一个名为 priority 0 的东西。这意味着赋予该规则更高的优先级。挂钩一般赋予负整数,这意味着更高的优先级。每一个挂钩都有本身的优先级,过滤器链的优先级为 0。你能够检查 nftables Wiki 页面以查看每一个挂钩的优先级。

要了解你计算机中的网络接口,请运行如下命令:

ip link show
复制代码

它将显示已安装的网络接口,一个是本地主机、另外一个是以太网端口或无线端口。以太网端口的名称以下所示:enpXsY,其中 XY 是数字,无线端口也是如此。咱们必须容许本地主机的流量,而且仅容许从互联网创建的传入链接。

nftables 具备一项称为裁决语句的功能,用于解析规则。裁决语句为 acceptdropqueuejumpgotocontinuereturn。因为这是一个很简单的防火墙,所以咱们将使用 acceptdrop 处理数据包。

nft add rule inet filter input iifname lo accept
nft add rule inet filter input iifname enpXsY ct state new, established, related accept
复制代码

接下来,咱们必须添加规则以保护咱们免受隐秘扫描。并不是全部的隐秘扫描都是恶意的,但大多数都是。咱们必须保护网络免受此类扫描。第一组规则列出了要测试的 TCP 标志。在这些标志中,第二组列出了要与第一组匹配的标志。

nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|fin\) == \(syn\|fin\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|rst\) == \(syn\|rst\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(fin\|rst\) == \(fin\|rst\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|fin\) == fin drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|psh\) == psh drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|urg\) == urg drop
复制代码

记住,咱们在终端中键入这些命令。所以,咱们必须在一些特殊字符以前添加一个反斜杠,以确保终端可以正确解释该斜杠。若是你使用的是脚本,则不须要这样作。

关于 ICMP 的警告

互联网控制消息协议(ICMP)是一种诊断工具,所以不该彻底丢弃该流量。彻底阻止 ICMP 的任未尝试都是不明智的,由于它还会致使中止向咱们提供错误消息。仅启用最重要的控制消息,例如回声请求、回声应答、目的地不可达和超时等消息,并拒绝其他消息。回声请求和回声应答是 ping 的一部分。在输入策略中,咱们仅容许回声应答、而在输出策略中,咱们仅容许回声请求。

nft add rule inet filter input iifname enpXsY icmp type { echo-reply, destination-unreachable, time-exceeded } limit rate 1/second accept
nft add rule inet filter input iifname enpXsY ip protocol icmp drop
复制代码

最后,咱们记录并丢弃全部无效数据包。

nft add rule inet filter input iifname enpXsY ct state invalid log flags all level info prefix \”Invalid-Input: \”
nft add rule inet filter input iifname enpXsY ct state invalid drop
复制代码

转发和输出策略

在转发和输出策略中,默认状况下咱们将丢弃数据包,仅接受已创建链接的数据包。

nft add chain inet filter forward { type filter hook forward priority 0 \; counter \; policy drop \; }
nft add rule inet filter forward ct state established, related accept
nft add rule inet filter forward ct state invalid drop
nft add chain inet filter output { type filter hook output priority 0 \; counter \; policy drop \; }
复制代码

典型的桌面用户只须要端口 80 和 443 便可访问互联网。最后,容许可接受的 ICMP 协议并在记录无效数据包时丢弃它们。

nft add rule inet filter output oifname enpXsY tcp dport { 80, 443 } ct state established accept
nft add rule inet filter output oifname enpXsY icmp type { echo-request, destination-unreachable, time-exceeded } limit rate 1/second accept
nft add rule inet filter output oifname enpXsY ip protocol icmp drop
nft add rule inet filter output oifname enpXsY ct state invalid log flags all level info prefix \”Invalid-Output: \”
nft add rule inet filter output oifname enpXsY ct state invalid drop
复制代码

如今咱们必须保存咱们的规则集,不然从新启动时它将丢失。为此,请运行如下命令:

sudo nft list ruleset. > /etc/nftables.conf
复制代码

咱们须在引导时加载 nftables,如下将在 systemd 中启用 nftables 服务:

sudo systemctl enable nftables
复制代码

接下来,编辑 nftables 单元文件以删除 Execstop 选项,以免在每次引导时刷新规则集。该文件一般位于 /etc/systemd/system/sysinit.target.wants/nftables.service。如今从新启动nftables:

sudo systemctl restart nftables
复制代码

在 rsyslog 中记录日志

当你记录丢弃的数据包时,它们直接进入 syslog,这使得读取该日志文件很是困难。最好将防火墙日志重定向到单独的文件。在 /var/log 目录中建立一个名为 nftables 的目录,并在其中建立两个名为 input.logoutput.log 的文件,分别存储输入和输出日志。确保系统中已安装 rsyslog。如今转到 /etc/rsyslog.d 并建立一个名为 nftables.conf 的文件,其内容以下:

:msg,regex,”Invalid-Input: “ -/var/log/nftables/Input.log
:msg,regex,”Invalid-Output: “ -/var/log/nftables/Output.log & stop
复制代码

如今,咱们必须确保日志是可管理的。为此,使用如下代码在 /etc/logrotate.d 中建立另外一个名为 nftables 的文件:

/var/log/nftables/* { rotate 5 daily maxsize 50M missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog rotate > /dev/null endscript }
复制代码

从新启动 nftables。如今,你能够检查你的规则集。若是你以为在终端中键入每一个命令很麻烦,则可使用脚原本加载 nftables 防火墙。我但愿本文对保护你的系统有用。


via: opensourceforu.com/2019/10/tra…

做者:Vijay Marcel D 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索