IPv6 network unreachable -- IPv6 disabled or broken, app binds IPv6 only
'connect: Network is unreachable' when the app tries to connect via IPv6
Focused incident mode — strips away everything but this runbook.
Symptoms
- 'connect: Network is unreachable' when the app tries to connect via IPv6
- Application binds to [::] (IPv6 all-interfaces) but IPv6 is disabled on the host
- ping6 or ip -6 route shows no default route or ' unreachable'
Dual-stack applications that default to IPv6 will silently fail if IPv6 is half-configured. The app may start fine but all connections time out or return 'Network is unreachable'. Always verify both IPv4 and IPv6 connectivity.
Evidence to grab
Collect these artifacts before you change anything — they prove (or rule out) each cause.
IPv6 status on the interface
ip -6 addr show | grep 'scope global'IPv6 routing table
ip -6 route show
Diagnostic flow
Run the steps in order, marking each claim confirmed or refuted. The evidence you gather feeds the ranked causes below.
Guided decision tree is ready.
Steps with commands, expected output, and pass/fail branches.
Ranked root causes
Evidence checklist
- ip -6 addr shows no global addresses
- sysctl net.ipv6.conf.all.disable_ipv6 = 1
Confirm before fixing
sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6Check if IPv6 is disabled via sysctl
Expected: disable_ipv6 = 0 (enabled) or 1 (disabled)
Fix
sysctl -w net.ipv6.conf.all.disable_ipv6=0 && sysctl -w net.ipv6.conf.default.disable_ipv6=0Re-enable IPv6 on all interfaces
Resolution runbook
Apply from top to bottom after the cause is confirmed. Review every command before running it — risk tags are shown on each.
ip -6 addr show | grep 'scope global'Check for global IPv6 addresses
ip -6 route show | grep defaultCheck for an IPv6 default route
sysctl net.ipv6.conf.all.disable_ipv6Check if IPv6 is disabled
sysctl -w net.ipv6.conf.all.disable_ipv6=0Re-enable IPv6 if it was disabled
Prevention
- Test both IPv4 and IPv6 connectivity during server provisioning.
- Disable IPv6 explicitly if it's not supported, rather than leaving it half-configured.
- Use getaddrinfo() with AI_V4MAPPED or AI_ADDRCONFIG to handle dual-stack properly.
- Monitor IPv6 route and address presence as part of network health checks.
Related runbooks
Same stack, same failure family — worth a skim.
Small HTTP requests succeed but large responses or file transfers hang or fail
'No route to host' errors between hosts on the same subnet
Commands marked READ CHANGE DESTRUCTIVE — never run DESTRUCTIVE commands against production data you cannot restore. Copy → verify → execute.