nftables配置参考资料.docx
- 文档编号:11528266
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:20
- 大小:23.54KB
nftables配置参考资料.docx
《nftables配置参考资料.docx》由会员分享,可在线阅读,更多相关《nftables配置参考资料.docx(20页珍藏版)》请在冰点文库上搜索。
nftables配置参考资料
nftables配置
一、概述
nftables包过滤框架历史小解:
配置详解:
此文档的内容是根据上面的nftables配置详解的链接进行翻译整理的,有些地方可能有错误,对于有问题的地方,可以去上面的英文网站查询,同时对于一些不需要了解的内容,在文中只给出了链接。
nftables配置分为表、链、规则三个层次,示例如下:
tableipfilter64bytesfromicmp_req=1ttl=64time=ms
然后,如果我们列出规则集,我们获得:
%nft-nnlisttablefilter
tableipfilter{
chaininput{
typefilterhookinputpriority0;
}
chainoutput{
typefilterhookoutputpriority0;
ipdaddrcounterpackets1bytes84
tcpdport22counterpackets0bytes0
}
}
请注意,计数器已更新。
、在给定位置添加规则
如果要在给定位置添加规则,则必须使用句柄作为参考:
%nftlisttablefilter-n-a
tablefilter{
chainoutput{
typefilterhookoutputpriority0;
ipprotocoltcpcounterpackets82bytes9680#handle8
ipsaddripdaddrdrop#handle7
}
}
如果要在处理程序编号为8的规则之后添加规则,则必须键入:
%nftaddrulefilteroutputposition8ipdaddrdrop
现在,您可以通过列出规则集来检查该命令的效果:
%nftlisttablefilter-n-a
tablefilter{
chainoutput{
typefilterhookoutputpriority0;
ipprotocoltcpcounterpackets190bytes21908#handle8
ipdaddrdrop#handle10
ipsaddripdaddrdrop#handle7
}
}
如果要在具有处理程序编号8的规则之前插入规则,则必须键入:
%nftinsertrulefilteroutputposition8ipdaddrdrop
、删除规则
您必须通过-a选项获取删除规则的句柄。
句柄由内核自动分配,它唯一地标识规则。
%nftlisttablefilter-a
tableipfilter{
chaininput{
typefilterhookinputpriority0;
}
chainoutput{
typefilterhookoutputpriority0;
ipdaddrcounterpackets1bytes84#handle5
}
}
可以使用以下命令删除句柄为5的规则:
%nftdeleterulefilteroutputhandle5
注意:
有计划通过传递以支持删除规则:
%nftdeleterulefilteroutputipsaddrcounter
但这还没有实现。
因此,您必须使用句柄来删除规则,直到实现该特性。
、删除一条链中的所有规则
您可以使用以下命令删除链中的所有规则:
%nftdeleterulefilteroutput
您还可以使用以下命令删除表中的所有规则:
%nftflushtablefilter
、在最前面添加新规则
要通过insert命令预先添加新规则:
%nftinsertrulefilteroutputipdaddrcounter
这预先附加了一个规则,该规则将针对寻址到的流量更新每个规则包和字节计数器。
在iptables中的等价是:
%iptables-IOUTPUT-tfilter-d请注意,iptables总是提供每个规则的计数器。
、替换规则
您可以通过指定规则句柄通过replace命令替换任何规则。
因此,首先必须列出带有选项-a的规则集,以获取规则句柄。
#nftlistruleset-a
tableipfilter{
chaininput{
typefilterhookinputpriority0;policyaccept;
ipprotocoltcpcounterpackets0bytes0#handle2
}
}
然后,假设您想要使用句柄号2替换规则,则必须指定此句柄号和要放置的新规则,而不是它:
nftreplacerulefilterinputhandle2counter
然后,当列出规则集时:
#nftlistruleset-a
tableipfilter{
chaininput{
counterpackets0bytes0
}
}
您可以有效地注意到,该规则已被替代为计数任何数据包的简单规则,而不是如前面的规则那样计数TCP数据包。
、原子规则替换
您可以使用-f选项自动更新规则集:
%nft-ffile
其中file包含您的规则集
您可以通过将现有列表存储在文件中来保存规则集,即。
%nftlisttablefilter>filter-table
然后,您可以使用-f选项恢复它:
%nft-ffilter-table
如果您在过滤器表文件的最开始处预置flush表过滤器行,您将实现原子规则集替换,等同于iptables-restore提供的内容。
注意,内核在一个事务中处理文件中的规则命令,因此基本上新规则的刷新和加载发生在一个单独的事务中。
有些人喜欢用规则集来维护一个shell脚本文件。
注意这种方法,你不能使用shell脚本文件来实现原子规则集更新。
因此,最好的方法是使用本机nftables脚本功能,并通过nft-f恢复规则集。
、从命令行报告错误
当您使用错误的数据类型时,nft命令行实用程序会尝试帮助您。
以下示例显示如果将IPv4地址作为TCP端口传递,则错误输出。
%nftaddrulefilterinputtcpdportcounterdrop
1:
33-39:
Error:
Couldnotresolveservice:
Servnamenotsupportedforai_socktype
addrulefilterinputtcpdportcounterdrop
如果命令不完整,典型输出如下:
%nftaddrulefilterinputtcpdport
1:
32-32:
Error:
syntaxerror,unexpectedendoffile
addrulefilterinputtcpdport
、通过表达式构建规则
nftables提供以下内置操作:
NE表示不相等,或者你可以使用!
=
LT表示小于,或者你可以使用<
GT表示大于,或者你可以使用>
LE表示小于等于,或者你可以使用<=
GE表示大于等于,或者你可以使用>=
注意:
如果您使用来自shell的符号<和>,因为它会将它们分别解释为标准输入和输出重定向。
你需要逃避他们,例如。
\<。
以下示例显示如何匹配未到端口TCP/22的所有传入流量。
nftaddrulefilterinputtcpdport!
=22
同样,您也可以使用以下命令匹配到达高端口的流量:
nftaddrulefilterinputtcpdport>=1024
、规则集级别的操作
、使用原生nft语法
LinuxKernel包括一些有关管理您的规则集作为一个整体的可用操作的改进。
1、查看规则集清单
列出完整的规则集
%nftlistruleset
列出每个系列的规则集
%nftlistrulesetarp
%nftlistrulesetip
%nftlistrulesetip6
%nftlistrulesetbridge
%nftlistrulesetinet
这些命令将打印给定系列的所有表/链/集/规则。
2、删除规则集
此外,您还可以冲洗(擦除,删除,擦除)完整的规则集:
%nftflushruleset
也适用于每个系列:
%nftflushrulesetarp
%nftflushrulesetip
%nftflushrulesetip6
%nftflushrulesetbridge
%nftflushrulesetinet
3、备份和还原
您可以组合以上两个命令来备份您的规则集:
%echo"nftflushruleset">
%nftlistruleset>>
并原子加载:
%nft-f
4、以XML或JSON格式
您还可以以XML或JSON格式导出规则集。
%nftexportxml>
%nftexportjson>
注意,导出操作输出所有家庭(ip,ip6,inet,arp,bridge)的所有表。
、监视规则集更新
nft可以通过以下方式显示规则集更新的通知:
%nftmonitor
这将订阅任何种类的规则集更新。
您可以按以下类型过滤掉事件:
object:
tables,chains,rules,setsandelements.
event:
newanddestroy.
输出格式可以是:
plaintext(ie.nativenftformat)
xml
json
以下示例显示了如何跟踪规则更新:
%nftmonitorrules
如果您只想接收新规则:
%nftmonitornewrules
有点更发达的例子
在终端中键入以下内容:
term1%nftmonitor
从不同的终端,如果你键入:
term2%nftaddtableinetfilter
term2%nftaddchaininetfilterforward
term2%nftaddruleinetfilterforwardcounteraccept
term2%nftflushtableinetfilterforward
term2%nftflushruleset
然后,如果你回到term1,你会看到:
term1%nftmonitor
addtableinetfilter
addchaininetfilterforward
addruleinetfilterforwardcounterpackets0bytes0accept
deleteruleinetfilterforwardhandle4
deletechaininetfilterforward
deletetableinetfilter
、脚本
三、数据包匹配支持的选项
、匹配数据包报头字段
nft命令行实用程序支持以下的第4层协议:
AH,ESP,UDP,UDPlite,TCP,DCCP,SCTP和IPComp。
、匹配传输协议
以下规则显示如何匹配任何类型的TCP流量:
%nftaddrulefilteroutputipprotocoltcp
、匹配以太网头字段
如果要匹配目标地址为ff:
ff:
ff:
ff:
ff:
ff的以太网流量,可以键入以下命令:
%nftaddrulefilterinputetherdaddrff:
ff:
ff:
ff:
ff:
ffcounter
不要忘记,第2层头信息仅在input路径中可用。
、匹配IPv4报头字段
您还可以根据IPv4源和目标匹配流量,以下示例显示如何计入来自并且发往的所有流量:
%nftaddrulefilterinputipsaddripdaddrcounter
请注意,由于规则附加到输入链,本地机器需要使用地址,否则您将看不到任何匹配的;-)。
要过滤像TCP这样的第4层协议,可以使用protocol关键字:
%nftaddrulefilterinputprotocoltcpcounter
、匹配Ipv6标头字段
如果要计算寻址到abdc:
:
100的IPv6流量,可以键入以下命令:
%nftaddrulefilteroutputip6daddrabcd:
:
100counter
要过滤像TCP这样的第4层协议,可以使用nexthdr关键字:
%nftaddrulefilterinputip6nexthdrtcpcounter
不要忘记创建一个ip6表并注册相应的链来运行下面的例子:
、匹配TCP/UDP/UDPlite流量
以下示例显示如何丢弃低TCP端口(1-1024)的所有tcp流量:
%nftaddrulefilterinputtcpdport1-1024counterdrop
请注意,此规则使用间隔(从1到1024)
要匹配TCP标志,需要使用二进制操作。
例如,要计数非SYNC的数据包:
%nftaddrulefilterinputtcpflags!
=syncounter
可以使用更复杂的过滤器。
例如,要计数和记录标志SYN和ACK设置的TCP数据包:
%nft-i
nft>addrulefilteroutputtcpflags&(syn|ack)==syn|ackcounterlog
、匹配ICMP流量
您可以通过以下方式删除所有ICMP回显请求(通常称为ping):
%nftaddrulefilterinputicmptypeecho-requestcounterdrop
这里是可用的icmp类型的列表:
名称
说明
echo-reply
回声应答
destination-unreachable
目的地不可达
source-quench
来源淬火
redirect
重定向
echo-request
time-exceeded
时间超过
parameter-problem
参数问题
timestamp-request
时间戳请求
timestamp-reply
时间戳回复
info-request
信息请求
info-reply
信息回复
address-mask-request
地址掩码请求
address-mask-reply
地址掩码回复
、匹配数据包元信息
nftables附带了分组元信息选择器,您可以使用它来匹配存储在网络数据包中的元信息。
、元选择器
您可以匹配的当前元信息是:
接口设备名称和接口设备索引:
iifname,oifname,iifandoif.
接口类型:
iiftyteandoiftype.
TC手柄:
priority.
socketuserandgroup标识:
skuidandskgid.
包长度:
length.
、按接口名称匹配数据包
您可以使用以下选择器来匹配接口名称:
iifname,用来匹配输入网络接口名称。
oifname,用来匹配输出网络接口名称。
IIF,用来匹配网络接口名称的接口索引。
这比iifname快,因为它只需要比较一个32位无符号整数而不是一个字符串。
接口索引是动态分配的,因此不要将其用于动态创建和销毁的接口,例如。
ppp0。
OIF,像iif,但它匹配输出网络接口索引。
接口名称的示例用法如下:
%nftaddrulefilterinputmetaoifnameloaccept
此规则接受环回伪设备lo的所有流量。
、按包标记匹配数据包
您可以使用以下规则匹配标记为123的数据包:
nftaddrulefilteroutputmetamark123counter
、匹配数据包的套接字UID
您可以使用您的用户名来匹配流量,例如。
%nftaddrulefilteroutputmetaskuidpablocounter
或者在给定用户的/etc/passwd中没有条目的情况下,使用32位无符号整数(UID)。
%nftaddrulefilteroutputmetaskuid1000counter
让我们只是生成一些HTTP流量来测试此规则:
%wget--spider然后,如果检查计数器,您可以验证数据包是否匹配该规则。
%nftlisttablefilter
tableipfilter{
chainoutput{
typefilterhookoutputpriority0;
skuidpablocounterpackets7bytes510
}
chaininput{
typefilterhookinputpriority0;
}
}
重要:
请注意,如果您使用ping测试,通常使用suid安装,以便流量匹配root用户(uid=0)。
、匹配连接跟踪状态元信息
正如在iptables中一样,您可以匹配Netfilter通过连接跟踪系统收集的状态跟踪信息(有时称为conntrack或ct信息)以部署状态防火墙。
、匹配conntrack信息
nftables提供了ct选择器,可以用来匹配:
1、状态信息:
new,established,relatedandinvalid.在这方面,与iptables没有改变;
2、conntrack的标志;
、匹配状态信息
以下示例说明如何使用nftables部署极为简单的状态防火墙:
nftaddrulefilterinputctstateestablished,relatedcounteraccept#1
nftaddrulefilterinputcounterdrop#2
规则#1允许作为与网络已经建立的通信的一部分的分组。
因此,从网络中的计算机到达您的计算机的任何尝试将被删除。
但是,作为您已启动的流的一部分的流量将被接受。
请注意,上面的示例使用逗号分隔的您要匹配的状态列表。
如果你不熟悉Netfilter数据流状态机,可以快速阅读一下:
、匹配conntrack标记
以下示例显示如何根据conntrack标记匹配数据包:
nftaddrulefilterinputctmark123counter
要了解更多的关于链接跟踪标记和标记数据包,请查阅下面链接:
、速率限制匹配
您可以通过限速对流量进行限制。
以下示例显示如何每秒接受最多10个ICMP回显请求数据包:
%nftaddrulefilterinputicmptypeecho-requestlimitrate10/secondaccept
从Linux内核,你也可以ratelimit每个字节:
%nftaddrulefilterinputlimitrate10mbytes/secondaccept
以上规则接受低于10mbytes/秒速率的流量。
您还可以使用burst参数指示可以超过速率限制的数据包/字节数:
%nftaddrulefilterinputlimitrate10mbytes/secondburst9000kbytesaccept
这表示您可以超过9000kbytes的时候进行速率限制。
您还可以将其用于数据包:
%nftaddrulefilterinputicmptypeecho-requestlimitrate10/secondburst2packetscounteraccept
所以你可以超过2包每秒后进行速率限制。
限制表达式,您可以将其用于来自入口的流量监管,作为来自新netdev系列的tc的替代。
四、对数据包支持的处理措施
、接受和丢弃数据包
、丢弃数据包
您可以使用drop选项丢弃数据包。
请注意,drop是一个终止操作,因此您无法在其后添加任何其他操作(此操作放在其他所有操作之后)。
nftaddrulefilteroutputdrop
请注意,当测试这个,你可能会失去任何互联网连接:
-)。
、接受包
接受任何类型流量的简单规则是:
nftaddrulefilteroutputaccept
您可以向该规则添加计数器:
nftaddrulefilteroutputcounteraccept
因此,您可以观看所有流量实际接受:
nftlisttablefilter
tableipfilter{
chainoutput{
typefilterhookoutputpriority0;
counterpackets1bytes84accept
}
}
、跳到链
像iptables一样,你可以使用链的树来构造你的规则集。
为此,您首先需要通过以下方式创建自定义链:
%nftaddchainipfiltertcp-chain
上面的示例创建了tcp链,将用于添加规则以过滤tcp流量,例如。
%nftaddruleipfilterinputipprotocoltcpjumptcp-chain
我们可以添加一个简单的规则到tcp-chain来计算包和字节:
%nftaddruleipfiltertcp-chaincounter
列表应该显示:
%nftlisttablefilter
tableipfilter{
chaininput{
typefilterhookinputpriority0;
ipprotocoltcpjumptcp-chain
}
chaintcp-chain{
counterpackets8bytes2020
}
}
计数器应通过生成简单的TCP流量来更新。
注意:
您只能跳转到非基本链。
、jump与goto
请注意
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- nftables 配置 参考资料