Everything needed to host a dedicated game server on Windows 11, Windows 10, or Windows Server — SteamCMD, firewall rules, per-game launch commands, making it auto-start as a service, and opening your ports correctly. Written for first-timers but thorough enough for anyone moving a server off Linux. No other guide needed.

Before you start — is Windows actually the right choice?

Most dedicated game servers perform 10-20% worse on Windows than on Linux and Windows chews through RAM on idle. Windows is the right choice if (a) you already know Windows and refuse to learn Linux, (b) the game only ships a Windows binary, or (c) you are hosting on your own home PC. If you are renting a VPS and want max performance per euro, use Linux instead.

01 // What you will need

  • Windows version — Windows 10/11 (Home or Pro both work) or Windows Server 2019/2022/2026.
  • Administrator rights — required to open firewall ports and install services.
  • RAM — Windows idles around 2-3 GB. Add your game server requirement on top. For Rust that means 16 GB total minimum.
  • Disk space — 20 GB free (SteamCMD + one modern game server). An SSD is strongly recommended; HDD causes noticeable tick-rate drops on Rust/ARK.
  • Network — wired Ethernet preferred. Wi-Fi works but adds jitter and is the #1 cause of “my server feels laggy” complaints.
  • A public IP or port-forwarding access — covered in section 08.
  • A Steam account — only required for paid servers like ARK. Anonymous login works for Rust, CS2, TF2, Valheim.
Option 1 — Rent a Windows VPS (full control)

Hostinger KVM 4 — 4 vCPU, 16 GB RAM, 200 GB NVMe

Hostinger offers a Windows Server template so you can install straight from the control panel. KVM 4 handles any single Windows game server comfortably and leaves headroom for the OS itself. €12.99/mo.

Get Hostinger KVM 4 →
Option 2 — Managed hosting (zero setup)

Nitrado — One-Click Game Servers

If you want to skip SteamCMD, firewall rules, and port forwarding entirely, Nitrado provisions a server in about 2 minutes with a web panel. No Windows or Linux knowledge required.

Get Nitrado →

02 // Prepare your Windows machine

A few one-time tweaks that prevent 90% of the headaches people run into later.

Disable sleep and hibernation

A sleeping PC is not a server. Open an elevated PowerShell (right-click Start → Terminal (Admin)) and run:

powercfg /change standby-timeout-ac 0
powercfg /change hibernate-timeout-ac 0
powercfg /change monitor-timeout-ac 0
powercfg /hibernate off

This sets standby, hibernation, and monitor-off to “never” while on AC power.

Enable automatic login (home hosting only)

If the PC restarts after a power cut, you want it to boot back into Windows and your server without manual login. Run netplwiz, uncheck Users must enter a username and password, and confirm with your password. For Windows 11 you may need to enable the legacy setting first:

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v DevicePasswordLessBuildVersion /t REG_DWORD /d 0 /f

Skip this step on a rented VPS — RDP needs manual login anyway.

Create a folder structure

Keep everything in one place so backups are simple. Open PowerShell (admin not required) and run:

mkdir C:\gameservers
mkdir C:\gameservers\steamcmd
mkdir C:\gameservers\servers

Disable Windows Defender real-time scanning on the server folder (optional)

Defender scanning every read/write to the save folder can drop Rust/ARK tick rate. Add an exclusion:

Add-MpPreference -ExclusionPath "C:\gameservers"

Only do this on a dedicated server machine, not your daily-driver PC.

03 // Install SteamCMD

SteamCMD is Valve's command-line version of Steam. It downloads dedicated server files for most games. Only one SteamCMD install is needed — it can manage every game server on the machine.

  1. Download the official Windows build: steamcmd.zip (direct link from Valve's CDN).
  2. Extract the ZIP into C:\gameservers\steamcmd. You should see steamcmd.exe inside.
  3. Open PowerShell, cd into the folder, and run SteamCMD once to let it self-update:
cd C:\gameservers\steamcmd
.\steamcmd.exe

First run downloads several small updates and drops you at a Steam> prompt. Type quit to exit. SteamCMD is now installed.

Tip

Never extract SteamCMD into C:\Program Files — the UAC virtual-store redirection breaks auto-updates. Stick with C:\gameservers\steamcmd or another path outside Program Files.

04 // Install a game server

Pattern is the same for every Steam game: SteamCMD logs in (usually anonymously), sets an install directory, and runs app_update AppID validate. Only the AppID and launch command change per game.

Universal install command

From inside C:\gameservers\steamcmd, replace APPID and the install folder:

.\steamcmd.exe +force_install_dir C:\gameservers\servers\GAMENAME +login anonymous +app_update APPID validate +quit

Per-game AppIDs and launch commands

Rust — AppID 258550

Install:

.\steamcmd.exe +force_install_dir C:\gameservers\servers\rust +login anonymous +app_update 258550 validate +quit

Create a launch file C:\gameservers\servers\rust\start.bat:

@echo off
cd /d C:\gameservers\servers\rust
RustDedicated.exe -batchmode ^
  +server.ip 0.0.0.0 +server.port 28015 ^
  +server.queryport 28017 ^
  +rcon.ip 0.0.0.0 +rcon.port 28016 ^
  +rcon.password CHANGE_ME_LONG_PASSWORD ^
  +server.maxplayers 50 ^
  +server.hostname "My Rust Server" ^
  +server.description "Hosted with HostingBuff guide" ^
  +server.identity "server1" ^
  +server.worldsize 3500 ^
  +server.seed 12345 ^
  +server.saveinterval 300
pause

The ^ is Windows batch line-continuation. Save and double-click to run.

Minecraft Java (no SteamCMD needed)

Download the server JAR directly from minecraft.net or use PaperMC (recommended — 5x better performance). You also need a Java 21 runtime: Adoptium Temurin 21. Place paper.jar into C:\gameservers\servers\minecraft and create start.bat:

@echo off
cd /d C:\gameservers\servers\minecraft
java -Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled ^
  -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions ^
  -XX:+DisableExplicitGC -XX:+AlwaysPreTouch ^
  -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 ^
  -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 ^
  -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 ^
  -XX:InitiatingHeapOccupancyPercent=15 ^
  -XX:G1MixedGCLiveThresholdPercent=90 ^
  -jar paper.jar nogui
pause

First run creates eula.txt — open it, change eula=false to eula=true, then run again.

ARK Survival Evolved — AppID 376030

.\steamcmd.exe +force_install_dir C:\gameservers\servers\ark +login anonymous +app_update 376030 validate +quit

Launch:

@echo off
cd /d C:\gameservers\servers\ark\ShooterGame\Binaries\Win64
ShooterGameServer.exe TheIsland?listen?SessionName="MyARK"?MaxPlayers=30?ServerPassword=?ServerAdminPassword=CHANGE_ME?Port=7777?QueryPort=27015?RCONEnabled=True?RCONPort=32330 -server -log
pause

Counter-Strike 2 — AppID 730

.\steamcmd.exe +force_install_dir C:\gameservers\servers\cs2 +login anonymous +app_update 730 validate +quit

Launch:

@echo off
cd /d C:\gameservers\servers\cs2\game\bin\win64
cs2.exe -dedicated +map de_dust2 -maxplayers_override 16 +sv_lan 0 +game_type 0 +game_mode 1 -port 27015
pause

CS2 also needs a Game Server Login Token (GSLT) from steamcommunity.com/dev/managegameservers to be visible on the public server browser. Add +sv_setsteamaccount YOUR_GSLT to the launch line.

Team Fortress 2 — AppID 232250

.\steamcmd.exe +force_install_dir C:\gameservers\servers\tf2 +login anonymous +app_update 232250 validate +quit

Launch:

@echo off
cd /d C:\gameservers\servers\tf2
srcds.exe -console -game tf +map ctf_2fort +maxplayers 24 -port 27015
pause

Valheim — AppID 896660

.\steamcmd.exe +force_install_dir C:\gameservers\servers\valheim +login anonymous +app_update 896660 validate +quit

Launch:

@echo off
cd /d C:\gameservers\servers\valheim
valheim_server.exe -nographics -batchmode -name "MyValheim" -port 2456 -world "Dedicated" -password "secret12" -public 1
pause
Finding AppIDs for other games

Every dedicated server on Steam has an AppID listed at steamdb.info/tag/1677 (the “Dedicated Server” tag). Copy the number and drop it into the SteamCMD command above — that's the whole pattern.

05 // Open Windows Firewall ports

Windows blocks incoming connections by default. Every game needs its ports explicitly allowed. Run these from an elevated PowerShell — replace the port numbers with your game's values (see the port reference on the Tools page for all games).

Rust example (TCP + UDP)

New-NetFirewallRule -DisplayName "Rust Game UDP" -Direction Inbound -LocalPort 28015 -Protocol UDP -Action Allow
New-NetFirewallRule -DisplayName "Rust Query UDP" -Direction Inbound -LocalPort 28017 -Protocol UDP -Action Allow
New-NetFirewallRule -DisplayName "Rust RCON TCP" -Direction Inbound -LocalPort 28016 -Protocol TCP -Action Allow

Minecraft Java

New-NetFirewallRule -DisplayName "Minecraft Java TCP" -Direction Inbound -LocalPort 25565 -Protocol TCP -Action Allow

ARK Survival Evolved

New-NetFirewallRule -DisplayName "ARK Game UDP" -Direction Inbound -LocalPort 7777 -Protocol UDP -Action Allow
New-NetFirewallRule -DisplayName "ARK Query UDP" -Direction Inbound -LocalPort 27015 -Protocol UDP -Action Allow
New-NetFirewallRule -DisplayName "ARK RCON TCP" -Direction Inbound -LocalPort 32330 -Protocol TCP -Action Allow

CS2 / TF2 (Source engine)

New-NetFirewallRule -DisplayName "Source Server UDP" -Direction Inbound -LocalPort 27015 -Protocol UDP -Action Allow
New-NetFirewallRule -DisplayName "Source Server TCP" -Direction Inbound -LocalPort 27015 -Protocol TCP -Action Allow

Valheim

New-NetFirewallRule -DisplayName "Valheim UDP" -Direction Inbound -LocalPort 2456-2458 -Protocol UDP -Action Allow

Verify a rule was created:

Get-NetFirewallRule -DisplayName "Rust*" | Format-Table DisplayName, Enabled, Direction, Action
Still can't connect after opening the firewall?

Windows applies rules per network profile (Public / Private / Domain). If your Ethernet is classed as Public, only Public rules apply. Check with Get-NetConnectionProfile and either switch the profile to Private or re-create rules with -Profile Any.

06 // Run the server as a Windows service (auto-start + auto-restart)

A batch file works but closes if you log out, and does not restart after a crash. The cleanest solution is NSSM — the Non-Sucking Service Manager. It wraps any .exe or .bat into a proper Windows service.

  1. Download NSSM from nssm.cc/download. Extract and copy nssm.exe (from the win64 folder) into C:\Windows\System32 so it is always on PATH.
  2. Install your server as a service. From an elevated PowerShell:
nssm install RustServer

A GUI opens. Fill in:

  • Path: C:\gameservers\servers\rust\RustDedicated.exe
  • Startup directory: C:\gameservers\servers\rust
  • Arguments: paste the full arg list from your start.bat (everything after the exe name)
  • Details tab: display name “Rust Dedicated Server”, startup type “Automatic”
  • I/O tab: set Output (stdout) and Error (stderr) to e.g. C:\gameservers\servers\rust\console.log so you can read crash reasons later
  • Exit actions tab: leave “Restart application” — this is why NSSM exists. Crash? It restarts.

Click Install service. Then start it:

nssm start RustServer

The service now survives logouts, reboots, and crashes. Manage it with:

nssm stop RustServer
nssm restart RustServer
nssm remove RustServer confirm

07 // Find your server IP

Two IPs matter:

  • LAN IP — for friends on the same network. Find with ipconfig (IPv4 Address under your active adapter). Usually starts with 192.168. or 10..
  • Public IP — what people on the internet connect to. Get it from icanhazip.com or run curl icanhazip.com in PowerShell.
Home hoster? Your public IP probably changes

Most residential ISPs rotate your public IP every few days. Friends will need a new address each time. Fix this with free Dynamic DNS — sign up at DuckDNS or No-IP, install their updater client on the Windows host, and share yourname.duckdns.org instead of the raw IP.

08 // Port forwarding (home hosting only)

Skip this section if you are hosting on a rented VPS — VPS providers give you a public IP directly and the VPS firewall is the only barrier.

If hosting from home, your router blocks all incoming connections by default. You need to tell the router “any packet arriving on port 28015 should be forwarded to the Windows PC at 192.168.x.x”. General process for any router:

  1. Log into your router admin page (usually http://192.168.0.1 or http://192.168.1.1).
  2. Find a section called Port Forwarding, Virtual Server, or NAT.
  3. Create a new rule for each port:
    • External port: e.g. 28015
    • Internal port: 28015 (same)
    • Protocol: UDP (or TCP, check the port table)
    • Internal IP: your Windows PC's LAN IP from section 07
  4. Save. Some routers reboot. Some do not.

Verify from outside your network (a phone on mobile data works great): https://portchecker.co/ and try the port + public IP.

CGNAT — the silent killer

Many ISPs (especially mobile providers and budget fiber) put customers behind Carrier-Grade NAT. Your router has a private IP like 100.64.x.x on its WAN side and no amount of port forwarding will ever work. Quick test: the IP shown in your router's WAN page should match icanhazip.com. If they differ, you are on CGNAT. Solutions: call your ISP and ask for a public IPv4 (sometimes free, sometimes €3-5/mo), use an outbound tunnel like playit.gg or Cloudflare Tunnel, or rent a VPS and stop fighting your ISP.

09 // Connect and verify

Three ways to test your server is reachable:

  1. From the same PC: connect to 127.0.0.1:PORT in the game client. This only confirms the server is running, not that it is reachable from outside.
  2. From another device on your LAN: connect to the Windows host's LAN IP. Proves the Windows firewall is open.
  3. From outside your network: use your phone on mobile data, or ask a friend to try PUBLIC_IP:PORT. Proves port forwarding works.

10 // Common problems and fixes

SymptomCauseFix
Server starts, nobody can join from outsideRouter port forwarding missing or CGNATRecheck router rule, test with portchecker.co, verify not behind CGNAT
“Unable to connect” from LAN tooWindows Firewall rule not applied to current profileGet-NetConnectionProfile then recreate rule with -Profile Any
SteamCMD fails with “No subscription”Game requires login, not anonymousUse +login YOUR_STEAM_USER and respond to Steam Guard email
Server crashes after ~30 minutesWindows Defender scanning save filesAdd-MpPreference -ExclusionPath "C:\gameservers"
Rust/ARK tick rate drops at ~20 playersRunning on HDD or Wi-FiMove server folder to SSD, switch to wired Ethernet
Service stops immediatelyBad arguments or missing dependencyRead console.log you configured in NSSM I/O tab
“VCRUNTIME140.dll not found”Missing Visual C++ RedistributableInstall latest VC++ redistributables from Microsoft
Server uses 100% CPU on one coreSingle-threaded game engine (normal for Rust/ARK)Expected — increase clock speed, not core count

11 // Next steps