ttl
Network diagnostic tool that goes beyond traceroute: MTU discovery, NAT detection, route flap alerts, IX identification, and more.

Quick Start
# Basic usage
# Common options
See Installation below for setup instructions.
Features
- Fast continuous path monitoring with detailed hop statistics
- Multiple simultaneous targets - trace to several destinations at once
- Paris/Dublin traceroute - multi-flow probing for ECMP path enumeration
- ECMP classification - distinguishes per-flow vs per-packet load balancing
- Path MTU discovery - binary search for maximum unfragmented size
- NAT detection - identify when NAT devices rewrite source ports
- Route flap detection - alert on path changes indicating routing instability
- Rich enrichment - ASN, GeoIP, reverse DNS, IX detection (PeeringDB)
- MPLS label detection from ICMP extensions
- ICMP, UDP, TCP probing with auto-detection
- Great TUI with themes, sparklines, and session export
- Update notifications - in-app banner when new versions are available
- Scriptable - JSON, CSV, and text report output
See docs/FEATURES.md for detailed documentation, including optional setup for GeoIP and IX detection.
Installation
From crates.io (Recommended)
Requires Rust:
# Install Rust (if not already installed)
|
# Install ttl
Homebrew (macOS/Linux)
Arch Linux (AUR)
Gentoo
Pre-built Binaries
Download from GitHub Releases:
| Platform | Target |
|---|---|
| Linux x86_64 | ttl-x86_64-unknown-linux-musl.tar.gz |
| Linux ARM64 | ttl-aarch64-unknown-linux-gnu.tar.gz |
| macOS Apple Silicon | ttl-aarch64-apple-darwin.tar.gz |
| macOS Intel | ttl-x86_64-apple-darwin.tar.gz |
# Download, verify, and install (Linux x86_64 example)
&&
From Source
&&
Quick Install Script
Note: Piping scripts from the internet to sh is convenient but bypasses your ability to review the code first. Consider using one of the methods above, or review the script before running.
|
Permissions (Linux)
Raw sockets require elevated privileges. The easiest approach is to add the capability once:
# Add capability (works for any install location)
# Then run without sudo:
Shell Completions
# Bash
# Zsh (add ~/.zfunc to fpath in .zshrc first)
# Fish
# PowerShell (add to $PROFILE)
Usage Examples
Interactive TUI
Report and Export
Advanced Options
See docs/FEATURES.md for full CLI reference.
Real-World Use Cases
Find MTU Blackholes in VPNs
VPN tunnels often have lower MTU than expected. Large packets get silently dropped, causing mysterious connection hangs.
TTL binary-searches to find the maximum packet size that works. The [MTU: 1400] indicator shows exactly where fragmentation occurs.
Detect Carrier-Grade NAT Breaking Your Flows
Running multi-flow traceroute but getting inconsistent results? NAT devices may be rewriting your source ports.
TTL detects when returned source ports don't match what was sent. The [NAT] indicator warns you, and hop details show which device is doing the rewriting.
Identify Internet Exchange Points
See exactly where your traffic peers with other networks:
TTL queries PeeringDB to identify IX points. The hop detail view shows IX name, city, and country. Works out of the box; optionally configure an API key via settings (s key) or PEERINGDB_API_KEY env var for higher rate limits. See docs/FEATURES.md for setup details.
Catch Flapping Routes
Unstable BGP or failover issues cause intermittent problems that are hard to catch:
TTL tracks when the responding IP at a hop changes. The ! indicator flags route flaps, and hop details show change history. ECMP load balancing shows E instead, so you can distinguish real instability from expected multi-path behavior.
Detect Transparent Proxies
Some networks intercept traffic with transparent proxies that manipulate TTL values:
The [TTL!] indicator appears when TTL manipulation is detected.
Distinguish Real Loss from ICMP Rate Limiting
That 30% packet loss at hop 5 might be fake - routers often rate-limit ICMP responses:
The [RL?] indicator and 50%RL in the loss column tell you it's rate limiting, not actual packet drops.
Compare Multiple Paths
Trace multiple destinations at once. Press Tab to switch between them, or l to see a list of all targets.
Trace All Resolved IPs (Round-Robin DNS)
When a hostname resolves to multiple IPs (round-robin DNS, CDN load balancing), trace all of them to compare paths. Press l to see all resolved targets with their stats.
Keybindings
| Key | Action |
|---|---|
q / Ctrl+C |
Quit |
p / Space |
Pause/Resume |
r |
Reset stats |
t |
Cycle theme |
w |
Cycle display mode |
s |
Settings |
e |
Export JSON |
? |
Help |
u |
Dismiss update banner |
Tab |
Next target |
l |
Target list |
Enter |
Expand hop |
Themes
11 built-in themes: default, kawaii, cyber, dracula, monochrome, matrix, nord, gruvbox, catppuccin, tokyo_night, solarized
# Press 't' to cycle themes (saved to ~/.config/ttl/config.toml)
Platform Support
| Platform | Status |
|---|---|
| Linux | Full support |
| macOS (Tahoe 26+) | Full support |
| macOS (Sequoia 15) | Build from source* |
| FreeBSD | Experimental** |
| NetBSD | Experimental** |
| Windows (WSL2) | Full support |
| Windows (native) | Not supported |
*Pre-built binaries are built on macos-latest (Tahoe). Older macOS versions may have display issues - use cargo install ttl to compile from source.
**FreeBSD/NetBSD support is experimental. Requires sudo. Interface binding (-i) is not supported. IPv4 PMTUD is unavailable on NetBSD (no IP_DONTFRAG). Please report issues at https://github.com/lance0/ttl/issues
Windows via WSL2
wsl --install # Install WSL if needed, then restart
wsl # Open Ubuntu
Then in Ubuntu:
# Option 1: Install via cargo (recommended)
|
# Option 2: Pre-built binary via install script
|
Known Issues
- iTerm2 on macOS Sequoia: Initial display may render incorrectly. Press
rto reset, or use Terminal.app.
Known Limitations
Permissions
- Linux: Requires
CAP_NET_RAWcapability or root (see Permissions) - macOS/FreeBSD/NetBSD: Requires root (
sudo ttl target) - RAW sockets are needed to receive ICMP Time Exceeded messages from intermediate routers
Protocol Limitations
- ICMP probes: Some networks filter ICMP, try
-p udpor-p tcp - TCP probes: Only SYN (no connection establishment)
- UDP probes: High ports may be filtered by firewalls
Multi-flow Mode
- NAT devices may rewrite source ports, breaking flow correlation
- The
[NAT]indicator warns when this is detected
Documentation
- Features - Detailed feature documentation and CLI reference
- Scripting - CI/CD integration, JSON parsing, Docker usage
- Architecture - Internal design and module structure
- Contributing - Development setup and guidelines
- Comparison - Comparison with similar tools (including pathping)
- Changelog - Release history
- Roadmap - Planned features
Troubleshooting
"sudo: ttl: command not found"
sudo uses a restricted PATH. Use the full path or copy to a sudo-accessible location:
# Option 1: Use full path
# Option 2: Copy to /usr/local/bin (one-time)
# Option 3: Symlink (updates automatically with cargo install)
Permission errors
Raw ICMP sockets require CAP_NET_RAW or root. See Permissions.
High packet loss
Try increasing probe interval: ttl target -i 2.0
Some routers rate-limit ICMP - look for the [RL?] indicator in the TUI.
All hops showing * * *
Check firewall rules, VPN configuration, or try a different protocol: ttl -p udp target
Theme/config not persisting (macOS)
As of v0.12.1, the config directory on macOS changed from ~/Library/Preferences/ttl/ to ~/Library/Application Support/ttl/ to align with Apple guidelines. If you have an existing config, move it:
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.