经过一年的发展
内核层仅提供通用的与协议无关的接口,提供从数据包中提取数据、执行数据操作和流量控制的基本功能。
过滤逻辑本身和特定于协议的处理程序在用户空间中编译为字节码,然后使用 Netlink 接口将该字节码加载到内核中,并在特殊的虚拟机(例如 BPF(伯克利数据包过滤器))中执行。 这种方法允许您显着减少在内核级别运行的过滤代码的大小,并将用于处理协议的解析规则和逻辑的所有功能移至用户空间。
主要创新:
- IPsec 支持,允许基于数据包、IPsec 请求 ID 和 SPI(安全参数索引)标记进行隧道地址匹配。 例如,
... ip Saddr 192.168.1.0/24 中的 ipsec
... spi 中的 ipsec 1-65536还可以检查路由是否经过IPsec 隧道。 例如,要阻止不通过 IPSec 的流量:
… 过滤器输出 rt ipsec 丢失丢弃
- 支持 IGMP(互联网组管理协议)。 例如,您可以使用规则来丢弃传入的 IGMP 组成员资格请求
nft 添加规则 netdev foo bar igmp 类型成员资格查询计数器下降
- 使用变量定义转换链(跳转/转到)的可能性。 例如:
定义 dest = ber
添加规则 ip foo bar 跳转 $dest - 支持掩码根据标头中的 TTL 值识别操作系统(OS Fingerprint)。 例如,要根据发送方操作系统标记数据包,可以使用以下命令:
... 元标记设置 osf ttl 跳过名称映射 { "Linux" : 0x1,
“Windows”:0x2,
“MacOS”:0x3,
“未知”:0x0}
... osf ttl 跳过版本“Linux:4.20” - 能够匹配发送方的 ARP 地址和目标系统的 IPv4 地址。 例如,要增加从地址 192.168.2.1 发送的 ARP 数据包的计数器,可以使用以下规则:
表 arp x {
链 y {
type过滤器钩子输入优先级过滤器; 政策接受;
arp Saddr ip 192.168.2.1 计数器数据包 1 字节 46
}
} - 支持通过代理(tproxy)透明转发请求。 例如,要将对端口 80 的调用重定向到代理端口 8080:
表 ip x {
链 y {
类型过滤器钩子预路由优先级-150; 政策接受;
tcp dport 80 tproxy 到:8080
}
} - 支持标记套接字,并能够在 SO_MARK 模式下通过setsockopt()进一步获取设置标记。 例如:
表 inet x {
链 y {
类型过滤器钩子预路由优先级-150; 政策接受;
tcp dport 8080 标记 设置套接字标记
}
} - 支持指定链的优先级文本名称。 例如:
nft add chain ip x raw { 类型过滤器钩子预路由优先级 raw; }
nft add chain ip x filter { 类型过滤器钩子预路由优先级过滤器; }
nft add chain ip x filter_later { 类型过滤器钩子预路由优先级过滤器 + 10; } - 支持 SELinux 标签 (Secmark)。 例如,要在 SELinux 上下文中定义“sshtag”标签,您可以运行:
nft 添加 secmark inet 过滤器 sshtag“system_u:object_r:ssh_server_packet_t:s0”
然后在规则中使用这个标签:
nft 添加规则 inet 过滤器输入 tcp dport 22 元 secmark 设置“sshtag”
nft 添加映射 inet 过滤器 secmap { 类型 inet_service : secmark; }
nft 添加元素 inet 过滤器 secmapping { 22 : "sshtag" }
nft 添加规则 inet 过滤器输入元 secmark 设置 tcp dport 映射 @secmapping - 能够以文本形式指定分配给协议的端口,如 /etc/services 文件中定义的那样。 例如:
nft 添加规则 xy tcp dport“ssh”
nft 列表规则集 -l
表 x {
链 y {
...
TCP 数据端口“ssh”
}
} - 能够检查网络接口的类型。 例如:
添加规则 inet raw 预路由元 iifkind "vrf" 接受
- 通过显式指定“动态”标志,改进了对动态更新集内容的支持。 例如,要更新集合“s”以添加源地址,并在 30 秒内没有数据包时重置条目:
添加表x
添加设置 xs { 类型 ipv4_addr; 尺寸 128; 超时30s; 动态标志; }
添加链 xy { 类型过滤器钩子输入优先级 0; }
添加规则 xy update @s { ip Saddr } - 能够设置单独的超时条件。 例如,要覆盖到达端口 8888 的数据包的默认超时,您可以指定:
表 ip 过滤器 {
ct 超时激进-tcp {
协议tcp;
l3proto ip;
策略 = {已建立:100,close_wait:4,关闭:4}
}
链输出{
...
tcp dport 8888 ct 超时设置“aggressive-tcp”
}
} - 对 inet 系列的 NAT 支持:
表 inet nat {
...
ip6 baddr 死亡::2::1 dnat 死亡:2::99
} - 改进的拼写错误报告:
nft添加链式过滤器测试
错误:没有这样的文件或目录; 您指的是家庭 ip 中的“过滤器”表吗?
添加链式过滤器测试
^^^^^^^^ - 能够在集合中指定接口名称:
设置 SC {
输入 inet_service 。 如果名称
元素= {“ssh”。 “eth0”}
} - 更新了 Flowtable 规则语法:
nft 添加表 x
nft add flowtable x ft { 钩子入口优先级 0; 设备 = { eth0, wlan0 }; }
...
nft 添加规则 x 转发 ip 协议 { tcp, udp } flow add @ft - 改进了 JSON 支持。
来源: opennet.ru