curl -I the site without trouble. But when you scp a backup, download a large file, or load a heavy page, the transfer starts, stalls after a few kilobytes, and then sits there with no error until something times out. When small requests work and big ones hang, the network path is usually dropping large packets while letting small ones through. The job is to find out why, because the fix depends on which of three causes you are dealing with.
Why only the big packets go missing
Three causes that look the same from outside
Testing with ping and tracepath
BASH
# Show the MTU each interface thinks it has (read-only)
ip link show
# IPv4: full 1500-byte packet, Don't Fragment set
# 1472 payload + 8 ICMP header + 20 IP header = 1500
ping -c 3 -M do -s 1472 203.0.113.10
# Step down to find the size that actually gets through
ping -c 3 -M do -s 1400 203.0.113.10
# IPv6: 1452 payload + 8 ICMPv6 header + 40 IPv6 header = 1500
ping -6 -c 3 -M do -s 1452 2001:db8::10
# Per-hop path MTU as seen from this host
tracepath -n 203.0.113.10
# During a stalled transfer: MSS, retransmits, and RTT for the socket
ss -ti dst 203.0.113.10ip link show reports. A gap between the two means your interface MTU is wrong for the network it sits on.
If the gateway is fine and a remote host fails, watch what ping prints. If you get a reply saying fragmentation is needed, with an MTU value, PMTUD is working. Some hop has a smaller MTU and is reporting it, so TCP should adapt on its own. If large pings simply time out while small ones succeed, and nothing comes back, the router's ICMP message is being lost somewhere. That is the black hole pattern.
tracepath adds per-hop detail. It reports a pmtu value as it goes and prints the discovered path MTU at the end. If the reported value drops at a specific hop, that hop is where the path narrows. If tracepath shows 1500 throughout but large pings still vanish, the narrowing happens somewhere that doesn't report it.
A few caveats. ICMP echo can be rate limited or blocked separately from other ICMP types, so a total ping failure doesn't prove anything about MTU. Compare sizes against the same target and look at the pattern. Also, on a stalled connection ss -ti shows the mss in use and a growing retrans count. An MSS of 1460 combined with retransmits that keep climbing is consistent with full-size segments disappearing.
Choosing the fix
| Cause | Fix that fits | Main trade-off |
|---|---|---|
| Local MTU mismatch | Set the interface MTU to what the network actually carries | Applies to all traffic. Must be made persistent the right way for your distro |
| ICMP filtered on a firewall you control | Allow ICMP Fragmentation Needed (and ICMPv6 Packet Too Big) | Correct fix, but needs a firewall change and review |
| ICMP filtered somewhere you don't control | MSS clamping on your gateway, or lower MTU on your side | Works around the problem. MSS clamping only helps TCP |
ip link set takes effect right away. Doing it over SSH on the wrong interface can cut your session, so have console access ready. The persistent setting lives in netplan, NetworkManager, ifcfg files, or cloud-init depending on the image, so check how your server is configured before editing anything.
For a black hole on a firewall you own, the clean answer is to stop dropping ICMP errors. Blocking all ICMP breaks PMTUD and adds little security. If you want to filter ICMP, filter echo requests and keep the error types. Many stateful rule sets already accept ICMP errors that belong to an existing connection through a RELATED rule. Check that your rules actually include that, and that an earlier blanket drop doesn't override it.
If the filtering happens upstream, at a provider edge or the client's network, you can't fix it there. MSS clamping rewrites the MSS in TCP handshakes passing through a Linux router or gateway, so both ends agree on segments small enough to fit without needing PMTUD. It is a well-established workaround on tunnel endpoints. It does nothing for UDP. Another option on Linux hosts is the net.ipv4.tcp_mtu_probing sysctl, which lets TCP detect the black hole itself by probing with smaller segments after repeated loss. Treat it as a fallback, not a replacement for fixing the path.
When the tests come back clean
ss -ti during a stall. Steady retransmits at normal segment sizes point to ordinary loss or congestion. A connection that is idle with no retransmits points to the application or the disk. If the stall only happens in one direction, or only between certain networks, asymmetric routing and stateful filtering become likely. That is covered in Deciding If Inter-VPC Timeouts Are Asymmetric Drops or a Dead Path.
The practical rule: when small things work and big things hang, run a DF ping at full size before anything else. If it fails at your gateway, correct your interface MTU. If it fails further out with no ICMP reply, find the firewall eating Fragmentation Needed, and clamp MSS if that firewall isn't yours. If it passes, the problem is somewhere else, and you have saved yourself an afternoon of MTU tuning that would not have helped.