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 网络编程
每月 17,540 次下载
用于 2 crates
60KB
1K SLoC
通过其在 Rust 中的声明性和命令式 JSON API 自动化现代 Linux 防火墙。
特性 🌟
-
🛡️ 安全且易于使用的抽象:提供对 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版本(《LICENSE-APACHE》或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
供您选择。
贡献
除非您明确声明,否则任何旨在包含在本作品中的贡献,如Apache-2.0许可证中定义,均应按上述方式双许可,无需附加条款或条件。
维护者
该项目目前由以下开发人员维护
姓名 | 电子邮箱地址 | GitHub用户名 |
---|---|---|
Jasper Wiegratz | [email protected] | @jwhb |
依赖
~0.8–1.8MB
~38K SLoC