The server runs, LAN players can join, but it never appears in the internet server browser. There are only a few real causes: sv_lan is set to 1, the server never reaches the Steam master server, or UDP 27015 is not open to the internet. Work the checklist top to bottom.
1. sv_lan must be 0
With sv_lan 1 the engine never heartbeats the master list and rejects internet clients with a LAN error. Set it in server.cfg:
sv_lan 0
Then verify it actually took — read it back in the console:
sv_lan
It must print "sv_lan" is "0". If it prints 1, something is overriding it; you may be passing +sv_lan 1 on the command line, or a later config resets it. See why server.cfg settings do not apply.
2. Force a heartbeat and watch
The server announces itself to the master by heartbeating. Trigger one manually:
heartbeat
If nothing leaves the box, the server is not talking to the master at all — check the firewall (step 3) and that outbound UDP is not blocked. A server that heartbeats but still never lists is usually a NAT/port-reachability problem (step 4).
3. Open UDP 27015 inbound
The internet list only shows servers the master can reach back on their game port. UDP 27015 must be open inbound:
sudo ufw allow 27015/udp sudo ufw allow 27015/tcp
On Windows:
New-NetFirewallRule -DisplayName "HLDS UDP 27015" -Direction Inbound -Protocol UDP -LocalPort 27015 -Action Allow
Many cloud providers also have a separate security-group/firewall in their control panel — the OS firewall being open does not help if the provider blocks the port upstream. Open UDP 27015 there too.
4. NAT / port forwarding
If the server is at home behind a router, forward UDP 27015 (and TCP 27015 for RCON) to the machine's LAN IP. Without a forward, the master server's reachability probe never arrives and the server is dropped from the list even though it heartbeats. Bind explicitly so there is no ambiguity:
./hlds_run -game cstrike -ip 0.0.0.0 -port 27015 +sv_lan 0 +map de_dust2 +maxplayers 20
5. Confirm the port is really listening
ss -lunp | grep 27015 # Linux netstat -ano | findstr 27015 # Windows
You must see hlds_linux / hlds.exe bound to *:27015 UDP. If it is bound to 127.0.0.1:27015 instead of 0.0.0.0, it is only reachable locally — add -ip 0.0.0.0.
6. The 2023 anniversary update and master servers
The 2023 25th-Anniversary update changed the Steam client and broke a lot of older server setups' visibility. If you run a very old HLDS build, update it, or move to ReHLDS, which tracks the current master-server behaviour. Players stuck on old clients can roll back to the steam_legacy beta branch. For non-Steam players to see and join, you additionally need Metamod-r plus Reunion (ReHLDS) or dproto (HLDS) — without one of those, non-Steam clients cannot authenticate and will not list the server for their community.
7. sv_region and community lists
Set sv_region so the server appears under the correct geographic filter in the browser; a wrong region hides you from players who filter by their own:
// 0 US East, 1 US West, 2 South America, 3 Europe, // 4 Asia, 5 Australia, 6 Middle East, 7 Africa, 255 world sv_region 3
Non-Steam communities often rely on their own game trackers rather than the Steam master. If your audience is non-Steam and you have Reunion/dproto working, make sure the server also heartbeats whatever community master your player base uses; those lists are populated independently of Steam and a server can be present on one and absent from the other.
Common errors
- Visible on LAN, never on internet —
sv_lan 1, or UDP 27015 blocked upstream by the provider. - Heartbeat sends but no listing — NAT with no port forward, or the provider firewall blocks the return probe.
- Server bound to 127.0.0.1 — add
-ip 0.0.0.0. - Lists briefly then vanishes — intermittent packet loss or the server crashing/restarting; check the log.
Verification
From a machine outside your LAN (mobile hotspot works), open the console and:
connect YOUR_PUBLIC_IP:27015
If you connect and spawn, the port is reachable from the internet and the only remaining question is the master listing — which, with sv_lan 0 and a reachable port, follows within a minute. Add the server to the internet favorites by IP as a fallback while the master catches up.









