Your server starts, you can join it by IP, but it is not in the list.
First: separate the two problems
They are different failures with different fixes.
printf '\xff\xff\xff\xffgetstatus' | nc -u -w2 YOUR.IP 28960 | head -c 400
- No reply — this is a reachability problem, not a listing problem. See Awaiting Challenge.
- Reply arrives — the server is fine and the master registration is what is failing. Continue here.
Cause and fix
1. dedicated 2
+set dedicated 2
dedicated 1 is LAN. It never sends a heartbeat. This is the most common single cause.
2. The master server may simply be gone
State of the classic masters:
| Game | Master | Authorize |
|---|---|---|
| Call of Duty 1 | codmaster.activision.com:20510 |
codauthorize.activision.com:20500 |
| Call of Duty: UO | coduomaster.activision.com:20610 |
port 20600 |
| Call of Duty 2 | cod2master.activision.com:20710 |
cod2authorize.activision.com:20700 |
| Call of Duty 4 | cod4master.activision.com:20810 |
cod4authorize.activision.com:20800 |
CoD1's master is still answering in 2026. The later ones are unreliable and have been for years, so treat the in-game browser as a partial view of reality and publish your address directly.
For Call of Duty 4 the practical answer is CoD4X, which has its own working master and is where the remaining players are.
cod.pm runs a community master and web server list, which is a useful cross-check: if your server shows there but not in-game, the Activision master is the problem, not you.
3. Check you have not disabled the masters
Many configs copied from private servers contain:
set sv_master1 ""
set sv_master2 ""
which is exactly how you suppress registration. Remove those lines for a public server.
4. NAT that rewrites the source port
The heartbeat's source address is what the master records. Port-preserving NAT works. A NAT that rewrites the source port, or Docker's default bridge, will register an address that nobody can connect to — so the entry either fails to appear or appears and times out for everyone.
Use host networking in Docker. On a home router, forward the UDP port one-to-one rather than to a different internal port.
5. Give it time and check outbound
Heartbeats are periodic, not instant. Wait a few minutes. And confirm outbound UDP to the master is not blocked:
sudo tcpdump -ni any udp port 20510 or udp port 20610 or udp port 20710 or udp port 20810
You should see packets leaving.
