内核层仅提供通用的与协议无关的接口,提供从数据包中提取数据、执行数据操作和流量控制的基本功能。 过滤规则和特定于协议的处理程序在用户空间中编译为字节码,然后使用 Netlink 接口将该字节码加载到内核中,并在内核中的特殊虚拟机(类似于 BPF(伯克利数据包过滤器))中执行。 这种方法允许您显着减少在内核级别运行的过滤代码的大小,并将用于处理协议的解析规则和逻辑的所有功能移至用户空间。
主要创新:
- 集合中添加了对与集合元素关联的数据包和流量计数器的支持。 使用“counter”关键字启用计数器:
表 ip x {
设置 y {
ip Saddr 类型
对付
元素 = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}链 z {
type过滤器钩子输出优先级过滤器; 政策接受;
ip 爸爸@y
}
} - 要设置计数器的初始值,例如重启后恢复之前的计数器,可以使用命令“nft -f”:
# 猫规则集.nft
表 ip x {
设置 y {
ip Saddr 类型
对付
elements = { 192.168.10.35 计数器数据包 1 字节 84, 192.168.10.101 \
计数器 p 192.168.10.135 计数器数据包 0 字节 0 }
}链 z {
type过滤器钩子输出优先级过滤器; 政策接受;
ip 爸爸@y
}
}
# nft -f 规则集.nft
#nft 列表规则集
表 ip x {
设置 y {
ip Saddr 类型
对付
elements = { 192.168.10.35 计数器数据包 1 字节 84, 192.168.10.101 \
计数器 p 192.168.10.135 计数器数据包 0 字节 0 }
}链 z {
type过滤器钩子输出优先级过滤器; 政策接受;
ip 爸爸@y
}
} - flowtable 中还添加了计数器支持:
表 ip foo {
可流动的酒吧{
钩子入口优先级-100
设备 = { eth0, eth1 }
对付
}连锁前进{
类型过滤器钩子转发优先级过滤器;
流程添加@bar计数器
}
}您可以使用命令“conntrack -L”查看计数器列表:
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 数据包=9 字节=608 \
src = 10.0.1.2 dst = 10.0.1.1 sport = 5201 dport = 47278数据包= 8字节= 428 [卸载]标记= 0 \
secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
数据包=1005763字节=44075714753 src=10.0.1.2 dst=10.0.1.1运动=5201 dport=47280 \
数据包 = 967505 字节 = 50310268 [卸载] 标记 = 0 secctx = null 使用 = 2 - 在用于串联的集合中(串联,某些简化比较的地址和端口包),可以使用“typeof”指令,它确定集合元素的组成部分的元素的数据类型:
表 ip foo {
设置白名单{
ip Saddr 类型。 TCP 数据端口
元素={192.168.10.35。 80、192.168.10.101。 80}
}链杆{
type 过滤器钩子预路由优先级过滤器; 政策下降;
ip 爸爸。 tcp dport @whitelist 接受
}
} - typeof 指令现在也适用于映射列表中的连接:
表 ip foo {
地图地址2标记{
ip Saddr 类型。 tcp dport : 元标记
元素={192.168.10.35。 80:0x00000001,
192.168.10.135。 80:0x00000002}
}链杆{
type 过滤器钩子预路由优先级过滤器; 政策下降;
元标记设置 ip baddr 。 tcp dport 映射 @addr2mark 接受
}
} - 添加了对匿名(未命名)集中的范围连接的支持:
# nft 添加规则 inet 过滤器输入 ip baddr 。 TCP 数据端口\
{ 10.0.0.0/8 。 10-23、192.168.1.1-192.168.3.8。 80-443}接受 - 提供在处理网桥时丢弃带有 802.1q (VLAN) 标志的数据包的功能:
# nft 添加规则网桥 foo bar ether 类型 vlan 拒绝并重置 TCP
- 添加了对 TCP 会话标识符 (conntrack ID) 匹配的支持。 要确定 conntrack ID,您可以使用“--output id”选项:
# conntrack -L —输出 ID
udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 数据包=2 \
字节=122 src=192.168.2.1 dst=192.168.2.118 运动=53 dport=36424 数据包=2 字节=320 \
[确定] 标记=0 使用=1 id=2779986232# nft 添加规则 foo bar ct id 2779986232 计数器
来源: opennet.ru