#pcap #packet #sockets #send-receive #wpcap #pf-ring

rawsock

用于接收和发送原始数据包的库。尽管大多数 crate 只封装一个库,但 rawsock 允许您使用 pcap、wpcap、npicap 和 pf_ring(pfring),同时使用一个统一的 API。

5 个不稳定版本

0.3.0 2019 年 8 月 11 日
0.2.1 2019 年 7 月 27 日
0.2.0 2019 年 7 月 14 日
0.1.1 2019 年 7 月 14 日
0.1.0 2019 年 7 月 13 日

#28 in #send-receive

MIT 许可证

85KB
1.5K SLoC

rust-rawsock

Travis CI Crates CI Docs

概述

rawsock 是一个 Rust 库,极大地简化了使用如 pcapwpcappf_ring 等数据包捕获库,以及具有兼容 API 的库(如 npcap)。它可以帮助您使用一个统一的 API 发送和接收所有这些库的原始套接字帧,从而隐藏内部复杂性。

主要优势:您使用一个简单的 API 编写代码 - rawsock。但是,当您的应用程序运行时,后台会选择并使用用户机器上最佳的库。平台特定的扩展(如 WinPcap 的 pcap_sendqueue_transmit())也会以最佳方式使用。

主要功能

  • 为所有数据包捕获库提供一个统一的 API。
  • 支持 pcap、wpcap(带 Windows 特定优化)、npicap 和 pfring
  • 支持所有主要平台:在 Windows、Linux、Mac 上进行测试。许多其他平台也应工作
  • 库以动态方式加载,因此库没有直接依赖关系 - 它将与给定平台上可用的任何内容一起工作。
  • 按照有效性顺序检查库。加载最佳发现的库。
  • 在使用 rawsock API 时也可以加载特定的库,或直接使用动态加载的库的 API - 用于更高级的使用案例。

快速示例

extern crate rawsock;
use rawsock::open_best_library;

const ICMP_PACKET: [u8; 84] = [
0x45, 0x00, 0x00, 0x54, 0xee, 0x96, 0x40, 0x00, 0x40, 0x01, 0x79, 0xf0, 0xc0, 0xa8, 0x01, 0x6a,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x2f, 0x08, 0x66, 0xc2, 0x00, 0x12, 0x82, 0xaa, 0xcc, 0x5c,
0x00, 0x00, 0x00, 0x00, 0x51, 0x49, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33,
0x34, 0x35, 0x36, 0x37];

fn main() {

    /*
    This example shows automatic choosing of the best underlying library available on your system
    and dynamic dispatch of calls to the right implementation.

    For most applications this is the recommended approach.
    */
    println!("Opening packet capturing library");
    let lib = open_best_library().expect("Could not open any packet capturing library");
    println!("Library opened, version is {}", lib.version());
    let interf_name = "eth0"; //replace with whatever is available on your platform
    println!("Opening the {} interface", interf_name);
    let mut interf = lib.open_interface(&interf_name).expect("Could not open network interface");
    println!("Interface opened, data link: {}", interf.data_link());

    //send some packets
    println!("Sending 5 packets:");
    for i in 0..5{
        println!("Sending ICMP ping packet no {}",i);
        interf.send(&ICMP_PACKET).expect("Could not send packet");
    }

    //receive some packets.
    println!("Receiving 5 packets:");
    for _ in 0..5 {
        let packet = interf.receive().expect("Could not receive packet");
        println!("Received packet: {}", packet);
    }
}

更高级的示例

用法

Cargo.toml

[dependencies]
rawsock = "0.1"

许可证

这是免费软件,根据 MIT 许可证授权。

依赖项

~3MB
~65K SLoC