# NAT Traversal

Source: https://emule-qt.org/features/nat-traversal/

## Low ID to Low ID, at last

Behind a router you cannot forward, eMule gives you a **Low ID**. Other clients can still reach you through the server, but two Low ID clients could never talk to each other: classic eMule shows the source as “Cannot connect LowID to LowID” and moves on. On a busy network that is a large share of every file’s sources.

eMule Qt connects them. Two Low ID clients are introduced, open their routers for each other, and then transfer directly, over **IPv6** when both have it and over **QUIC** when they do not.

### Step one: an introduction

Neither side knows how to reach the other, so someone in the middle tells them. eMule Qt asks whichever introducer can serve the source, and moves on to the next one if an attempt goes nowhere:

- **The server you are logged in to**, when it supports NAT traversal (ed2k-server, eNode-go and Lugdunum eserver).
- **The source’s own server**, when the source is a Low ID on a different server that offers callbacks.
- **A Kad buddy**, when the source keeps one in the Kademlia network.

Each introducer hands both clients the public address the other one is seen at.

### Step two: the hole punch

Both clients now send a few small UDP packets to each other at the same time. To each router this looks like an answer to traffic going out, so it lets the other side’s packets in. The way through stays open as long as packets keep flowing.

### Step three: the link

Over that opened path the two clients swap their IPv6 addresses.

- **IPv6 fallback.** When both have a public IPv6 address, one side simply dials the other over ordinary TCP/IPv6. Many home routers apply NAT to IPv4 only, so this is often the quickest route.
- **QUIC.** Otherwise the downloader opens a QUIC connection over the punched UDP path. The whole eD2K session, including the usual stream obfuscation, runs inside it exactly as it would over TCP.

From here on the peer is a normal source. It gets queue positions and credits and sends file blocks like any other.

### Hard to spot on the wire

Every QUIC packet eMule Qt sends is obfuscated, starting with the very first one, so the handshake that would identify the protocol is not visible to a filter. If a peer does not understand the obfuscated start, eMule Qt falls back to a plain start after two seconds. You can forbid that fallback.

### Works with other clients

The QUIC link speaks the same dialect as **eMuleAI**, and **aMule** answers it too. The IPv6 route is eMule Qt’s own, so it is used between two eMule Qt clients; with any other client the link goes straight to QUIC. A client that has neither simply stays on the old behaviour.

### See it in the client

**Client Details** has a **NAT-T** row. While a connection runs through NAT traversal it shows the route in use, *Connected (QUIC)* or *Connected (IPv6 fallback)*. Otherwise it lists what the peer supports, for example *Supported (IPv6 fallback, QUIC)*.

![Client Details of a Low ID peer, with the NAT-T row reading Connected (QUIC) during a transfer](https://emule-qt.org/wp-content/uploads/2026/10/emuleqt-client-details-quic-2col-1024x924.png)

The client lists show the route too, next to the Low ID mark. The Waited column of the upload list and the Score column of the queue read *(Low ID, QUIC)* or *(Low ID, IPv6)* while the live connection uses that route.

![The upload list, with the Waited column reading 0 secs (Low ID, QUIC)](https://emule-qt.org/wp-content/uploads/2026/10/emuleqt-client-list-quic-2col-1024x428.png)

### Why not QUIC for everyone?

A High ID client can be dialled directly, and plain TCP does that job well: the operating system handles it, it passes every firewall that allows eD2K, and every eMule speaks it. eMule Qt keeps QUIC for the one case where TCP cannot work, two clients that are both behind NAT.

> **Turn it on**
> 
> NAT traversal is on by default. **Options → Server →** “Connect Low ID to Low ID through server or Kad buddy (NAT traversal)” switches it off. **Options → Security →** “Never send unobfuscated NAT traversal (QUIC) packets” turns off the plain fallback.

[Back to all features](https://emule-qt.org/features/)

---

Part of eMule Qt. Site index for agents: https://emule-qt.org/llms.txt
