Thanks to visit codestin.com
Credit goes to github.com

Skip to content

fix(agent): detect IPv6-bound listening ports - #27765

Merged
bpmct merged 3 commits into
mainfrom
fix-ipv6-listening-ports
Aug 3, 2026
Merged

fix(agent): detect IPv6-bound listening ports#27765
bpmct merged 3 commits into
mainfrom
fix-ipv6-listening-ports

Conversation

@bpmct

@bpmct bpmct commented Aug 1, 2026

Copy link
Copy Markdown
Member

Closes #15675

Dev servers that bind to the IPv6 wildcard address (Next.js, Node's default http.Server, Go's net.Listen on wildcard addresses, and others) never showed up in the dashboard Ports panel, even though they were listening and reachable. The agent's port scanner only called netstat.TCPSocks, which reads /proc/net/tcp (IPv4 only); an [::] dual-stack socket lives exclusively in /proc/net/tcp6, so the panel reported "No open ports were detected."

Also scan netstat.TCP6Socks and merge the results into the existing dedupe loop. The IPv6 scan failure is non-fatal so hosts with IPv6 disabled (missing /proc/net/tcp6, Windows with the v6 stack off) keep their IPv4 results instead of the Ports panel 500ing.

Both captures below: python3 -m http.server 5123 --bind :: running in the same workspace, built from main vs this branch (full recordings).

Before

before

After

after

Debugging and decision log
  • Reproduced on a dogfood workspace: next-server listening on *:3000 per ss -tlnp, curl returning 200, but GET /api/v2/workspaceagents/{agent}/listening-ports returning {"ports": []}. Port 3000 (hex 0BB8) present in /proc/net/tcp6, absent from /proc/net/tcp.
  • Confirmed agent/ports_supported.go only calls netstat.TCPSocks; the library's TCP6Socks (parses /proc/net/tcp6 on Linux, GetTcp6Table2 on Windows) was never referenced.
  • Control test: an IPv4-bound (0.0.0.0) listener was detected correctly, isolating the bug to the missing IPv6 scan.
  • Made the IPv6 scan failure non-fatal after review: returning an error would break the entire ports endpoint (HTTP 500 on every poll) on IPv6-disabled hosts, a regression from the current behavior of "IPv4 ports only." Silent fallback matches the spirit of ports_unsupported.go, which returns an empty list rather than erroring.
  • The fix lives in the OS-backed osListeningPortsGetter behind the ListeningPortsGetter interface from fix: mock Agent querying OS for listening ports in tests #20842, so the fake used by coderd tests is unaffected.
  • Dedupe by port in the existing seen map covers dual-stack sockets that appear in both tables on Windows.
  • TestOSListeningPortsGetter_IPv6 listens on [::]:0 and asserts detection; it skips when the host can't bind IPv6. Verified it fails against the pre-fix code.

🤖 This PR was opened by Coder Agents on behalf of @bpmct.

@bpmct
bpmct marked this pull request as ready for review August 1, 2026 22:51
Comment thread agent/ports_supported_internal_test.go
Comment thread agent/ports_supported.go
@bpmct
bpmct merged commit 8a4adee into main Aug 3, 2026
28 checks passed
@bpmct
bpmct deleted the fix-ipv6-listening-ports branch August 3, 2026 18:50
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 3, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

add support for detecting IPv6 services for port sharing

2 participants