This project aims at providing building blocks for the netlink
protocol (see man 7 netlink).
The netlink protocol is huge but the some subprotocols are widely used:
- the generic netlink protocol, used to create custom IPCs
- the
rtnetlinkprotocol (seeman 7 rtnetlink), for manipulating the network stack - the
auditprotocol to interact with Linux audit system - the
sock_diagprotocol (seeman 7 sock_diag) to monitor sockets
- the
netlink_syscrate provides netlink sockets. Integration withmioandtokiois optional. - Each netlink protocol has a
netlink-packet-<protocol_name>crate that provides the packets for this protocol:netlink-packet-routeprovidesRtnlMessagewhich represents messages for the route protocolnetlink-packet-auditprovidesAuditMessagewhich represents messages for the audit protocol
- the
netlink-packet-coreis the glue for all the othernetlink-packet-*crates. I provides a uniqueNetlinkMessage<T>type that represent any netlink message for any sub-protocol. - the
netlink_protocrate an asynchronous implementation of the netlink protocol. It only depends onnetlink-packet-corefor theNetlinkMessagetype andnetlink-sysfor the socket. - the
rtnetlinkcrate provides higher level abstraction for the route protocol (seeman 7 rtnetlink). This is probably what users want to use, if they want to manipulate IP addresses, route tables, etc. - the
auditcrate provides higher level abstractions for the audit protocol.
- https://github.com/jbaublitz/neli: the main alternative to these crates, as it is actively developed.
- Other but less actively developed alternatives:
libnl: netlink implementation in C. Very complete with awesome documentation.pyroute2: a very complete and readable implementation in pure python.netlink: a very complete and very actively maintained go project, seems to be widely used.
My main resource so far has been the source code of
pyroute2
and netlink a lot. These two
projects are great, and very nicely written. As someone who does not read C
fluently, and that does not know much about netlink, they have been invaluable.
I'd also like to praise libnl for
its documentation. It helped me a lot in understanding the protocol basics.
The whole packet parsing logic is inspired by @whitequark excellent blog posts
(part 1,
part 2
and part 3,
although I've only really used the concepts described in the first blog post).
These ideas are also being used in @m-labs's
smoltcp project.
Thanks also to the people behing tokio, especially @carllerche, for the amazing tool they are building, and the support they provide. The project structure and code quality are mind blowing, and some parts of this projects are basically rip-offs from tokio's source code
Finally, thanks to the Rust community, which helped me on multiple occasions
Other resources I particularly appreciated: