Skip to content

CONNECT-IP server lacks overload limits and tenant isolation checks #991

Open

Description

@ecv

The CONNECT-IP server from #954 has no binary or deployment yet. Before anything exposes it to the internet, it needs four fixes that did not block the review.

  1. Any client can open unlimited sessions and admission calls, because no limit sits ahead of admission.
  2. Unauthenticated clients get a probe packet before admission runs.
  3. One full tunnel device tears down other tenants' sessions.
  4. Routes are checked against each other but not against other tenants' ranges.

Lease fencing on the datapath is tracked in #976, and overload limits are a #970 criterion. Done when each item is fixed or the wrapper that exposes the server handles it. The detail is in the first comment.

Related to #954, #970, #976

Galactic Edge integration (#992)

Implement this milestone as a consumer of the Galactic Edge provider contract. #992 owns provider authorization, host attachment lifecycle, shared-state fencing and maintenance, independently enforced forwarding expiry, prefix conflict arbitration/publication, and gVPC traffic policy. MASQUE owns client authentication, connector /96 assignment and retention, session packet checks, transport behavior and its provider adapter. Use the foundation's versioned contract and existing provider helpers; do not introduce a second host-networking controller, lease store or BGP publisher. Any required foundation change must be tracked and qualified under #992 before this milestone claims integrated acceptance.

Integration disposition and acceptance

This issue is an exposure gate for #980/#981, with #984 supplying subsequent load qualification. #992 provides foundation gates and route arbitration; it does not automatically fix CONNECT-IP admission or queue behavior.

Activity

  1. ecv commented on Oct 22, 2026

    @ecv
    ContributorAuthor

    Detail, as of #954 at c6c48bd:

    1. server.go runs Admit with no per-connection, per-client or global cap, and Config sets no QUIC stream or connection limits. Each admitted session holds two 64KB buffers and up to 256 queued packets in TUNBackend. Add a bounded in-flight and session semaphore ahead of Admit, set explicit QUIC limits, and cap queued bytes per session.
    2. probeInnerMTU sends a 1.3KB datagram to any request with a well-formed bearer token, before Admit. Move it after admission.
    3. In tun.go, any unix.Write error, EAGAIN on a full nonblocking TUN included, ends the session, and all sessions share backend.mu. Count EAGAIN as a dropped packet instead.
    4. routeRanges checks routes against each other only, not against other tenants' /96s or the assigned prefix. Route authority belongs to the admission adapter, which does not exist yet.
    5. TUNBackend never checks lease state, so forwarding stops only when lease.Done() closes the session. Keep NewTUNBackend unexported until a fencing wrapper exists (Integrate connector ownership with Edge claims and independent expiry #976).
    6. Inbound source-address and destination-route checks live in connect-ip-go v0.6.0. Confirm the library enforces both in both directions for IPv4 and IPv6. TUN return traffic demultiplexes on the destination /96 only, so IPv4 packets never match a session.
  2. added
    tech-debtInternal quality/maintenance: unwind shortcuts, config drift, overdue upgrades, fork/dep hygiene
    on Oct 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtInternal quality/maintenance: unwind shortcuts, config drift, overdue upgrades, fork/dep hygiene

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions