2 个版本
0.1.1 | 2019年1月2日 |
---|---|
0.1.0 | 2019年1月2日 |
#5 in #rtnetlink
用于 ipwatch
345KB
7.5K SLoC
netlink-rs
本项目旨在为 netlink 协议 提供构建块(参见 man 7 netlink
)。
netlink 协议非常庞大,但最常用的两个子协议是 通用 netlink 协议 和 路由 netlink 协议(参见 man 7 rtnetlink
)。
本项目处于早期阶段,我目前主要关注路由和审计 netlink 协议。
文档
组织
netlink_sys
插件提供 netlink 套接字。与mio
和tokio
的集成是可选的。netlink_packet
插件定义了 netlink 消息,以及序列化和反序列化它们的方法。netlink_proto
插件提供 Tokio 集成。rtnetlink
插件为 路由协议 提供了高级抽象(参见man 7 rtnetlink
)。如果用户想要操作 IP 地址、路由表等,这可能就是他们想要使用的。audit
插件为审计协议提供了高级抽象。
Rust 中的其他 netlink 项目
在开始开发这个库之前,我已经检查了许多其他项目,但似乎没有一个是真正完整的。
- https://github.com/achanda/netlink:netlink 的 Rust 绑定。似乎并不实用,而且似乎已经不再开发。
- https://github.com/polachok/pnetlink:与该项目非常相似,但基于libpnet构建。作者似乎对netlink比我更有了解。它对路由netlink协议的覆盖范围更广(支持
RTM_{NEW,DEL,GET}ROUTE
和RTM_{NEW,DEL,GET}ADDRESS
消息)。然而,许多由rtnetlink
支持的属性并未涵盖。 - https://github.com/crhino/netlink-rs:libnl的rust绑定。非常不完整,且未开发。
- https://github.com/jbaublitz/neli:通用netlink协议。这是一个较新的项目,正在积极开发中。
- https://github.com/carrotsrc/rsnl:libnl的绑定。维护但未积极开发。
- https://github.com/TaborKelly/nl-utils:一个netlink数据包解析器。目标与本项目不完全相同。
其他非rust netlink项目
libnl
:C语言实现的netlink。功能非常完善,文档也非常优秀。pyroute2
:纯Python实现的非常完整和可读的实现。netlink
:一个非常完整且积极维护的go项目,看起来被广泛使用。
致谢
到目前为止,我的主要资源是pyroute2
和netlink
的源代码,我使用了大量的这两个项目。这两个项目非常出色,编写得非常好。作为一个不擅长阅读C语言的人,且对netlink了解不多的人,它们是无价的。
我还想赞扬libnl
的文档。它极大地帮助我理解了协议的基本知识。
整个数据包解析逻辑受到了@whitequark优秀的博客文章的启发(第一部分、第二部分和第三部分,尽管我实际上只真正使用了第一篇博客中描述的概念)。这些想法也被用于@m-labs的smoltcp
项目中。
还要感谢tokio背后的团队,特别是@carllerche,他们正在构建一个惊人的工具,并提供了支持。项目结构和代码质量令人叹为观止,本项目的某些部分基本上是tokio源代码的盗版。
最后,感谢Rust社区,它在多个场合帮助了我。
我特别欣赏的其他资源
依赖项
约605KB
约10K SLoC