https://github.com/antonio-prado/ping6-it
Compare IPv4 vs IPv6 latency and reachability using Globalping probes (ping, traceroute, DNS, HTTP).
https://github.com/antonio-prado/ping6-it
dns globalping http ipv4 ipv6 mtr network-measurement observability ping react traceroute
Last synced: 13 days ago
JSON representation
Compare IPv4 vs IPv6 latency and reachability using Globalping probes (ping, traceroute, DNS, HTTP).
- Host: GitHub
- URL: https://github.com/antonio-prado/ping6-it
- Owner: Antonio-Prado
- License: agpl-3.0
- Created: 2026-01-08T16:33:11.000Z (24 days ago)
- Default Branch: main
- Last Pushed: 2026-01-12T09:57:54.000Z (20 days ago)
- Last Synced: 2026-01-12T18:49:41.766Z (20 days ago)
- Topics: dns, globalping, http, ipv4, ipv6, mtr, network-measurement, observability, ping, react, traceroute
- Language: JavaScript
- Homepage: https://ping6.it
- Size: 271 KB
- Stars: 7
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ping6.it
**ping6.it** is a small web UI that runs the same network measurement over **IPv4 and IPv6** on the **same set of probes** (Globalping) and presents a side-by-side comparison.
It is intended for **quick, reproducible v4 vs v6 troubleshooting**: reachability gaps, latency deltas, loss anomalies, and routing/path asymmetries.
> Experimental beta: defaults, UI layout, and comparison logic may evolve.
Live: https://ping6.it
Feedback: mailto:antonio@prado.it
## Main features
- **Fair v4/v6 comparison** by pinning both runs to the **same probes**
- **Commands:** `ping`, `traceroute`, `mtr`, `dns`, `http`
- **Geo selection** (macro region + sub-regions) and **Net** filter (eyeball/datacenter)
- Probe filters: **limit**, **ASN**, **ISP**, **IPv6-capable probes only**
- **Multi-target** mode (run the same command over multiple targets)
- **Exports:** JSON (raw bundle) and CSV (per-probe rows)
- **Share link** (settings) and **Report mode** (shareable link embedding results)
- **History (local)** stored in your browser (and run-to-run comparison)
## Table of contents
- [What ping6.it is for](#what-ping6it-is-for)
- [How the v4v6 comparison works](#how-the-v4v6-comparison-works)
- [Target validation](#target-validation)
- [Common controls](#common-controls)
- [Commands](#commands)
- [ping](#ping)
- [traceroute](#traceroute)
- [mtr](#mtr)
- [dns](#dns)
- [http](#http)
- [Interpreting results](#interpreting-results)
- [API endpoints](#api-endpoints)
- [Limitations and notes](#limitations-and-notes)
- [Development](#development)
- [Contributing](#contributing)
- [Security](#security)
- [Acknowledgements](#acknowledgements)
- [License](#license)
## What ping6.it is for
Typical use cases:
- “IPv6 is slow” → quantify deltas and see where they appear
- “IPv6 fails but IPv4 works” → validate reachability by region / eyeball vs DC
- Resolver differences (DNS) and handshake/transfer timing differences (HTTP)
- Path asymmetry hints (traceroute / mtr), including loss patterns
The goal is not to be a full monitoring suite, but a **fast comparison UI** with reproducible runs.
## How the v4/v6 comparison works
ping6.it creates **two Globalping measurements** (v4 and v6) and ensures they run on the **same probe set**:
- First run selects probes normally (based on `From`, `Net`, limit, ASN/ISP filters, etc.)
- Second run is executed on the **exact same probes** by referencing the first measurement id as `locations`
The ordering depends on the **IPv6-capable probes only** toggle:
- **Enabled (default):**
1) run **IPv6 first** (`ipVersion: 6`) to select probes that can actually execute IPv6
2) run **IPv4** (`ipVersion: 4`) on the **same probes** by referencing the IPv6 measurement id
- **Disabled:**
1) run **IPv4 first** (`ipVersion: 4`) to select probes
2) run **IPv6** (`ipVersion: 6`) on the **same probes** by referencing the IPv4 measurement id
### Target validation
- For `ping`, `traceroute`, `mtr`, and `http`, the target must be a **hostname** (IP literals are rejected) to keep the comparison meaningful.
- For `dns`, the input may also be an **IP literal** (e.g. `PTR`).
- When the target is an IP literal, **IPv6-capable probes only** is disabled (probe selection cannot be safely pinned via hostname rules).
## Common controls
### Language
The UI supports English and Italian. Language is stored locally in your browser.
### Target / Multi-target
- **Single target:** one hostname (or IP literal for DNS).
- **Multi-target:** paste multiple targets (one per line). ping6.it will run them sequentially and show a consolidated summary.
### Command
Selects the measurement type:
- `ping`
- `traceroute`
- `mtr`
- `dns`
- `http`
Changing the command resets the UI to **Basic** mode.
### From (geo)
Selects probe location(s). The UI provides macro regions and sub-regions; the resulting string is sent to Globalping.
### Net
Filters probes by network type:
- `any`
- `eyeball` (access/consumer)
- `datacenter`
Internally this is implemented via Globalping location tags.
### Probes
Number of probes to select (clamped to a small max to reduce abuse and keep results readable).
### ASN / ISP
Optional filters that constrain probe selection:
- **ASN:** numeric ASN (e.g. `12345`)
- **ISP:** free-text label (as supported by Globalping metadata)
### IPv6-capable probes only
Ensures probe selection is driven by IPv6 reachability, then reuses the same probes for IPv4.
### Δ alert (ms)
Optional threshold used in summaries/reports to highlight large v6-v4 deltas.
### Run / Cancel
- **Run** starts the v4/v6 measurement pair on the same probes.
- **Cancel** aborts the in-progress run.
> Note: a Cloudflare Turnstile challenge is used to reduce automated abuse. Verification is performed server-side.
### Basic / Advanced
Toggles the visibility of additional options. Advanced options depend on the selected command.
### Raw
Enabled once both v4 and v6 results are present. Shows the **raw command output** returned by each probe for both IP versions.
### Export JSON / Export CSV
Available once results are present:
- **JSON**: raw bundle (settings + per-probe raw results)
- **CSV**: per-probe rows (useful for quick offline inspection)
### Share link / Report mode
- **Share link**: encodes current settings into URL query parameters.
- **Report mode**: encodes both settings and results into the URL (shareable, read-only view).
## Commands
### ping
Basic:
- target (hostname)
- probes, from/net filters
Advanced:
- **Packets:** packets per probe
Output:
- per-probe timing and loss
- summary medians for v4/v6 and Δ
### traceroute
Basic:
- target (hostname)
Advanced:
- **Proto:** `icmp` / `udp` / `tcp` (depending on Globalping support)
- **Port:** for UDP/TCP modes when applicable
Output:
- reached/last hop, hop count, and timing summaries (v4 vs v6)
### mtr
Basic:
- target (hostname)
Advanced:
- **Packets/hop:** packets per hop
Output:
- loss and latency summaries (v4 vs v6), reached flags
### dns
Basic:
- target (hostname or IP literal for PTR)
Advanced:
- **Query:** record type / query string (as supported by Globalping DNS measurement)
- **Proto / Port**
- **Resolver:** optional; empty means probe default resolver
- **trace:** if enabled, include trace information when supported
Output:
- totals (ms) and ratio v6/v4 where applicable
### http
Basic:
- target (hostname, or a full URL which is split into host/path/query)
Advanced:
- **Method**
- **Proto:** `http` / `https`
- **Path / Query / Port**
- **Resolver:** optional; empty means probe default resolver
Output:
- status codes and total times (ms), ratio v6/v4 where applicable
## Interpreting results
### winner
A compact label indicating which stack “wins” for a given probe/summary:
- `v4` / `v6`: lower time (or better outcome) for that probe
- `tie`: values equal within reported granularity
- `v4 only` / `v6 only`: only one stack returned a usable result
### Δ v6-v4
- Positive: v6 slower than v4
- Negative: v6 faster than v4
### ratio (DNS/HTTP)
For commands where ratio is shown:
- `ratio = v6_total / v4_total`
- `> 1`: v6 slower
- `< 1`: v6 faster
## API endpoints
This repo includes Cloudflare Pages Functions used by the UI:
- `POST /api/measurements-pair`
Creates a v4/v6 measurement pair and validates **Cloudflare Turnstile** server-side.
- `POST /api/globalping/measurements`
Proxy/sanitizer for Globalping create requests (defensive validation/clamping).
- `GET /api/globalping/measurements/:id`
Proxy for reading measurement results.
There is also an NLNOG Looking Glass proxy endpoint under `functions/api/nlnog/` (currently not exposed in the UI).
## Limitations and notes
- **Globalping availability varies.** Some geos and filters can return “no probes found”.
- **IPv6-capable probes only** can reduce availability significantly in sparse regions.
- **The From field is passed through.** If a location string is invalid, Globalping may return validation errors.
- **Turnstile is enforced for pair creation.** Automated usage without a valid challenge token will fail.
- **Experimental beta.** Defaults, UI layout, and comparison logic may evolve.
## Development
Requirements:
- Node.js (the CI uses Node 20)
Install and run:
```bash
npm ci
npm run dev
```
Build:
```bash
npm run build
npm run preview
```
### Cloudflare Pages / Functions configuration
The pair endpoint requires a Turnstile secret configured as an environment variable in Cloudflare:
- `TURNSTILE_SECRET` (Pages environment variable)
The frontend also needs the corresponding Turnstile site key (as configured in the UI code/deployment). Keep the secret server-side only.
## Contributing
See [CONTRIBUTING.md](./CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).
## Security
See [SECURITY.md](./SECURITY.md).
## Acknowledgements
ping6.it is built on top of the Globalping measurement platform (API + distributed probes).
## License
- Source code: GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later) — see [LICENSE](./LICENSE).
- Documentation and website content: Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) — see [LICENSE-DOCS](./LICENSE-DOCS).