highIntermediateSymptom-first#ipv6#dual-stack#unreachable#bind#disabled

IPv6 network unreachable -- IPv6 disabled or broken, app binds IPv6 only

'connect: Network is unreachable' when the app tries to connect via IPv6

Likely source:configurationconnectivity

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_ipv6
READ

Check 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=0
CHANGE

Re-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.

1
ip -6 addr show | grep 'scope global'
READ

Check for global IPv6 addresses

2
ip -6 route show | grep default
READ

Check for an IPv6 default route

3
sysctl net.ipv6.conf.all.disable_ipv6
READ

Check if IPv6 is disabled

4
sysctl -w net.ipv6.conf.all.disable_ipv6=0
CHANGE

Re-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.

Commands marked READ CHANGE DESTRUCTIVE — never run DESTRUCTIVE commands against production data you cannot restore. Copy → verify → execute.