Static egress IP lost route to most of the internet since 2026-08-21 16:42 UTC

Prior to investigation I tried restarting app/machine, it didn’t help.

Investigation:

I tried directly from the node:

curl -m 15
https://direct-book.com                              dns=0.026064 conn=0.000000 tls=0.000000 total=15.002466 code=000
https://mobile.theviewshotels.pt                     dns=0.150454 conn=0.000000 tls=0.000000 total=15.002340 code=000
https://api.apaleo.com                               dns=0.036334 conn=0.056575 tls=0.108662 total=0.134561 code=302
https://gw.dataimpulse.com:823                       dns=0.001068 conn=0.000000 tls=0.000000 total=15.002813 code=000

The TCPhandshake never completed, SYNs go out, nothing comes back.

Forcing IPv4 changed nothing.

I confirmed egress address, it was 209.71.75.252

Did some random geo requests:

www.minfin.gr            conn=0.000000 code=000     (GR)
www.uoa.gr               conn=0.000000 code=000     (GR)
www.sapo.pt              conn=0.000000 code=000     (PT)
www.cgd.pt               conn=0.000000 code=000     (PT)
www.siteminder.com       conn=0.050152 code=403     <- works
cloudflare.com           conn=0.002208 code=301     <- works

I tried same requests from my other machine which doesn’t have associated static IP address, everything was good.

Did fly machine egress-ip release <ID>

The moment I did it everything got back normal.

This is clearly some nasty bug on your side Fly.io team.

Your first four worked for me without a specific egress facility, from a Fly machine in London.

I assume your released egress ID is still available internally, and someone at Fly could have a look at that. Does release remove the fixed egress address? What happens if you create another?

The most recent Infra Log entry mentioned a known bug with the static egress IPs, which they are (/ were) gradually fixing. (“For existing hosts, kernel upgrades will be applied as they are gradually rebooted. Of course, this is a somewhat slow process and unless we decided to reboot every existing host at once, we’ll likely continue to see these issues from time to time.”)

(Also, they have a more lasting fix in the works, :sweat_smile:.)

[A “host” in this context is the underlying physical server machine, so rebooting the VM wouldn’t have helped. Cloning it might have worked, though, since that can land you on a different physical machine.]

In general, the community forum here is the slowest and least reliable way of contacting Fly Support. People who find that they have a clearly broken static egress setup and who have a Support Plan should instead use their ticketing system in the dashboard. From what they were saying in the Log, there’s a reset procedure that they can do at their end…

Same bug here, same start time, app quarri in iad — and in our case it hit all three of our dedicated egress IPs at once, so it isn’t one unlucky host:

0801650b747698 (worker)  209.71.104.188   2a09:8280:e618::92:853e:2
78140eebd49298 (app)     209.71.81.70     2a09:8280:e618::92:853e:0
48e4646fe51258 (app)     209.71.104.244   2a09:8280:e618::92:853e:1

Since ~16:30 UTC 21 Aug: TCP SYNs to api.motherduck.com, api.openai.com, identity.xero.com, api.github.com and a customer MSSQL host on :1433 get no reply; DNS fine; MSS clamp to 1200/1000 changes nothing (fails at the SYN, so not PMTU); IPv6 sometimes handshakes then stalls at 0 bytes. Early on a couple of destinations still answered and google.com flapped 200/timeout; by 15:51 UTC today even ifconfig.me over v4 is dead. flyctl machine restart did nothing. Control: ephemeral machines in the same app/region on shared-pool egress (64.34.84.14, 216.246.40.69) reach everything instantly.

One more data point: flyctl machine egress-ip list -a quarri prints an empty table for us, although ifconfig.me (while it still answered) confirmed the machines were egressing from the IPs above.

We can’t take the egress-ip release route — these three IPs are allowlisted in customers’ firewalls for MSSQL sources, so releasing/re-allocating means customer-side changes. We’ve moved production onto cloned shared-pool machines for now, but the allowlisted sources are down until the dedicated path is repaired.

@flyio-support — could you run the reset procedure mentioned in the Infra Log for these three IPs (or migrate the machines to a patched host) while keeping the same IP assignments? Happy to run any diagnostics you need. We’re on pay-as-you-go so the dashboard ticketing isn’t available to us.

Just chucking ideas into the pool in the spirit of getting you going.

You mentioned DNS is fine; I was going to suggest adding in Google or Cloudflare’s dotted quads. Failing that, could you configure a proxy inside these machines, which point to a stable proxy somewhere else? I don’t know if that would be subject to the same networking problem you’re bumping into, but it might be worth a ponder.

Thanks @halfer. DNS is genuinely fine (resolves instantly, it’s the SYNs that never get answered), and a proxy doesn’t help here unfortunately: outbound from these machines is dead to any destination, so they can’t reach a proxy, and if traffic went via another box it would exit from that box’s IP rather than the allowlisted ones — which is the whole constraint. So it’s really down to the host-side tunnel reset on Fly’s end.

It’s weird that you and @Desprit had the same onset time, since it doesn’t sound like he is in iad, :thinking:..

The Machine-scoped egress IPs are deprecated now, so they might not have as thorough of monitoring in place.

According to the official docs, people can upgrade to app-scoped egress IPs without losing the specific addresses that they have already, although if fly m egress-ip list is reading empty then that might not be viable…


Aside: I’ve added the Questions / Help category to this thread, which will improve the odds of it getting noticed—as explained in the sticky post. (In contrast, the @ notifications don’t actually work with the flyio-support account, as far as I know.)

@mayailurus that was the answer — thank you. Outcome, for anyone else landing here:

  1. The empty fly m egress-ip list was my own fault: flyctl was on v0.4.1. After fly version upgrade (v0.4.87) it lists all three machine-scoped IPs fine, and that version also has the promote subcommand.
  2. fly machine egress-ip promote <machine-id> -a quarri converted one of the IPs to app-scoped, same address. Every machine in the app/region picked it up immediately — including fresh clones on healthy hosts — and outbound is fully working again: MotherDuck connects in 0.5s, and the customer MSSQL sources that allowlist that IP synced successfully (3M+ rows) within minutes. No customer-side change needed.

So for machine-scoped egress IPs caught by this bug: upgrade flyctl, promote to app-scoped, and make sure at least one machine is on a host other than the broken one (a clone will do). The two IPs still machine-scoped on the stopped originals remain dead, which is consistent with the host-tunnel explanation.

Hi! Sorry for this, it does seem like there was some issue with machine-scoped egress IPs in iad, though probably separate from the host tunnel issue mentioned in the Infra Log. In any case, moving to app-scoped egress IPs is the right move as they should be much more reliable compared to machine-scoped egress IPs; app-scoped ones were a redesign based on the limitations and unreliability with machine-scoped egress IPs. Machine-scoped ones are considered “soft-deprecated” at this point), though we should probably have been much louder in the messaging here to “nudge” the move to app-scoped egress IPs.