Cross-platform, low level networking using the Rust programming language.

Overview

libpnet Crates.io License Documentation

Linux ∪ OS X Build Status: Linux ∪ OS X Build Status

Windows Build Status: Windows Build Status

Discussion and support: #libpnet on freenode / #rust-networking on irc.mozilla.org / #rust on irc.mozilla.org.

libpnet provides a cross-platform API for low level networking using Rust.

There are four key components:

  • The packet module, allowing safe construction and manipulation of packets;
  • The pnet_macros crate, providing infrastructure for the packet module;
  • The transport module, which allows implementation of transport protocols;
  • The datalink module, which allows sending and receiving data link packets directly.

Why?

There are lots of reasons to use low level networking, and many more to do it using Rust. A few are outlined here:

Developing Transport Protocols

There are usually two ways to go about developing a new transport layer protocol:

  • Write it in a scripting language such as Python;
  • Write it using C.

The former is great for trying out new ideas and rapid prototyping, however not so great as a real-world implementation. While you can usually get reasonable performance out of these implementations, they're generally significantly slower than an implementation in C, and not suitable for any "heavy lifting".

The next option is to write it in C - this will give you great performance, but comes with a number of other issues:

  • Lack of memory safety - this is a huge source of security vulnerabilities and other bugs in C-based network stacks. It is far too easy to forget a bounds check or use a pointer after it is freed.
  • Lack of thread safety - you have to be very careful to make sure the correct locks are used, and used correctly.
  • Lack of high level abstractions - part of the appeal of scripting languages such as Python is the higher level of abstraction which enables simpler APIs and ease of programming.

Using libpnet and Rust, you get the best of both worlds. The higher level abstractions, memory and thread safety, alongside the performance of C.

Network Utilities

Many networking utilities such as ping and traceroute rely on being able to manipulate network and transport headers, which isn't possible with standard networking stacks such as those provided by std::io::net.

Data Link Layer

It can be useful to work directly at the data link layer, to see packets as they are "on the wire". There are lots of uses for this, including network diagnostics, packet capture and traffic shaping.

Documentation

API documentation for the latest build can be found here: https://docs.rs/pnet/

Usage

To use libpnet in your project, add the following to your Cargo.toml:

[dependencies.pnet]
version = "0.27.2"

libpnet should work on any Rust channel (stable, beta, or nightly), starting with Rust 1.34.2. When using a nightly version of Rust, you may wish to use pass --no-default-features --features nightly to Cargo, to enable faster build times.

When running the test suite, there are a number of networking tests which will likely fail - the easiest way to workaround this is to run cargo test as a root or administrative user. This can often be avoided, however it is more involved.

Windows

There are three requirements for building on Windows:

  • You must use a version of Rust which uses the MSVC toolchain
  • You must have WinPcap or npcap installed (tested with version WinPcap 4.1.3) (If using npcap, make sure to install with the "Install Npcap in WinPcap API-compatible Mode")
  • You must place Packet.lib from the WinPcap Developers pack in a directory named lib, in the root of this repository. Alternatively, you can use any of the locations listed in the %LIB%/$Env:LIB environment variables. For the 64 bit toolchain it is in WpdPack/Lib/x64/Packet.lib, for the 32 bit toolchain, it is in WpdPack/Lib/Packet.lib.
Comments
  • implement icmp packets

    implement icmp packets

    I'm making this a PR instead of an issue to make it easier to read.

    I'm trying to implement ICMP packets. It's far from begin complete, but I'd like to see if I can at least log an ICMP echo request using the packetdump example you provide.

    But it does not compile because some getters are not created.

    I define a generic ICMP packet like this:

    
    #[packet]                                                                           
    pub struct Icmp {                                                                   
        #[construct_with(u8)]                                                           
        type_: IcmpType,  // get_type_() is not created (btw I'll come up with a better name, but "type" is reserved)
        #[construct_with(u8)]                                                           
        code: DestinationUnreachableCode,  // get_code_() is not created                                               
        checksum: u16be,                                                                
        rest_of_header: u32be,                                                          
        #[payload]                                                                      
        payload: Vec<u8> // Internet Header + 64 bits of Original Data Datagram         
    }   
    

    But when I call get_type_() or get_code():

    ~/libpnet git:icmptests ❯❯❯ sudo cargo run --example=packetdump lo                                                                                                                    
       Compiling pnet v0.0.1 (file:///home/corentih/libpnet)
    examples/packetdump.rs:64:16: 64:27 error: no method named `get_type_` found for type `core::option::Option<pnet::packet::icmp::IcmpPacket<'_>>` in the current scope
    examples/packetdump.rs:64     match icmp.get_type_() {
                                             ^~~~~~~~~~~
    examples/packetdump.rs:68:52: 68:63 error: no method named `get_type_` found for type `core::option::Option<pnet::packet::icmp::IcmpPacket<'_>>` in the current scope
    examples/packetdump.rs:68                                               icmp.get_type_())
                                                                                 ^~~~~~~~~~~
    note: in expansion of format_args!
    <std macros>:2:25: 2:56 note: expansion site
    <std macros>:1:1: 2:62 note: in expansion of print!
    <std macros>:3:1: 3:54 note: expansion site
    <std macros>:1:1: 3:58 note: in expansion of println!
    examples/packetdump.rs:66:38: 68:64 note: expansion site
    examples/packetdump.rs:74:24: 74:34 error: no method named `get_code` found for type `core::option::Option<pnet::packet::icmp::IcmpEchoRequestPacket<'_>>` in the current scope
    examples/packetdump.rs:74     match echo_request.get_code() {
                                                     ^~~~~~~~~~
    examples/packetdump.rs:75:109: 75:119 error: no method named `get_code` found for type `core::option::Option<pnet::packet::icmp::IcmpEchoRequestPacket<'_>>` in the current scope
    examples/packetdump.rs:75         IcmpTypes::EchoRequest => println!("[{}]: ICMP echo request: code={}", interface_name, echo_request.get_code()),
                                                                                                                                          ^~~~~~~~~~
    note: in expansion of format_args!
    <std macros>:2:25: 2:56 note: expansion site
    <std macros>:1:1: 2:62 note: in expansion of print!
    <std macros>:3:1: 3:54 note: expansion site
    <std macros>:1:1: 3:58 note: in expansion of println!
    examples/packetdump.rs:75:35: 75:120 note: expansion site
    examples/packetdump.rs:76:129: 76:139 error: no method named `get_code` found for type `core::option::Option<pnet::packet::icmp::IcmpEchoRequestPacket<'_>>` in the current scope
    examples/packetdump.rs:76         _                         => println!("[{}]: Unknown ICMP echo request packet: (code={})", interface_name, echo_request.get_code())
                                                                                                                                                              ^~~~~~~~~~
    note: in expansion of format_args!
    <std macros>:2:25: 2:56 note: expansion site
    <std macros>:1:1: 2:62 note: in expansion of print!
    <std macros>:3:1: 3:54 note: expansion site
    <std macros>:1:1: 3:58 note: in expansion of println!
    examples/packetdump.rs:76:38: 76:140 note: expansion site
    error: aborting due to 5 previous errors
    Could not compile `pnet`.
    

    Two questions:

    • Do you like the approach I take for the implementation, generally speaking? The way I write code at the moment is mostly driven by the errors the compiler throws me, and I have not idea if it's good or not
    • I can't figure out why the getters are not created, can you give me some pointers please?
    opened by little-dude 37
  • Use traits to define DataLink*

    Use traits to define DataLink*

    Using Polymorphism instead of Encapsulation is the key to use multiples backeds at the same time. Lets say that you need to open an datalink to a interface using bpf and an datalink on other interface using netmap, with this trait you can :) Note1: I couldn't compile using netmap, so I didn't test using multiples backeds. Note2: try to find a better solution to default_datalink_channel implementation

    opened by rbran 23
  • Segfault in icmp send

    Segfault in icmp send

    https://github.com/0xd34b33f/cloudflare-ping/blob/06e359d16fff09839cc6a09b1ebdcacb9788ee91/src/ping_core.rs#L332 Segfault, when sending icmp packet. Works in debug mode or in --march=native. Doesn't work in release mode

    opened by 0xdeafbeef 19
  • Windows support

    Windows support

    Currently all the code is written for Windows support, but it does not work:

    • On Win32 receives time out
    • On Win64 the tests segfault

    These issues need investigating and fixing.

    help wanted 
    opened by mrmonday 18
  • Upgrade to winapi 0.3

    Upgrade to winapi 0.3

    This PR is to move away from legacy winapi 0.2 and related *-sys crates to winapi 0.3.x. Note, this is currently using my git branch iphlpapi as required changes have not yet been merged into upstream, yet.

    This is my second PR ever, and I'm pretty green with github, merges, forks, etc.., so I do apologize for rookie mistakes in advance and welcome any and all commentary/criticism.

    This is a WIP PR, I updated to winapi 0.3 naively using rust-2018 and nightly. I need to go back and support this project's minimum Rust version. winapi 0.3 supports back to rust 1.6 so there should be no issues there.

    Tests are not yet passing, for me.

    opened by mattlknight 17
  • Data Link Interfaces call on Windows panics

    Data Link Interfaces call on Windows panics

    libpnet version: 0.21.0 rustc version: 1.26.0 os: Windows 10 Pro x64


    On Windows, it appears that the following snippet always panic!(s)s:

    extern crate pnet;
    extern crate pnet_datalink;
    
    fn send_tcp_packet() {
        let interfaces = pnet_datalink::interfaces();
    }
    
    
    fn main() {
        send_tcp_packet();
    }
    

    With the following:

    C:\Users\JDB\Projects\learn-rust\syn-client>cargo run
       Compiling syn-client v0.1.0 (file:///C:/Users/JDB/Projects/learn-rust/syn-client)
        Finished dev [unoptimized + debuginfo] target(s) in 1.61 secs
         Running `target\debug\syn-client.exe`
    thread 'main' panicked at 'FIXME [windows] unable to get interface list', C:\Users\JDB\.cargo\registry\src\github.com-1ecc6299db9ec823\pnet_datalink-0.21.0\src\winpcap.rs:335:9
    note: Run with `RUST_BACKTRACE=1` for a backtrace.
    error: process didn't exit successfully: `target\debug\syn-client.exe` (exit code: 101)
    

    After some digging it appears to be related to this line of code.

    List of local Network Interfaces:

    Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
    ----                      --------------------                    ------- ------       ----------             ---------
    vEthernet (DockerNAT)     Hyper-V Virtual Ethernet Adapter #3          25 Up           00-15-5D-00-02-1A        10 Gbps
    vEthernet (Default Swi... Hyper-V Virtual Ethernet Adapter             23 Up           16-15-7D-77-FF-87        10 Gbps
    Bluetooth Network Con...2 Bluetooth Device (Personal Area Ne...#2      20 Disconnected 00-1A-7D-DA-71-02         3 Mbps
    vEthernet (nat)           Hyper-V Virtual Ethernet Adapter #2          13 Up           00-15-5D-8A-D4-25        10 Gbps
    vEthernet (ArchLinux E... Hyper-V Virtual Ethernet Adapter #4          12 Up           70-85-C2-0B-7F-DC       100 Mbps
    Ethernet                  Intel(R) Ethernet Connection (2) I219-V       6 Up           70-85-C2-0B-7F-DC       100 Mbps
    

    I would love to submit a PR, however I am not all to proficient in Rust; especially not at such a low layer. If anyone would love to guide me through it, I would be more than happy to contribute. Otherwise it would be cool if we could push a fix for it, or at least a temporary workaround.

    opened by JuxhinDB 16
  • datalink: fix pcap

    datalink: fix pcap

    • rename the "pcap" feature to "with-pcap" (because of dep conflict)
    • pass through the with-pcap feature to pnet_datalink
    • fix random build errors
    opened by squeed 16
  • Little endian?

    Little endian?

    I just started working on Netlink library based on libpnet/pnet_macros. The problem is that Netlink messages are encoded in little endian. It seems like this little diff works as intended.

    opened by polachok 15
  • Release v0.23.0

    Release v0.23.0

    Hi guys, How soon the new release is supposed to happen? I'm waiting for pnet::transport::IcmpTransportChannelIterator::next_with_timeout on stable. Could you also give me a stable revision with this feature, so I could use it instead of master branch?

    opened by kacejot 13
  • Are the packet sizes abnormally small?

    Are the packet sizes abnormally small?

    I'd like to know the size of packets coming to/from a certain network interface, but I seem to be getting extremely low numbers. Im using the packet dump file from your example as a PoC, and all I did was add a

    println!("PACKET SIZE: {}, packet.len());
    

    on line 251, right after Ok(packet) => { ...

    I assume that packet.len() gives the length in bytes of the packet, and I hope that my assumption is wrong, because otherwise I am just getting very low numbers.

    I then let it run while listening to my interface (and yes I am using the right interface, I checked several times) and I went on https://twitch.tv because It sends a lot of data.

    Looking at wireshark I see a consistent flow of TCP packets, most of which are 1514 bytes. On my PoC I see a long list of "PACKET SIZE: 40" and occasionally I see a packet that's slightly higher, like 295, 398, but nothing close to 1514.

    This is on windows 10. I tried to do the same thing on my ubuntu device, and got similar results, most packet sizes were about 106 with an occasional spike to 500.

    Am I interpreting packet.len() incorrectly? Is the example simply out of date?

    Could you run the example with the line that I added and see if you get results that seem to make sense?

    opened by nikita-skobov 13
  • Optional.unwrap() in winpcap causing crash

    Optional.unwrap() in winpcap causing crash

    https://github.com/libpnet/libpnet/blob/47f48e00282aabc005c96393930cb3408139a7f5/src/datalink/winpcap.rs#L277

    I can try my hand at a fix, but I'm not sure how to handle the case where the option is Nothing.

    opened by bgourlie 13
  • pnet::datalink::interfaces() returns wrong MAC addresses since nightly-2022-11-23

    pnet::datalink::interfaces() returns wrong MAC addresses since nightly-2022-11-23

    Consider the following example:

    use pnet::datalink;
    
    fn main() {
        for interface in pnet::datalink::interfaces() {
            println!("{} {:?}", interface.name, interface.mac);
        }
    }
    

    This returns "invalid" MAC addresses. These are not the correct MAC addresses for my network interfaces, and they seem to follow a strange pattern (01, 02, 03, ...):

    lo0 Some(01:00:18:03:00:00)
    gif0 Some(02:00:37:04:00:00)
    stf0 Some(03:00:39:04:00:00)
    anpi1 Some(04:00:06:05:06:00)
    anpi0 Some(05:00:06:05:06:00)
    en3 Some(06:00:06:03:06:00)
    en4 Some(07:00:06:03:06:00)
    en1 Some(08:00:06:03:06:00)
    en2 Some(09:00:06:03:06:00)
    bridge0 Some(0a:00:06:07:06:00)
    ap1 Some(0b:00:06:03:06:00)
    en0 Some(0c:00:06:03:06:00)
    awdl0 Some(0d:00:06:05:06:00)
    llw0 Some(0e:00:06:04:06:00)
    utun0 Some(0f:00:01:05:00:00)
    utun1 Some(10:00:01:05:00:00)
    utun2 Some(11:00:01:05:00:00)
    utun3 Some(12:00:01:05:00:00)
    utun4 Some(13:00:01:05:00:00)
    

    This happens with libpnet 0.31.0 since nightly-2022-11-23. nightly-2022-11-22 and before are good.

    Maybe this is due to an upcoming change in Rust that will affect libpnet, or it's just an issue with Rust nightly, in which case feel free to close :)

    opened by maxmouchet 0
  • rustc(E0515) when trying to use icmp_packet_iter.next()

    rustc(E0515) when trying to use icmp_packet_iter.next()

    Apologies if this is a Rust noob question.

    I am trying to return the first reply packet from a Layer4(Ipv4(IpNextHeaderProtocols::Icmp)) transport_channel.

    The end of my function is:

        let mut rx_iter = icmp_packet_iter(&mut rx);
        rx_iter.next()
    

    And I get the following errors:

    error[E0515]: cannot return reference to local variable `rx_iter`
      --> src\main.rs:29:5
       |
    29 |     rx_iter.next()
       |     ^^^^^^^^^^^^^^ returns a reference to data owned by the current function
    
    error[E0515]: cannot return value referencing local variable `rx`
      --> src\main.rs:29:5
       |
    28 |     let mut rx_iter = icmp_packet_iter(&mut rx);
       |                                        ------- `rx` is borrowed here
    29 |     rx_iter.next()
       |     ^^^^^^^^^^^^^^ returns a value referencing data owned by the current function
    
    

    The official advice is to "consider returning an owned value instead". How should I do it?

    opened by zarkdav 2
  • Fix examples/arp_packet.rs

    Fix examples/arp_packet.rs

    IIUC, the goal of this code is to look up MAC address matching target_ip, by receiving ARP packet from the target host sends.

    If so, catching subsequent packet won't work because the very next received packet is the ARP request just sent by the function itself. (at least on my macbook)

    To make this work, IMO, lookup every packets while reply packet found.

    opened by palindrom615 0
  • UDP checksum algorithm is buggy (or at least badly documented)

    UDP checksum algorithm is buggy (or at least badly documented)

    File pnet_packet/src/udp.rs contains routines ipv4_chekcsum() and ipv4_checksum_adv(), which are supposed to calculate the correct UDP checksum to the UDP header. Also, there is a unit test function "udp_header_ipv4_test()", which is apparently meant to show the correct use of function ipv4_checksum().

    However, if a user calculates UDP checksums as shown in udp_header_ipv4_test(), the result is wrong, with probability of 0.000015. Specifically, routine util::ipv4_checksum() calculates the mathematically correct TCP checksum, which is in range 0..0xFFFE, inclusive. However, RFC768 says that UDP checksum has a special rule that differs from all other checksum calculations: if "the computed checksum is zero, it is transmitted as all ones", so a zero value (whose probability is 1/65535), must be changed to 0xFFFF before storing to UDP header. The algorithm, as shown, fails to do this change.

    The result of this bug is hard to reveal, because if the sender sets the checksum to zero (as mentioned, this happens with probability 1/65535), the receiver is unlikely to notice the error, because, for the receiver, zero checksum is an indication that the sender has refused to calculate the checksum, and so the receiver omits the checksum calculation and accepts the UDP packet. So the net result is that transmissions errors, which are meant to be detected with checksum, are not detected.

    Also, a similar bug is in documentation of routine pnet::util::ipv4_checksum. That routine is meant for "UDP and TCP", but the user is not warned against the special case of zero checksum.

    A fix should be simple:

    let mut checksum = ipv4_checksum(. . .);
    if checksum == 0 {
        // UDP rules require that zero is represented as follows:
        checksum = 0xFFFF;
    }
    udp_header.set_checksum(checksum);
    

    And further, the routines for IPv6 appear to have the same issues.

    opened by heikki-heikkila 0
  • datalink(linux): add feature to pass the fd (socket) to ::channel()

    datalink(linux): add feature to pass the fd (socket) to ::channel()

    This can be useful if the caller want to manipulate the socket differently at creating. For example setting a BPF filter on the socket before passing it in the channel:

    datalink::linux::channel(interface, config, socket_fd)
    

    Signed-off-by: Martin Andre [email protected]

    opened by Martichou 0
  • RouterSolicit with no options generates an error

    RouterSolicit with no options generates an error

    A pcap from my network shows that router solicitations are sent with no options. good_solicit

    If I construct a RouterSolicit packet with the pnet lib however, leaving the options field empty leads to an invalid message. solicit

    This message is constructed with:

     let adv = ndp::RouterSolicit {
                icmpv6_type: Icmpv6Types::RouterSolicit,
                icmpv6_code: Icmpv6Code(0),
                checksum: 0,
                options: Vec::new(),
                reserved: 0,
                payload: Vec::new(),
    };
    

    wireshark shows it as an error

    opened by leshow 4
Releases(v0.31.0)
  • v0.31.0(Jun 1, 2022)

    What's Changed

    • Update libc dependency to 0.2.117 by @cc-morning in https://github.com/libpnet/libpnet/pull/568
    • Fix feature deps in top-level Cargo.toml blocking #[no_std] use by @Felix-El in https://github.com/libpnet/libpnet/pull/566
    • bump version for ipnetwork in pnet_datalink by @matteyeux in https://github.com/libpnet/libpnet/pull/567
    • Upgrade dependencies by @mrmonday in https://github.com/libpnet/libpnet/pull/570
    • Fix some build warnings on Windows by @mrmonday https://github.com/libpnet/libpnet/commit/c9bb42fe0c8ffeb0522e6f7801daf19e246eca2e

    New Contributors

    • @cc-morning made their first contribution in https://github.com/libpnet/libpnet/pull/568
    • @matteyeux made their first contribution in https://github.com/libpnet/libpnet/pull/567

    Full Changelog: https://github.com/libpnet/libpnet/compare/v0.30.0...v0.31.0

    Source code(tar.gz)
    Source code(zip)
  • v0.30.0(May 12, 2022)

    What's Changed

    • pnet_macros: fix num_bytes calculation by @yu-re-ka in https://github.com/libpnet/libpnet/pull/547
    • Assorted cleanup by @mrmonday in https://github.com/libpnet/libpnet/pull/548
    • support Vec with construct_with by @yu-re-ka in https://github.com/libpnet/libpnet/pull/550
    • Misc fixes by @mrmonday in https://github.com/libpnet/libpnet/pull/551
    • Update ipnetwork requirement from 0.18.0 to 0.19.0 by @dependabot in https://github.com/libpnet/libpnet/pull/552
    • Fix build on architectures with unsigned char by @pkubaj in https://github.com/libpnet/libpnet/pull/561
    • Changes to Functions to include inline and moved benches to criterion to use stable toolchain by @infosechoudini in https://github.com/libpnet/libpnet/pull/555
    • Add illumos support by @teutat3s in https://github.com/libpnet/libpnet/pull/549
    • enable #[no_std] use by providing std feature by @Felix-El in https://github.com/libpnet/libpnet/pull/562

    New Contributors

    • @pkubaj made their first contribution in https://github.com/libpnet/libpnet/pull/561
    • @infosechoudini made their first contribution in https://github.com/libpnet/libpnet/pull/555
    • @teutat3s made their first contribution in https://github.com/libpnet/libpnet/pull/549
    • @Felix-El made their first contribution in https://github.com/libpnet/libpnet/pull/562

    Full Changelog: https://github.com/libpnet/libpnet/compare/v0.29.0...v0.30.0

    Source code(tar.gz)
    Source code(zip)
  • v0.29.0(Jan 13, 2022)

    • Update Rust edition to 2021
    • Update time dev-dependency
    • Remove deprecated interface.mac_address(), use interface.mac instead
    • Make pnet_datalink::Channel be #[non_exhaustive]
    • Support more interface flags
    • Fix issue preventing filling the datalink write buffer on Linux
    • Clean up/better document some unsafety
    • Add icmpv6 echo request and reply packet types
    • Add Linux SLL packet type
    • Various code clean-ups
    Source code(tar.gz)
    Source code(zip)
  • v0.28.0(May 15, 2021)

    • Upgrade dependencies
    • Add USBPcap packet
    • Switch from Travis and AppVeyor to Github Actions for CI
    • Switch from compiletest_rs to trybuild for macro tests
    • Upgrade to github native dependabot
    • README cleanups
    • Switch from syntex to procedural macros
    • Support getting MacAddr octets as a fixed-size array
    • Fix crash found during fuzz testing
    • Fix invalid pointer use
    • Support setting IPv6 TTL
    Source code(tar.gz)
    Source code(zip)
  • v0.26.0(May 1, 2020)

  • v0.25.0(Jan 8, 2020)

Owner
null
The Rust Implementation of libp2p networking stack.

Central repository for work on libp2p This repository is the central place for Rust development of the libp2p spec. Warning: While we are trying our b

libp2p 3k Jan 4, 2023
Backroll is a pure Rust implementation of GGPO rollback networking library.

backroll-rs Backroll is a pure Rust implementation of GGPO rollback networking library. Development Status This is still in an untested alpha stage. A

Hourai Teahouse 273 Dec 28, 2022
Painless peer-to-peer WebRTC networking for rust wasm

Matchbox Painless peer-to-peer WebRTC networking for rust wasm applications. The goal of the Matchbox project is to enable udp-like, unordered, unreli

Johan Klokkhammer Helsing 363 Jan 5, 2023
A simple message based networking library for the bevy framework

Spicy Networking for Bevy bevy_spicy_networking is a solution to the "How do I connect multiple clients to a single server" problem in your bevy games

Cabbit Studios 67 Jan 1, 2023
Bevy plugin for the GGRS P2P rollback networking library.

Bevy_GGRS Bevy plugin for the ?? GGRS P2P rollback networking library. The plugin creates a custom stage with a separate schedule, which handles corre

Georg Friedrich Schuppe 120 Jan 6, 2023
Final Project for "Computer Networking Security": A Layer-3 VPN implementation over TLS

Final Project for "Computer Networking Security": A Layer-3 VPN implementation over TLS

Siger Yang 2 Jun 7, 2022
A cross-platform, user-space WireGuard port-forwarder that requires no system network configurations.

Cross-platform, user-space WireGuard port-forwarder that requires no system network configurations.

Aram Peres 629 Jan 4, 2023
A simple cross-platform remote file management tool to upload and download files over HTTP/S

A simple cross-platform remote file management tool to upload and download files over HTTP/S

sexnine 13 Dec 30, 2022
⏱ Cross-platform Prometheus style process metrics collector of metrics crate

⏱ metrics-process This crate provides Prometheus style process metrics collector of metrics crate for Linux, macOS, and Windows. Collector code is man

Alisue 12 Dec 16, 2022
A high-performance, lightweight, and cross-platform QUIC library

TQUIC English | 中文 TQUIC is a high-performance, lightweight, and cross-platform library for the IETF QUIC protocol. Advantages High performance: TQUIC

Tencent 11 Oct 27, 2023
BLEZ - Asynchronous Bluetooth Low Energy on Linux for Rust

BLEZ - Asynchronous Bluetooth Low Energy on Linux for Rust This library provides an asynchronous, fully featured interface to the Bluetooth Low Energy

Sebastian Urban 40 Oct 21, 2021
A high performance/low-overhead OpenMetrics library for Rust

* * * EXPERIMENTAL * * * discreet-metrics A high-performance/low-overhead metrics library aiming to conform with OpenMetrics and to satisfy the follow

null 2 Sep 14, 2022
A collection of lower-level libraries for composable network services.

Actix Net A collection of lower-level libraries for composable network services. Example See actix-server/examples and actix-tls/examples for some bas

Actix 582 Dec 28, 2022
RusTCP is an attempt to rewrite some of the PyTCP stack functionality using Rust language.

RusTCP is an attempt to rewrite some of the PyTCP stack functionality using Rust language. Currently, the main goal of this project is to create a stable IPv6 platform that could be used to facilitate the process of labing the SRv6 technology.

Sebastian Majewski 3 Dec 5, 2022
An end-to-end encrypted, anonymous IP-hiding, decentralized, audio/video/file sharing/offline messaging multi-device platform built for both communications and application security and performance.

An end-to-end encrypted, anonymous IP-hiding, decentralized, audio/video/file sharing/offline messaging multi-device platform built for both communications and application security and performance.

null 2 Apr 27, 2022
Core library for Lightning Network peer-to-peer nostr platform

Mostro server This document explains how Mostro works. Overview Due to the growing need to be able to operate with Bitcoin without giving up personal

Mostro 16 Jan 4, 2023
TeleMQ is an experimental MQTT broker implemented in Rust language.

TeleMQ TeleMQ is an experimental MQTT broker implemented in Rust language. The broker implements MQTT version 3.1.1 specification. License This projec

null 12 Dec 27, 2022
An experimental IPC interface definition language for Hubris.

Idol: interface definitions for Hubris This is an experimental interface definition language for defining IPC interfaces between tasks in a Hubris app

Oxide Computer Company 8 Oct 19, 2022
Simple VPN implemented using rust

fubuki Simple VPN implemented using rust fubuki是类似与tincVPN的简单组网工具 不支持对等NAT 支持的平台: Windows Linux 工作机制 它由一台拥有公网IP的服务器来维持各个内网客户端的实际地址映射,在客户端和客户端之间实现P2P通信

XTY 84 Dec 31, 2022