Back to blog

Broken by Design  ·  Layer 3 / Tunnels · How Networks Fail · October 2026

Broken by Design
The Ping Works,
the Transfer Hangs

The classic VPN complaint: “I can ping it, SSH connects, small pages load — but big downloads, file shares and some websites just freeze halfway.” Nothing is down. A packet somewhere is too big for a link in the path, the router that should say so is being silenced, and the sender keeps resending a packet that can never fit. This is the MTU black hole.

Broken by Design MTU PMTUD MSS Clamp Tunnels ICMP

Every link has a Maximum Transmission Unit — the largest frame it will carry (1500 bytes on plain Ethernet, less inside a tunnel: PPPoE 1492, IPsec/GRE/WireGuard lower still). When a host sends a full-size packet with the Don’t Fragment bit set and it reaches a link too small for it, the router is supposed to drop it and send back an ICMP “fragmentation needed” message telling the sender to use a smaller packet. That feedback loop is Path MTU Discovery.

Block that ICMP — with a lazy “drop all ICMP” firewall rule, or a provider who filters it — and the loop goes silent. The sender never learns, keeps retransmitting the same too-big packet, and the transfer stalls forever while small packets pass fine. It is called a black hole because the packets vanish with no error anywhere the user can see.

Part of

01

Small Passes, Big Dies, Nobody Is Told

A small ping crosses the narrow tunnel link fine. The big packet is too large, the “too big” message is blocked, and the sender keeps resending it into the void.

SenderMTU 1500 tunnelMTU 1400 Server × × small packet / ping — fits, passes ICMP “frag needed” blocked by firewall big packet (DF) — too big, dropped The sender is never told to shrink, so it resends the same oversized packet — and the transfer hangs.

Why does SSH connect then hang? The handshake is small packets — it completes. The moment the server sends a big burst (a directory listing, the TLS certificate, a file), those full-size segments hit the narrow link and vanish. So the session opens and then freezes on the first large response, which feels bizarre until you know the shape of this bug.

02

Why It Happens

A tunnel lowers the path MTU; the Don’t-Fragment bit forbids the router from splitting the packet; a blocked ICMP removes the only way the sender would find out.

IngredientRole in the black hole
A tunnel in the pathIPsec/GRE/WireGuard/PPPoE add headers, so the usable MTU inside is below 1500 — often 1400 or less.
Don’t Fragment setModern TCP sets DF and relies on PMTUD, so the router may not fragment — it must signal instead.
ICMP type 3 code 4 blocked“Fragmentation needed” is the signal. A blanket ICMP drop silences it — the sender never shrinks.
Large payloads onlyHandshakes and pings are small and pass; bulk transfer and TLS certs are full-size and die. Hence “works then hangs.”

03

The Symptoms

Every tell points at size: it is fine until something big crosses the path.

What you seeWhat it tells you
Ping fine, SSH connects then freezes on outputSmall passes, first big burst dies — the signature.
Some websites load headers then stallBig responses (images, TLS cert chains) hit the MTU wall.
Only VPN / tunnel users affectedThe low-MTU link is inside the tunnel.
A big ping with DF fails; a small one worksDirect proof of the breaking size (see the field check).

04

The Fix: Clamp MSS, and Stop Blocking the Signal

Two fixes, and you usually apply both: let the ICMP through, and clamp TCP so it never sends a segment too big for the tunnel in the first place.

The robust fix on a tunnel edge is MSS clamping: the router rewrites the TCP Maximum Segment Size in the handshake down to what the tunnel can carry, so both ends agree to send segments that always fit. It does not rely on ICMP getting through at all, which is why it is the real fix rather than a workaround.

Clamp MSS to the path MTU on the tunnel (RouterOS)
# rewrite MSS on TCP SYNs crossing the tunnel to fit the path automatically
/ip firewall mangle
add chain=forward protocol=tcp tcp-flags=syn action=change-mss new-mss=clamp-to-pmtu \
    out-interface=wg-tunnel passthrough=yes
# and set the tunnel interface MTU/MRU correctly so PMTUD has the right number
Cisco: clamp on the tunnel, and permit the ICMP
interface Tunnel0
 ip tcp adjust-mss 1360
! do NOT blanket-drop ICMP — permit unreachables (type 3) inbound
ip access-list extended WAN-IN
 permit icmp any any packet-too-big
 permit icmp any any unreachable
⚠ Gotcha — “drop all ICMP” is how you build this bug

Blocking ICMP wholesale “for security” is the single most common cause of an MTU black hole. ICMP type 3 code 4 (fragmentation needed) is not an attack — it is load-bearing plumbing for the modern internet. Permit the unreachables even if you rate-limit or drop echo. The rest of this series is full of “the safe-looking default that breaks everything,” and this is the layer-3 one.

05

Catch It in 30 Seconds Field check

Binary-search the breaking packet size with DF set. The size where ping stops working is your path MTU.

Find the breaking size
# Linux/mac: ping with Don-t-Fragment, sweeping the payload size
ping -M do -s 1472 SERVER     # 1472+28 = 1500; fails if path MTU < 1500
ping -M do -s 1372 SERVER     # 1372+28 = 1400; works -> path MTU is ~1400
# Windows: ping -f -l 1472 SERVER

# confirm the ICMP is being blocked rather than sent
sudo tcpdump -ni any 'icmp[icmptype] == 3'   # frag-needed arriving? or silence?

If a small ping works and a big one with DF fails, and you see no “fragmentation needed” ICMP coming back, you have a black hole. Clamp MSS on the tunnel and the transfers unstick immediately — then fix the ICMP filtering so PMTUD works for everything else too.

Takeaways

  1. “Ping works, big transfers hang” is an MTU problem until proven otherwise — especially over a tunnel.
  2. PMTUD depends on one ICMP message (type 3 code 4). Block it and the sender never learns the packet is too big.
  3. SSH/TLS connect then freeze because the handshake is small and the first big burst dies at the narrow link.
  4. MSS clamping is the real fix — it makes TCP fit the tunnel without relying on ICMP at all.
  5. Never blanket-drop ICMP — permit the unreachables; they are plumbing, not an attack.
  6. Prove it by sweeping ping size with DF — the size that fails is your path MTU.

VPN or tunnel that works for small things and hangs on big ones?

The MTU black hole is invisible to a ping and obvious once you measure it. I find the breaking packet size, fix Path MTU Discovery, and clamp MSS on the tunnel so transfers stop freezing.

Book a Discovery Call →