The kolu-ci-* Incus pool boxes all egress through one shared NAT IP: 219.65.110.2.
Unauthenticated requests from that IP to api.github.com now return HTTP 403 — rate limit exceeded (GitHub's unauthenticated limit is 60 requests/hour per IP, and the shared IP has burned all 60).
$ curl -s -D - -o /dev/null https://api.github.com
HTTP/2 403
server: Varnish
x-ratelimit-limit: 60
x-ratelimit-remaining: 0
x-ratelimit-used: 60
x-ratelimit-resource: core
x-ratelimit-reset: 1782986747
$ curl -s https://api.github.com
{"message":"API rate limit exceeded for 219.65.110.2. (But here's the good news:
Authenticated requests get a higher rate limit. Check out the documentation for
more details.)","documentation_url":".../#rate-limiting"}
$ curl -s https://api.ipify.org # egress IP GitHub sees
219.65.110.2
General connectivity from the box is otherwise fine:
github.com -> HTTP 200
cache.nixos.org -> HTTP 200
DNS -> resolves
ci/pu/lease.sh's egress health-probe is an unauthenticated curl -sf https://api.github.com.
The 403 makes curl -sf (fail-on-≥400) exit non-zero, so lease.sh marks every box NOEGRESS
and skips it → the whole linux CI pool is unusable, even though the boxes are healthy.
The unauthenticated 60/hr limit is per egress IP, and every CI box shares 219.65.110.2,
so the budget is exhausted almost continuously. Options, in rough order of durability:
- Authenticate GitHub egress from the boxes — put a
GITHUB_TOKEN(a PAT / app token) in the box env soapi.github.com(andgh) use the authenticated 5000/hr limit instead of 60/hr. This is the real fix — the boxes make authenticated calls anyway during CI. - Give the pool a dedicated egress IP (or a small pool of them) instead of sharing one NAT IP with everything else behind that gateway, so the 60/hr budget isn't drained by neighbours.
- (probe-only mitigation, filed separately) repoint
lease.sh's probe off unauthenticatedapi.github.comtogithub.com/cache.nixos.org(not unauth-rate-limited) so a rate-limitedapi.github.comcan't false-negative the pool — but that only unblocks the lease gate, not any real authenticatedapi.github.comusage during a run.
Shared NAT IP: 219.65.110.2 · reset epoch seen: 1782986747.