MTU Discovery Tool
Measures the effective path MTU between this server and you, using real kernel path-MTU discovery on this very connection — not a guess derived from your device settings. Then use the calculator to size your WireGuard tunnel correctly.
Your measurement
IPv4
IPv6
Both numbers are read server→client on this connection. Effective MSS is the payload — excluding IP and TCP headers — that this server can put in one segment toward you: the smaller of what your side permitted and what the path allows, less the TCP options in use. It is not your device's own MSS advertisement, and it does not yield your device's MTU. This path is a stand-in for the path to your own VPN server — the constraining hop is almost always your access link.
Past readings on this device
| When | Family | MTU | Kind | Effective MSS | IP |
|---|
WireGuard MTU calculator
- Run this test from your VPN server location (no VPN active) and note the path MTU.
- Run it from your travel location (no VPN active) and note that path MTU.
- Enter both below — set the result in your WireGuard config.
- Activate the tunnel and re-run this test. The new reading is your inner path MTU and should match the calculator's prediction. This also reveals the negotiated inner MTU for auto-tuned tunnels like OpenVPN.
Which number goes in? Use the Path MTU from each card when it is shown. When a card reports a Demonstrated floor instead, use that — it is the largest packet the path was actually proven to carry, so sizing from it is conservative and the tunnel fits. Re-running from a different attachment point (hotel Wi-Fi, phone hotspot, home LAN) and comparing the results is how you find where the path narrows.
Set in your WireGuard config:
From a terminal or router
The best server-side reading comes from the VPN endpoint itself — SSH to your home router and run:
curl -s https://mtu.remotetohome.io # add -4 or -6 to force a family
wget -qO- https://mtu.remotetohome.io # BusyBox/OpenWrt routers without curl
Scripting? curl -s 'https://mtu4.remotetohome.io/?format=json' | jq '.path_mtu // .demonstrated_mtu'
— that yields the route's path MTU when it was established and the demonstrated floor
when it was not, which is the number you want for sizing either way. Use
jq '{converged, path_mtu, demonstrated_mtu, reason}' when you need to know which
of the two you got. Reading .path_mtu alone is fine but hands you a bare
null with no explanation on a narrowed path (.reason carries it).
Verify it yourself (manual DF ping)
From any machine with a real ping, probe with the Don't Fragment bit set. Largest payload that succeeds + 28 = your IPv4 path MTU.
ping -M do -s 1472 -c 3 8.8.8.8 # 1472 + 28 = 1500
ping -M do -s 1464 -c 3 8.8.8.8 # 1464 + 28 = 1492 (PPPoE-typical)
| Largest passing payload | Path MTU | Typical cause |
|---|---|---|
| 1472 | 1500 | Clean Ethernet path |
| 1464 | 1492 | PPPoE (8-byte header) |
| 1412 | 1440 | WireGuard over IPv4 (60-byte overhead) |
| 1392 | 1420 | WireGuard over IPv6 (80-byte overhead) |
| 1252 | 1280 | IPv6 minimum / conservative tunnel floor |
If even tiny DF pings fail, the target filters ICMP — that is filtering, not your link's MTU.