 — because localhost resolved to IPv6."
---

My backend listened on `127.0.0.1:1234`. My frontend called `localhost:1234`. No connection. No error in the server logs. Nothing.

I assumed `127.0.0.1` and `localhost` were the same thing. They're not.

---

## The bug

Node.js 17 changed how it resolves DNS. Before 17, `localhost` resolved to `127.0.0.1` (IPv4). After 17, it respects the system's `/etc/hosts` order. On macOS, `/etc/hosts` lists `::1 localhost` (IPv6) before `127.0.0.1 localhost` (IPv4).

```
# /etc/hosts
127.0.0.1    localhost
::1          localhost    ← Node.js 17 picks this one (first match in DNS order)
```

My backend bound to `127.0.0.1` — IPv4 only. My frontend resolved `localhost` to `::1` — IPv6. The connection attempt went to an address nobody was listening on. No error on the server side because the request never arrived.

```
Frontend: fetch("http://localhost:1234")
           → DNS resolves localhost to ::1
           → connects to [::1]:1234
           → nobody home → connection refused

Backend:  listening on 127.0.0.1:1234
           → never sees the request
           → no error logged
```

The fix: bind to `0.0.0.0` (all interfaces) or explicitly use `127.0.0.1` in the frontend URL instead of `localhost`.

---

## Three addresses, three meanings

These look interchangeable. They're fundamentally different.

| Address | What it means | IPv6 equivalent |
|---|---|---|
| `127.0.0.1` | Loopback — always points to this machine | `::1` |
| `localhost` | A hostname — resolved via DNS/hosts file | same, depends on resolution |
| `0.0.0.0` | Wildcard — "all interfaces" when listening; "no address" otherwise | `::` |

<details>
<summary>127.0.0.1: the loopback address</summary>

Loopback is a virtual network interface. No physical cable. No network card. Packets sent to `127.0.0.1` never leave the machine — the kernel routes them back to the same host.

IPv4 reserves the entire `127.0.0.0/8` range (127.0.0.0 to 127.255.255.255) for loopback. That's 16 million addresses, all pointing to the same machine. You can run Server A on `127.0.0.4` and Server B on `127.0.5.4` — both local, both loopback.

IPv6 has exactly one loopback address: `::1`. No range. The designers learned from IPv4's waste — 16 million loopback addresses was overkill.

</details>

<details>
<summary>localhost: a hostname, not an address</summary>

`localhost` is just a name. The browser doesn't shortcut it to `127.0.0.1`. It goes through DNS resolution like any other hostname. First it checks `/etc/hosts`, then the system resolver.

```
# /etc/hosts
127.0.0.1    localhost
::1          localhost
```

This means `localhost` can resolve to either `127.0.0.1` or `::1` depending on the system, the resolver, and the application's preference for IPv4 vs IPv6. You can even override it:

```
# point localhost to a different loopback address
127.0.1.4    localhost
```

Now `localhost` goes to `127.0.1.4`. DNS resolution stays consistent — the system doesn't care that the name is "localhost."

Browsers treat `localhost` as a trusted origin. Firefox shows "not secure" for `http://0.0.0.0:3000` but not for `http://localhost:3000`, even though both are HTTP without TLS. `localhost` is on the browser's allow-list. IP addresses are not.

</details>

<details>
<summary>0.0.0.0: it depends on who's asking</summary>

`0.0.0.0` changes meaning based on context.

**As a listen address (server):** "Accept connections on every network interface." This includes loopback (`127.0.0.1`), your LAN IP (`192.168.1.x`), and any other interface. Most dev servers default to this. IPv4 only — does not accept IPv6 connections.

**As a destination (client):** Depends on the protocol and the application.

| Tool | `0.0.0.0` as destination | Why |
|---|---|---|
| `ping 0.0.0.0` | Fails | ICMP has no fallback logic |
| `curl http://0.0.0.0:3000` | OK | macOS/Linux kernel treats TCP to `0.0.0.0` as loopback |
| Node.js `http.get("http://0.0.0.0:3000")` | OK | Same kernel behavior |
| Chrome `fetch("http://0.0.0.0:3000")` | OK | Silently treats it as loopback |
| Firefox `fetch("http://0.0.0.0:3000")` | OK | Shows "not secure" warning |
| Safari `fetch("http://0.0.0.0:3000")` | Fails | Rejects the URL at application layer |

`0.0.0.0` as a destination has no spec-defined behavior. The OS kernel routes TCP connections to loopback, but `ping` (ICMP) doesn't. Browsers add another layer of inconsistency on top.

</details>

---

## The IPv4/IPv6 mismatch matrix

I tested every combination of backend listen address vs frontend connect address in Node.js 17:

**Node.js 17 frontend → normal backend:**

| Backend listens on | Frontend connects to | Result |
|---|---|---|
| `localhost` | `127.0.0.1` | OK |
| `localhost` | `localhost` | OK |
| `0.0.0.0` | `127.0.0.1` | OK |
| `0.0.0.0` | `localhost` | OK |
| `0.0.0.0` | `0.0.0.0` | OK |
| `127.0.0.1` | `127.0.0.1` | OK |
| **`127.0.0.1`** | **`localhost`** | **Fails** |
| `127.0.0.1` | `0.0.0.0` | OK |

**Node.js 17 backend → normal client (browser and Node.js 22):**

| Backend listens on | Client connects to | Browser (Chrome/FF) | Node.js 22 |
|---|---|---|---|
| `localhost` (→ `::1`) | `localhost` | OK | OK |
| `localhost` (→ `::1`) | `127.0.0.1` | **Fails** | **Fails** |
| `localhost` (→ `::1`) | `0.0.0.0` | **Fails** | **Fails** |
| `127.0.0.1` | any | OK | OK |
| `0.0.0.0` | any | OK | OK |

Browser and Node.js 22 produce identical results. The problem is entirely on the server side: Node.js 17 binds `localhost` to `::1`, so only IPv6 clients can reach it. The client version doesn't matter.

The safest combination: backend listens on `0.0.0.0`, frontend connects to `127.0.0.1`. No DNS resolution ambiguity. No IPv4/IPv6 mismatch.

---

## What I'd tell someone starting a local dev server

1. **Listen on `0.0.0.0`** unless you have a reason not to. It accepts connections on all IPv4 interfaces. Not IPv6 — but since Node 20+ clients have happy eyeballs, they will fall back to IPv4 automatically.
2. **Connect to `127.0.0.1`**, not `localhost`. `127.0.0.1` is an IP address — no DNS resolution, always IPv4. `localhost` is a hostname that goes through DNS. The result depends on Node version and OS configuration: could be `127.0.0.1`, could be `::1`. This is the root cause of every FAIL in the tables below.
3. **Silent failure = IPv4/IPv6 mismatch.** No error, no log, nothing. The request went to an address nobody is listening on.

---

## Full test results (Node 17 vs 22, macOS)

Tested on macOS with `/etc/hosts` listing `::1 localhost` before `127.0.0.1 localhost`.

<details>
<summary>1. Browser → Node 17 backend (direct) — 2 FAILs</summary>

| Server listen | Browser URL | Result |
|---|---|---|
| `localhost` (→ `::1`) | `localhost` | OK |
| `localhost` (→ `::1`) | `127.0.0.1` | **FAIL** |
| `localhost` (→ `::1`) | `0.0.0.0` | **FAIL** |
| `127.0.0.1` | `localhost` | OK |
| `127.0.0.1` | `127.0.0.1` | OK |
| `127.0.0.1` | `0.0.0.0` | OK |
| `0.0.0.0` | `localhost` | OK |
| `0.0.0.0` | `127.0.0.1` | OK |
| `0.0.0.0` | `0.0.0.0` | OK |

</details>

<details>
<summary>2. Browser → Node 22 backend (direct) — 2 FAILs</summary>

Same results as Node 17. The `localhost` → `::1` bind behavior is permanent since Node 17.

</details>

<details>
<summary>3. Browser → Node 17 proxy → Node 22 backend — 4 FAILs</summary>

| Backend listen (Node 22) | Proxy connects via (Node 17) | Result |
|---|---|---|
| `localhost` (→ `::1`) | `localhost` | OK |
| `localhost` (→ `::1`) | `127.0.0.1` | **FAIL** |
| `localhost` (→ `::1`) | `0.0.0.0` | **FAIL** |
| `127.0.0.1` | `localhost` | **FAIL** |
| `127.0.0.1` | `127.0.0.1` | OK |
| `127.0.0.1` | `0.0.0.0` | OK |
| `0.0.0.0` | `localhost` | **FAIL** |
| `0.0.0.0` | `127.0.0.1` | OK |
| `0.0.0.0` | `0.0.0.0` | OK |

Two extra FAILs compared to browser direct: `127.0.0.1`/`0.0.0.0` backend + proxy via `localhost`. Node 17 resolves `localhost` to `::1` and gives up. No fallback.

</details>

<details>
<summary>4. Browser → Node 22 proxy → Node 22 backend — 2 FAILs</summary>

| Backend listen (Node 22) | Proxy connects via (Node 22) | Result |
|---|---|---|
| `localhost` (→ `::1`) | `localhost` | OK |
| `localhost` (→ `::1`) | `127.0.0.1` | **FAIL** |
| `localhost` (→ `::1`) | `0.0.0.0` | **FAIL** |
| `127.0.0.1` | `localhost` | OK |
| `127.0.0.1` | `127.0.0.1` | OK |
| `127.0.0.1` | `0.0.0.0` | OK |
| `0.0.0.0` | `localhost` | OK |
| `0.0.0.0` | `127.0.0.1` | OK |
| `0.0.0.0` | `0.0.0.0` | OK |

Same as browser direct. Node 22 has happy eyeballs (RFC 8305): when `localhost` resolves to `::1` and the connection fails, it falls back to `127.0.0.1`. Node 17 does not have this fallback.

</details>

<details>
<summary>5. Browser → Node 17 proxy → Node 17 backend — 4 FAILs</summary>

| Backend listen (Node 17) | Proxy connects via (Node 17) | Result |
|---|---|---|
| `localhost` (→ `::1`) | `localhost` | OK |
| `localhost` (→ `::1`) | `127.0.0.1` | **FAIL** |
| `localhost` (→ `::1`) | `0.0.0.0` | **FAIL** |
| `127.0.0.1` | `localhost` | **FAIL** |
| `127.0.0.1` | `127.0.0.1` | OK |
| `127.0.0.1` | `0.0.0.0` | OK |
| `0.0.0.0` | `localhost` | **FAIL** |
| `0.0.0.0` | `127.0.0.1` | OK |
| `0.0.0.0` | `0.0.0.0` | OK |

Same as table 3. Backend version doesn't matter — the extra FAILs come from Node 17 proxy resolving `localhost` to `::1` without fallback.

</details>

<details>
<summary>6. Browser → Node 22 proxy → Node 17 backend — 2 FAILs</summary>

| Backend listen (Node 17) | Proxy connects via (Node 22) | Result |
|---|---|---|
| `localhost` (→ `::1`) | `localhost` | OK |
| `localhost` (→ `::1`) | `127.0.0.1` | **FAIL** |
| `localhost` (→ `::1`) | `0.0.0.0` | **FAIL** |
| `127.0.0.1` | `localhost` | OK |
| `127.0.0.1` | `127.0.0.1` | OK |
| `127.0.0.1` | `0.0.0.0` | OK |
| `0.0.0.0` | `localhost` | OK |
| `0.0.0.0` | `127.0.0.1` | OK |
| `0.0.0.0` | `0.0.0.0` | OK |

Same as table 4. Node 22 proxy has happy eyeballs, so proxy via `localhost` to IPv4 backends works.

</details>

### How `dns.lookup('localhost')` changed across Node versions

| Node version | `dns.lookup('localhost')` | `http.get` fallback |
|---|---|---|
| v14 (pre-17) | `127.0.0.1` (IPv4) | N/A — already IPv4 |
| v17 | `::1` (IPv6) | No |
| v18 | `::1` (IPv6) | No |
| v20 | `::1` (IPv6) | Yes (happy eyeballs) |
| v22 | `::1` (IPv6) | Yes (happy eyeballs) |

Before Node 17, `dns.lookup` always returned `127.0.0.1` for `localhost`, regardless of `/etc/hosts` order. Node 17 changed this to respect the system's DNS resolution order. On macOS, `/etc/hosts` lists `::1 localhost` before `127.0.0.1 localhost`, so `localhost` resolves to IPv6.

Starting from Node 20, `http.get` added happy eyeballs (RFC 8305): if `::1` fails, it automatically retries with `127.0.0.1`. The DNS resolution itself still returns `::1`, but the HTTP client handles the fallback.

### Try it yourself

Save this as `test.js` and run with different Node versions:

```js
const http = require('http');
const dns = require('dns');

dns.lookup('localhost', (err, address, family) => {
  console.log(`dns.lookup('localhost') → ${address} (IPv${family})`);
});

const server = http.createServer((req, res) => {
  res.writeHead(200);
  res.end('ok');
});

server.listen(9999, '127.0.0.1', () => {
  http.get('http://localhost:9999', () => {
    console.log('http.get localhost → 127.0.0.1 backend → OK');
    server.close();
  }).on('error', (err) => {
    console.log('http.get localhost → 127.0.0.1 backend → FAIL: ' + err.code);
    server.close();
  });
});
```

```bash
nvm use 18 && node test.js
# dns.lookup('localhost') → ::1 (IPv6)
# http.get localhost → 127.0.0.1 backend → FAIL: ECONNREFUSED

nvm use 20 && node test.js
# dns.lookup('localhost') → ::1 (IPv6)
# http.get localhost → 127.0.0.1 backend → OK
```

Both versions resolve `localhost` to `::1`. The difference: Node 20 falls back to IPv4 when IPv6 fails. Node 18 does not.

### Why do tables 1 and 2 have the same results?

Node 17 and Node 22 both bind `localhost` to `::1`. This behavior was introduced in Node 17 and never reverted. The backend version does not matter.

### Why do tables 3 and 5 have 4 FAILs, but tables 4 and 6 only have 2?

Tables 3 and 5 use a Node 17/18 proxy (no happy eyeballs). Tables 4 and 6 use a Node 20+ proxy (has happy eyeballs). The 2 extra FAILs:

| Backend listen | Proxy via | Node 17/18 proxy | Node 20+ proxy |
|---|---|---|---|
| `127.0.0.1` | `localhost` | **FAIL** | OK |
| `0.0.0.0` | `localhost` | **FAIL** | OK |

Node 17/18 resolves `localhost` to `::1` and gives up. Node 20+ does the same, but falls back to `127.0.0.1` when `::1` fails.

### Why do all six tables share the same 2 FAILs?

Every table has these 2 FAILs: backend listens on `localhost` (binds `::1`), client connects via `127.0.0.1` or `0.0.0.0` (IPv4). The server is not on IPv4. No amount of happy eyeballs fixes this. The server is simply not there.

---

## Appendix: IPv6 link-local (fe80)

Not directly related to the localhost bug, but relevant to understanding "local" addresses.

IPv6 introduced link-local addresses (`fe80::/10`) — addresses that work on a single network link without any router or DHCP. When a device joins a network, it assigns itself a `fe80::` address automatically (SLAAC), uses it to discover the router via NDP, then gets a global IPv6 address.

Three rules for `fe80` communication:

1. Same physical link (same Wi-Fi access point, same switch)
2. Same subnet
3. Same protocol (Wi-Fi and Ethernet can't cross-talk via `fe80`)

### fe80 vs 192.168.x.x

Both are "local" addresses. `192.168.x.x` is routed — packets go through the router. `fe80::` is link-local — packets travel directly between devices on the same link, no router involved.

```bash
# Access a server on the same Wi-Fi via link-local (no router)
curl http://[fe80::xxxx:xxxx:xxxx:4c27%en0]:3000

# Access the same server via private IPv4 (through router)
curl http://192.168.1.42:3000
```

Same destination, different path. The `fe80` route is direct.

---

## References

- [Node.js DNS resolution change (issue #40537)](https://github.com/nodejs/node/issues/40537)
- [http-proxy-middleware localhost resolution issue (#705)](https://github.com/chimurai/http-proxy-middleware/issues/705)
- [Accessing IPv6 link-local from browser (StackOverflow)](https://stackoverflow.com/questions/45299648/how-to-access-devices-with-ipv6-link-local-address-from-browserlike-ie-firefox)
- [Linux virtual network interfaces (thiscute.world)](https://thiscute.world/posts/linux-virtual-network-interfaces/)
