lance0/ttl

GitHub: lance0/ttl

一款现代化的网络路径诊断工具,提供实时 TUI、多目标追踪、ECMP 检测、MTU 发现和丰富的会话导出能力,定位为超越 traceroute 和 mtr 的下一代链路分析利器。

Stars: 1261 | Forks: 73

ttl logo

# ttl 超越 traceroute 的网络诊断工具:支持 MTU 发现、NAT 检测、路由抖动警报、IX 识别等。 ![ttl 截图](https://static.pigsec.cn/wp-content/uploads/repos/cas/6c/6c4b7e3f567cdada32bb70afadf2e605eaea0dbf121d382523d2e530110fa1c9.png) [![Crates.io](https://img.shields.io/crates/v/ttl.svg)](https://crates.io/crates/ttl) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/lance0/ttl/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](LICENSE-MIT) [![Ko-fi](https://img.shields.io/badge/Ko--fi-tip-ff5e5b?logo=ko-fi)](https://ko-fi.com/lance0) ## 快速开始 ``` # 基本用法 ttl 8.8.8.8 # Linux (after setcap) sudo ttl 8.8.8.8 # macOS/BSD (always needs sudo) # 常用选项 ttl -p udp google.com # UDP probes ttl --flows 8 cloudflare.com # ECMP path discovery ttl --pmtud 1.1.1.1 # Path MTU discovery ttl 8.8.8.8 1.1.1.1 9.9.9.9 # Multiple targets ttl --resolve-all google.com # Trace all resolved IPs ``` 有关设置说明,请参阅下方的[安装说明](#installation)。 ## 功能 - **快速连续的路径监控**,提供详细的跳统计信息 - **多个同时监控的目标** - 同时追踪多个目的地 - **Paris/Dublin traceroute** - 用于 ECMP 路径枚举的多流探测 - **ECMP 分类** - 区分基于流和基于数据包的负载均衡 - **路径 MTU 发现** - 二分查找最大未分片大小 - **NAT 检测** - 识别 NAT 设备重写源端口的情况 - **路由抖动检测** - 在指示路由不稳定的路径变化时发出警报 - **丰富的信息扩展** - ASN、GeoIP、反向 DNS、IX 检测 (PeeringDB) - 通过 ICMP 扩展进行 **MPLS 标签检测** - 自动检测的 **ICMP、UDP、TCP 探测** - **优秀的 TUI**,支持主题、迷你图和会话导出 - **更新通知** - 有新版本可用时显示应用内横幅 - **可脚本化** - 支持 JSON、CSV、文本报告和行分隔的 JSON 流输出 - **追踪差异对比** - 比较两个已保存的会话以查看路径和延迟变化 - **Daemon 模式 + Prometheus exporter** - 通过 `/metrics` 和 `/healthz` 进行无头连续监控 - **支持 Docker** - 官方 Dockerfile,支持优雅的 SIGTERM 关闭 有关详细文档,包括 [GeoIP](docs/FEATURES.md#geoip-location) 和 [IX 检测](docs/FEATURES.md#ix-detection) 的可选设置,请参阅 [docs/FEATURES.md](docs/FEATURES.md)。 ## 安装说明 ### 通过 crates.io (推荐) 需要 [Rust](https://www.rust-lang.org/tools/install): ``` # 安装 Rust(如果尚未安装) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.cargo/env # 安装 ttl cargo install ttl ``` ### Homebrew (macOS/Linux) ``` brew install ttl ``` 可直接从 [Homebrew core](https://formulae.brew.sh/formula/ttl) 获取。(`lance0/tap/ttl` tap 仍然有效,且可能会稍快地发布新版本。) ### Alpine Linux ``` apk add ttl --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing ``` 目前位于 `edge/testing` 仓库中(由社区维护)。 ### Arch Linux (AUR) ``` yay -S ttl-bin ``` ### Gentoo ``` emerge net-analyzer/ttl ``` ### NetBSD (pkgsrc) ``` pkgin install ttl ``` 或从源码安装:`cd /usr/pkgsrc/net/ttl && make install` ### NixOS / Nix ``` # 命令式安装 nix-env -iA nixpkgs.ttl # NixOS 配置 environment.systemPackages = [ pkgs.ttl ]; # 临时 shell nix-shell -p ttl ``` 在 `nixpkgs` unstable 中可用(由社区维护)。 ### 预编译二进制文件 从 [GitHub Releases](https://github.com/lance0/ttl/releases) 下载: | 平台 | 目标 | |----------|--------| | 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` | ``` # 下载、验证并安装(以 Linux x86_64 为例) curl -LO https://github.com/lance0/ttl/releases/latest/download/ttl-x86_64-unknown-linux-musl.tar.gz curl -LO https://github.com/lance0/ttl/releases/latest/download/SHA256SUMS sha256sum -c SHA256SUMS --ignore-missing # macOS: shasum -a 256 -c tar xzf ttl-*.tar.gz && sudo mv ttl /usr/local/bin/ ``` ### Docker 每次发布时都会将多架构镜像 (amd64/arm64) 发布到 GHCR: ``` docker pull ghcr.io/lance0/ttl:latest docker run --rm -it ghcr.io/lance0/ttl 8.8.8.8 # 使用 Prometheus metrics 进行无头监控 docker run -d -p 9090:9090 ghcr.io/lance0/ttl --daemon --prometheus :9090 8.8.8.8 ``` Docker 默认授予所需的 `NET_RAW` 权限;更严格的运行时可能需要 `--cap-add NET_RAW`。 ### 从源码构建 ``` git clone https://github.com/lance0/ttl cd ttl && cargo build --release sudo cp target/release/ttl /usr/local/bin/ ``` ### 快速安装脚本 ``` curl -fsSL https://raw.githubusercontent.com/lance0/ttl/master/install.sh | sh ``` ### 权限 (Linux) Raw sockets 需要提升的权限。最简单的方法是添加一次权限: ``` # 添加 capability(适用于任何安装位置) sudo setcap cap_net_raw+ep $(which ttl) # 然后无需 sudo 运行: ttl 8.8.8.8 ``` ### Shell 自动补全 ``` # Bash ttl --completions bash > ~/.local/share/bash-completion/completions/ttl # Zsh(首先将 ~/.zfunc 添加到 .zshrc 中的 fpath) ttl --completions zsh > ~/.zfunc/_ttl # Fish ttl --completions fish > ~/.config/fish/completions/ttl.fish # PowerShell(添加到 $PROFILE) ttl --completions powershell >> $PROFILE ``` ## 使用示例 ### 交互式 TUI ``` ttl google.com ttl 8.8.8.8 1.1.1.1 # Multiple targets (Tab to switch) ``` ### 报告和导出 ``` ttl 1.1.1.1 -c 100 --report # Text report ttl 1.1.1.1 -c 100 --json # JSON export ttl 1.1.1.1 -c 100 --csv # CSV export ttl 1.1.1.1 --stream-json # Stream events as line-delimited JSON ttl --diff before.json after.json # Compare two saved sessions ttl --daemon --prometheus :9090 1.1.1.1 # Headless + Prometheus metrics ttl --replay results.json # Replay saved session ttl --replay results.json --animate # Animated replay ``` ### 高级选项 ``` ttl -p tcp --port 443 host # TCP probes to HTTPS ttl --flows 4 host # ECMP path enumeration ttl --interface eth0 host # Bind to interface ttl --size 1400 host # Large packets for MTU testing ttl --dscp 46 host # QoS marking (EF) ttl --wide host # Wide mode for wider terminals ``` 有关完整的 CLI 参考,请参阅 [docs/FEATURES.md](docs/FEATURES.md)。 ## 实际使用案例 ### 查找 VPN 中的 MTU 黑洞 VPN 隧道的 MTU 通常比预期的要低。大数据包会被静默丢弃,导致莫名其妙的连接挂起。 ``` sudo ttl --pmtud vpn-gateway.example.com ``` TTL 通过二分搜索查找可正常工作的最大数据包大小。`[MTU: 1400]` 指示器准确显示了发生分片的位置。 ### 检测破坏数据流的运营商级 NAT 运行多流 traceroute 却得到不一致的结果?NAT 设备可能正在重写您的源端口。 ``` sudo ttl --flows 4 target.com ``` TTL 会检测返回的源端口与发送的是否匹配。`[NAT]` 指示器会向您发出警告,并且跳的详细信息会显示是哪个设备在执行重写。 ### 识别互联网交换中心 准确查看您的流量在何处与其他网络对等: ``` sudo ttl cloudflare.com ``` TTL 查询 PeeringDB 以识别 IX 点。跳的详细信息视图显示 IX 名称、城市和国家。开箱即用;可选择通过设置(`s` 键)或 `PEERINGDB_API_KEY` 环境变量配置 API 密钥,以获得更高的速率限制。有关设置详情,请参阅 [docs/FEATURES.md](docs/FEATURES.md#ix-detection)。 ### 捕捉路由抖动 不稳定的 BGP 或故障转移问题会导致难以捕捉的间歇性问题: ``` sudo ttl -i 0.5 production-server.com ``` TTL 会跟踪跳中响应 IP 发生变化的时间。`!` 指示器标记路由抖动,并且跳的详细信息会显示变更历史。ECMP 负载均衡则会显示 `E`,因此您可以区分真正的不稳定和预期的多路径行为。 ### 检测透明代理 某些网络使用操纵 TTL 值的透明代理来拦截流量: ``` sudo ttl -p tcp --port 80 website.com ``` 当检测到 TTL 操纵时,将出现 `[TTL!]` 指示器。 ### 区分真实丢包和 ICMP 速率限制 第 5 跳 30% 的丢包可能是假的——路由器通常会限制 ICMP 响应的速率: ``` sudo ttl target.com ``` `[RL?]` 指示器和丢包列中的 `50%RL` 告诉您这是速率限制,而不是实际的数据包丢弃。 ### 比较多个路径 ``` sudo ttl 8.8.8.8 1.1.1.1 9.9.9.9 ``` 一次追踪多个目的地。按 `Tab` 在它们之间切换,或按 `l` 查看所有目标的列表。 ### 追踪所有解析的 IP (Round-Robin DNS) ``` sudo ttl --resolve-all google.com ``` 当主机名解析为多个 IP(Round-Robin DNS、CDN 负载均衡)时,追踪所有这些 IP 以比较路径。按 `l` 查看所有已解析的目标及其统计信息。 ## 快捷键 | 按键 | 操作 | |-----|--------| | `q` / `Ctrl+C` | 退出 | | `p` / `空格键` | 暂停/继续 | | `r` | 重置统计信息 | | `t` | 切换主题 | | `w` | 切换显示模式 | | `s` | 设置 | | `e` | 导出 JSON | | `?` | 帮助 | | `u` | 关闭更新横幅 | | `o` | 添加目标 | | `Tab` | 下一个目标 | | `l` | 目标列表 | | `Enter` | 展开跳信息 | | `←` / `→` | 回放:快进/快退 ±0.5秒 | | `[` / `]` | 回放:快进/快退 ±5秒 | | `+` / `-` | 回放:速度 ±0.5倍 | | `Home` / `End` | 回放:跳至开头/结尾 | *回放控制仅在 `--animate` 回放模式下激活。有关完整表格,请参阅 [docs/FEATURES.md](docs/FEATURES.md#replay-controls)。* ## 主题 11 种内置主题:`default`、`kawaii`、`cyber`、`dracula`、`monochrome`、`matrix`、`nord`、`gruvbox`、`catppuccin`、`tokyo_night`、`solarized` ``` ttl 1.1.1.1 --theme dracula # Start with theme # 按 't' 循环切换主题(保存至 ~/.config/ttl/config.toml) ``` ## 平台支持 | 平台 | 状态 | |----------|--------| | Linux | 完全支持 | | macOS (Tahoe 26+) | 完全支持 | | macOS (Sequoia 15) | 从源码构建* | | FreeBSD | 实验性** | | NetBSD | 实验性** | | Windows (WSL2) | 完全支持 | | Windows (原生) | 不支持 | *预编译的二进制文件是在 `macos-latest` (Tahoe) 上构建的。旧版 macOS 可能存在显示问题 - 请使用 `cargo install ttl` 从源码编译。 **FreeBSD/NetBSD 支持是实验性的。需要 `sudo`。不支持接口绑定 (`-i`)。请在 https://github.com/lance0/ttl/issues 报告问题 ### 通过 WSL2 使用 Windows ``` wsl --install # Install WSL if needed, then restart wsl # Open Ubuntu ``` 然后在 Ubuntu 中: ``` # 选项 1:通过 cargo 安装(推荐) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.cargo/env cargo install ttl sudo ~/.cargo/bin/ttl 8.8.8.8 # 选项 2:通过安装脚本使用预编译二进制文件 curl -fsSL https://raw.githubusercontent.com/lance0/ttl/master/install.sh | sh sudo ttl 8.8.8.8 ``` ## 已知问题 - **macOS Sequoia 上的 iTerm2**:初始显示可能渲染不正确。按 `r` 重置,或使用 Terminal.app。 ## 已知限制 ### 权限 - Linux:需要 `CAP_NET_RAW` 权限或 root(参见[权限](#permissions-linux)) - macOS/FreeBSD/NetBSD:需要 root (`sudo ttl target`) - 需要 RAW sockets 才能接收来自中间路由器的 ICMP 超时报文 ### 协议限制 - ICMP 探测:某些网络会过滤 ICMP,请尝试 `-p udp` 或 `-p tcp` - TCP 探测:仅支持 SYN(无连接建立) - UDP 探测:高端口可能会被防火墙过滤 ### 多流模式 - NAT 设备可能会重写源端口,从而破坏流关联 - 检测到此情况时,`[NAT]` 指示器会发出警告 ## 文档 - [功能](docs/FEATURES.md) - 详细的功能文档和 CLI 参考 - [脚本化](docs/SCRIPTING.md) - CI/CD 集成、JSON 解析、Docker 用法 - [架构](docs/ARCHITECTURE.md) - 内部设计和模块结构 - [贡献](CONTRIBUTING.md) - 开发设置和指南 - [比较](docs/COMPARISON.md) - 与类似工具的比较(包括 pathping) - [Changelog](CHANGELOG.md) - 发布历史 - [路线图](ROADMAP.md) - 计划中的功能 ## 故障排除 ### "sudo: ttl: command not found" sudo 使用受限的 PATH。请使用完整路径或将其复制到 sudo 可访问的位置: ``` # 选项 1:使用完整路径 sudo ~/.cargo/bin/ttl 8.8.8.8 # 选项 2:复制到 /usr/local/bin(一次性) sudo cp ~/.cargo/bin/ttl /usr/local/bin/ # 选项 3:Symlink(通过 cargo install 自动更新) sudo ln -sf ~/.cargo/bin/ttl /usr/local/bin/ttl ``` ### 权限错误 Raw ICMP sockets 需要 `CAP_NET_RAW` 或 root。请参见[权限](#permissions-linux)。 ### 高丢包率 尝试增加探测间隔:`ttl target -i 2.0` 某些路由器会限制 ICMP 的速率 - 请在 TUI 中查找 `[RL?]` 指示器。 ### 所有跳均显示 `* * *` 检查防火墙规则、VPN 配置或尝试其他协议:`ttl -p udp target` ### 主题/配置未保留 自 v0.12.1 起,为符合 Apple 指南,macOS 上的配置目录从 `~/Library/Preferences/ttl/` 更改为 `~/Library/Application Support/ttl/`。如果您有现有配置,请将其移动: ``` mv ~/Library/Preferences/ttl ~/Library/Application\ Support/ttl ``` ## 许可证 根据以下任一许可证授权: - Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE)) - MIT license ([LICENSE-MIT](LICENSE-MIT)) 由您选择。
标签:Rust, traceroute, TUI, 可视化界面, 情报分析, 系统运维, 网络流量审计, 网络诊断, 自定义请求头, 请求拦截, 路由分析, 通知系统