本文将详细解释如何构建nftables,边肖认为这相当实用,所以我将分享给大家作为参考。希望你看完这篇文章能有所收获。
目前,有一个与nftables兼容的iptables-nft后端,但很快,甚至它不再可用。此外,正如红帽开发人员指出的,有时它可能会错误地转换规则。我们需要知道如何构建自己的nftables,而不是依赖iptables到nftables转换器。
在nftables中,所有地址族都遵循一个规则。与iptables不同,nftables在用户空间中运行,iptables中的每个模块都在内核(空间)中运行。它很少需要更新内核,并有一些新的功能,如映射,地址族和字典。
00-1010地址族决定了要处理的数据包的类型。nftables中有六个地址系列,它们是:
互联网协议(Internet Protocol的缩写)
ipv6
inet
阿尔普
桥梁
网络开发
在nftables中,ipv4和ipv6协议可以组合成一个名为inet的地址族。因此,我们不需要指定两个规则:一个用于ipv4,另一个用于ipv6。如果没有指定地址系列,它将默认为ip协议,即ipv4。我们对inet地址系列感兴趣,因为大多数家庭用户将使用ipv4或ipv6协议。
00-1010典型的nftables规则由三部分组成:表、链和规则。
是表链和规则的容器。他们通过他们的地址、家庭和名字来识别。它包含inet/arp/bridge/netdev等协议所需的规则,有三种类型:过滤、NAT和路由。Nftables规则可以从脚本中加载,也可以在终端中键入并保存为规则集。
对于家庭用户,默认链是一个过滤器。inet系列包含以下挂钩:
投入
输出
向前
预先布线
后路由
地址族
最大的问题之一就是我们是否可以使用防火墙脚本。答案是:这是你自己的选择。这里有一些建议:如果防火墙中有数百个规则,最好使用脚本,但是如果您是典型的家庭用户,您可以在终端中键入命令,然后(保存并重新启动)加载规则集。每种选择都有自己的优缺点。在本文中,我们将在终端中键入它们来构建防火墙。
Nftables使用名为nft的程序来添加、创建、列出、删除和加载规则。使用以下命令确保nftables安装有conntrackd和netfilter-persistent包,并删除iptables:
apt-getinstallinfotlocontracknetfilter-persistent apt-getpurgeitablenft需要以root用户身份或使用sudo运行。使用以下命令分别列出、刷新、删除规则集和加载脚本。
正如iptables一样,防火墙将包含三个部分:输入、转发和输出。在终端中,为输入策略键入以下命令。开始之前,请确保规则集已刷新。我们的默认策略将删除所有内容。我们将在防火墙中使用inet地址系列。添加以下规则作为根规则或使用sudo运行:
nftaddtableinetfilternftadchainetfiltrinput { typefilterhookinput priority 0 \;计数器\;
policy drop \; }
你会注意到有一个名为 priority 0
的东西。这意味着赋予该规则更高的优先级。挂钩通常赋予负整数,这意味着更高的优先级。每个挂钩都有自己的优先级,过滤器链的优先级为 0。你可以检查 nftables Wiki 页面以查看每个挂钩的优先级。
要了解你计算机中的网络接口,请运行以下命令:
ip link show
它将显示已安装的网络接口,一个是本地主机、另一个是以太网端口或无线端口。以太网端口的名称如下所示:enpXsY
,其中 X
和 Y
是数字,无线端口也是如此。我们必须允许本地主机的流量,并且仅允许从互联网建立的传入连接。
nftables 具有一项称为裁决语句的功能,用于解析规则。裁决语句为 accept
、drop
、queue
、jump
、goto
、continue
和 return
。由于这是一个很简单的防火墙,因此我们将使用 accept
或 drop
处理数据包。
nft add rule inet filter input iifname lo acceptnft 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\) dropnft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|rst\) == \(syn\|rst\) dropnft add rule inet filter input iifname enpXsY tcp flags \& \(fin\|rst\) == \(fin\|rst\) dropnft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|fin\) == fin dropnft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|psh\) == psh dropnft 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 acceptnft 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 acceptnft add rule inet filter forward ct state invalid dropnft 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 acceptnft add rule inet filter output oifname enpXsY icmp type { echo-request, destination-unreachable, time-exceeded } limit rate 1/second acceptnft add rule inet filter output oifname enpXsY ip protocol icmp dropnft 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.log
和 output.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 防火墙。
关于“怎么构建nftables”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/50275.html