nftables 数据包过滤器 0.9.1 发布

经过一年的发展 提交 数据包过滤器释放 nftables 0.9.1,通过统一 IPv6、IPv4、ARP 和网桥的数据包​​过滤接口,开发作为 iptables、ip6table、a​​rptables 和 ebtables 的替代品。 nftables 软件包包括在用户空间中运行的数据包过滤器组件,而内核级工作由 nf_tables 子系统提供,该子系统自 3.13 版本以来一直是 Linux 内核的一部分。

内核层仅提供通用的与协议无关的接口,提供从数据包中提取数据、执行数据操作和流量控制的基本功能。
过滤逻辑本身和特定于协议的处理程序在用户空间中编译为字节码,然后使用 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

添加评论