#json-api #firewall #ruleset #netfilter #json-parser #abstraction #create

bin+lib nftables

对 nftables JSON API 的安全抽象。它可用于在 Rust 中创建 nftables 规则集,并从 JSON 解析现有的 nftables 规则集。

8 个版本

0.4.1 2024 年 6 月 1 日
0.4.0 2024 年 3 月 16 日
0.3.0 2024 年 1 月 22 日
0.2.4 2023 年 8 月 12 日
0.2.0 2022 年 10 月 4 日

#79 in 网络编程

Download history 1331/week @ 2024-05-02 3983/week @ 2024-05-09 4026/week @ 2024-05-16 4311/week @ 2024-05-23 5535/week @ 2024-05-30 4258/week @ 2024-06-06 4331/week @ 2024-06-13 3958/week @ 2024-06-20 4487/week @ 2024-06-27 4505/week @ 2024-07-04 4464/week @ 2024-07-11 4174/week @ 2024-07-18 4289/week @ 2024-07-25 4511/week @ 2024-08-01 4229/week @ 2024-08-08 3684/week @ 2024-08-15

每月 17,540 次下载
用于 2 crates

MIT/Apache

60KB
1K SLoC

Logo
nftables-rs

通过其在 Rust 中的声明性和命令式 JSON API 自动化现代 Linux 防火墙。

Crates.io Total Downloads rs Actions Workflow Status License


特性 🌟

  • 🛡️ 安全且易于使用的抽象:提供对 nftables JSON API 的高级、安全抽象,使得在 Rust 中处理 nftables 更加容易和安全。

  • 🛠️ 全面的功能:包括创建、读取和直接从 Rust 应用程序应用 nftables 规则集的广泛函数,简化防火墙规则的管理。

  • 📄 JSON 解析和生成:提供对 JSON 格式 nftables 规则集的详细解析和生成能力,实现规则集的无缝集成和操作。

  • 💡 受 nftnl-rs 启发:虽然受到 nftnl-rs 的启发,但 nftables-rs 专注于利用 JSON API 以提供更广泛的可用性和满足各种用例。

动机

nftables-rs 是一个 Rust 库,旨在提供对 nftables JSON API(称为 libnftables-json)的安全和易于使用的抽象。

此库是为需要直接从 Rust 应用程序与 nftables(Linux 内核的下一代防火墙工具)交互的开发者而设计的。通过抽象底层的 JSON API,nftables-rs 便于创建、操作和应用防火墙规则集,无需深入了解 nftables 的内部工作原理。

安装

[dependencies]
nftables = "0.3.0"

需要运行时 Linux nftables v0.9.3 或更高版本:nft --version

示例

以下是展示此库用例的一些示例。查看 tests/ 目录以获取更多使用示例。

将规则集应用于nftables

此示例将创建和删除表的规则集应用于nftables。

use nft::{batch::Batch, helper, schema, types};

/// Applies a ruleset to nftables.
fn test_apply_ruleset() {
    let ruleset = example_ruleset();
    nft::helper::apply_ruleset(&ruleset, None, None).unwrap();
}

fn example_ruleset() -> schema::Nftables {
    let mut batch = Batch::new();
    batch.add(schema::NfListObject::Table(schema::Table::new(
        types::NfFamily::IP,
        "test-table-01".to_string(),
    )));
    batch.delete(schema::NfListObject::Table(schema::Table::new(
        types::NfFamily::IP,
        "test-table-01".to_string(),
    )));
    batch.to_nftables()
}

以JSON格式解析/生成nftables规则集

此示例比较了nftables的本地JSON输出与此库生成的JSON有效负载。

fn test_chain_table_rule_inet() {
    // nft add table inet some_inet_table
    // nft add chain inet some_inet_table some_inet_chain '{ type filter hook forward priority 0; policy accept; }'
    let expected: Nftables = Nftables {
        objects: vec![
            NfObject::CmdObject(NfCmd::Add(NfListObject::Table(Table {
                family: NfFamily::INet,
                name: "some_inet_table".to_string(),
                handle: None,
            }))),
            NfObject::CmdObject(NfCmd::Add(NfListObject::Chain(Chain {
                family: NfFamily::INet,
                table: "some_inet_table".to_string(),
                name: "some_inet_chain".to_string(),
                newname: None,
                handle: None,
                _type: Some(NfChainType::Filter),
                hook: Some(NfHook::Forward),
                prio: None,
                dev: None,
                policy: Some(NfChainPolicy::Accept),
            }))),
        ],
    };
    let json = json!({"nftables":[{"add":{"table":{"family":"inet","name":"some_inet_table"}}},{"add":{"chain":{"family":"inet","table":"some_inet_table","name":"some_inet_chain","type":"filter","hook":"forward","policy":"accept"}}}]});
    println!("{}", &json);
    let parsed: Nftables = serde_json::from_value(json).unwrap();
    assert_eq!(expected, parsed);
}

许可证

许可方式任选其一

供您选择。

贡献

除非您明确声明,否则任何旨在包含在本作品中的贡献,如Apache-2.0许可证中定义,均应按上述方式双许可,无需附加条款或条件。

维护者

该项目目前由以下开发人员维护

姓名 电子邮箱地址 GitHub用户名
Jasper Wiegratz [email protected] @jwhb

依赖

~0.8–1.8MB
~38K SLoC