[][src]Crate libtraceroute

libtraceroute

libtraceroute provides a cross-platform API for traceroute using Rust.

Features

libtraceroute sends and receives packets at a data link layer, which makes it flexible and highly customisable. The library allows to configure the following parameters:

  • Port
  • Timeout per query (in ms)
  • Maximum number of hops
  • Number of queries per hop
  • Network interface
  • Protocol (UDP, TCP, ICMP)

The library is based on pnet which allows to work at Layer 2 (Data link) without root privileges on MacOS and Windows, but still requires sudo on Linux.

Example

Traceroute with default configuration:

extern crate libtraceroute;

use libtraceroute::Traceroute;
use std::net::Ipv4Addr;

fn main() {
    let destination_ip = Ipv4Addr::new(93, 184, 216, 34);  // example.com

    let traceroute_query = Traceroute::new(destination_ip, Default::default());

    for hop in traceroute_query {
        print!("{}", hop.ttl);
        for query_result in &hop.query_result {
            print!(" \t{}ms \t{}\n", query_result.rtt.as_millis(), query_result.addr);
        }
    }
}

Traceroute with custom configuration:

extern crate libtraceroute;

use libtraceroute::{Traceroute, Config};
use libtraceroute::util::{Protocol, get_available_interfaces};
use std::net::Ipv4Addr;

fn main() {
    let destination_ip = Ipv4Addr::new(93, 184, 216, 34);  // example.com

    let available_interfaces = get_available_interfaces();

    let network_interface = match available_interfaces.iter().filter(|i| i.name == "en0").next() {
        Some(i) => i.clone(),
        None => panic!("no such interface available")
    };

    let mut traceroute_query = Traceroute::new(destination_ip, Config::default()
        .with_port(33480)
        .with_max_hops(20)
        .with_first_ttl(2)
        .with_interface(network_interface)
        .with_number_of_queries(2)
        .with_protocol(Protocol::UDP)
        .with_timeout(1000));

    // Calculate all hops upfront
    let traceroute_result = traceroute_query.perform_traceroute();

    // Iterate over pre-calculated hops vector
    for hop in traceroute_result {
        print!("{}", hop.ttl);
        for query_result in &hop.query_result {
            print!(" \t{}ms \t{}\n", query_result.rtt.as_millis(), query_result.addr);
        }
    }
}

Modules

util

Miscellaneous utilities for for traceroute

Structs

Config

Traceroute configurations

Traceroute

Traceroute instance containing destination address and configurations

TracerouteHop

Single traceroute hop containing TTL and a vector of traceroute query results

TracerouteQueryResult

Result of a single query execution - IP and RTT