Killing Floor 2 Server Admin Guide: WebAdmin, Config Files & What Changed in 2020
How to run and administer a Killing Floor 2 dedicated server: SteamCMD install on Windows and Linux, the generated per-platform ini files, launch URL parameters for map, difficulty, length and game mode, enabling the WebAdmin panel, why WebAdmin can no longer ADD kicks and bans (the 2020 change host guides still miss), how banning actually works today, Workshop custom maps, the map cycle, and the Server Takeover footgun.
Killing Floor 2 has no RCON protocol. The server is Unreal Engine 3, and its remote-admin channel is the built-in WebAdmin HTTP panel plus in-game console commands after an admin login. On top of that, the WebAdmin most guides describe no longer exists: in November 2020 (Update 1106) Tripwire deliberately disabled adding kicks, bans and IP restrictions through WebAdmin after an operator abused automated kick scripts across hundreds of servers. Most hosting knowledge bases still document the pre-2020 flow, which is why "why can't I ban anyone from WebAdmin" is the most common KF2 admin question. This reference describes how the server actually behaves today.
Installing the server
The dedicated server is Steam app 232130 and anonymous SteamCMD login works - you do not need an account that owns the game:
Unlike several of its Unreal-era peers, KF2 ships a native 64-bit Linux server binary (Binaries/Win64/KFServer.exe on Windows, Binaries/Win64/KFGameSteamServer.bin.x86_64 on Linux), and LinuxGSM supports it as kf2server if you prefer a managed install.
The generated config files
The live config files do not exist until the server has been started once: on first launch the server copies the shipped Default*.ini templates into per-platform working copies under KFGame/Config/ - PCServer-KFGame.ini / PCServer-KFEngine.ini on Windows, LinuxServer-KFGame.ini / LinuxServer-KFEngine.ini on Linux, plus the shared KFWeb.ini. Two rules save a lot of confusion:
Never edit the Default*.ini templates - the server reads the generated per-platform copies.
Stop the server before editing. The server rewrites its inis on shutdown, so edits made while it runs get clobbered, and most settings only take effect after a restart anyway.
Difficulty= - 0 Normal, 1 Hard, 2 Suicidal, 3 Hell on Earth. (Some hosting guides write GameDifficulty= - that key is wrong for KF2.)
GameLength= - 0 short (4 waves), 1 normal (7 waves), 2 long (10 waves).
Game= - the mode class path: KFGameContent.KFGameInfo_Survival (default), KFGameContent.KFGameInfo_WeeklySurvival, KFGameContent.KFGameInfo_Endless, KFGameContent.KFGameInfo_VersusSurvival.
MaxPlayers= and friends also work here; persistent equivalents live in [KFGame.KFGameInfo].
Set AdminPassword and GamePassword in [Engine.AccessControl] in the KFGame ini rather than passing them as ?AdminPassword= launch args - anything on the launch line is visible in the process list and in every startup log.
Port defaults, all of which matter for visibility: game 7777/UDP, query 27015/UDP, WebAdmin 8080/TCP, Steam 20560/UDP. The query port is what the Steam master server and the in-game browser actually poll - forward only 7777 and your server exists but appears in nobody's browser.
WebAdmin - and what Tripwire removed in 2020
Enable the panel in KFWeb.ini:
[IpDrv.WebServer]
bEnabled=true
ListenPort=8080
Set AdminPassword in [Engine.AccessControl], restart, and log in at http://<server-ip>:8080 as admin. WebAdmin still does most day-to-day admin work: current-game overview, player list, AdminSay chat (also usable as a chat console), changing the map, game mode, difficulty and length, editing general settings, and passwords.
What it can no longer do, since Update 1106: add any restriction. The kick/ban controls on the Players tab were removed; the Session Bans, Banned IDs and IP Masks tabs still list and remove entries but cannot add them; and the Management Console blocks kick and kickban. Tripwire shipped this as a "temporary" anti-abuse measure in November 2020 and has not reversed it.
How moderation actually works today:
Permanent ban: stop the server and add the player to [Engine.AccessControl] in the KFGame ini yourself, e.g. BannedIDs=(Uid=(A=<numeric-steam-id3>,B=17825793)). Existing entries added this way are visible (and removable) in WebAdmin's Banned IDs tab.
Kick / session ban in the moment: use the in-game console after adminlogin <password>. Community documentation (single-source, so verify on your own server) lists admin kick <player>, admin kickban <player> (session ban), admin adminsay <message>, admin switch KF-<map>, admin restartmap and admin nextmap as the working set.
For shared moderation, WebAdmin supports multiple admin accounts: set AuthenticationClass=WebAdmin.MultiWebAdminAuth under [WebAdmin.WebAdmin] in KFWebAdmin.ini; the server then generates a multi-admin ini where each admin gets a display name, password, and per-page allow/deny rules (so you can hand a moderator the console but not the passwords page). Logins are case-sensitive.
Map cycle and Workshop custom maps
The rotation lives in the KFGame ini: [KFGame.KFGameInfo]GameMapCycles=(Maps=("KF-BioticsLab","KF-Outpost",...)).
Workshop maps go in the KFEngine ini. Add the Workshop download manager as the FIRST entry under [IpDrv.TcpNetDriver], then list subscriptions:
The server downloads the items on startup (watch the log the first time - large maps take a while). For each custom map to appear properly in WebAdmin's map picker, also add it to GameMapCycles plus a summary section in the KFGame ini: [KF-MapName KFMapSummary] with MapName=KF-MapName. One ecosystem caveat: Epic Games Store players cannot download Steam Workshop content from your server - supporting them requires hosting the files on a plain HTTP redirect as well.
Server Takeover - a default you should know about
[Engine.GameEngine] bUsedForTakeover=TRUE is the default. It means an idle, passwordless dedicated server can be claimed through in-game matchmaking: the claiming player sets the map, difficulty, length - and a temporary game password - until their session ends. That is by design (it is how Tripwire crowd-sources server capacity), but it surprises operators who find "their" server running settings they never chose. Set it to FALSE (server stopped, then restart) if you want the server to run only your configuration.
Other footguns
Weekly and Endless are hard-capped at 6 players on a stock server; raising the cap requires a Workshop mutator, not an ini or URL setting.
Ranked vs unranked: running non-whitelisted mutators or custom settings flags the server unranked (no XP progression for players) and changes its browser icon - worth knowing before you bolt on mods.
Most ini changes need a full restart; there is no reload command.
MantaScope tracks the live Killing Floor 2 server list with decoded server attributes - filter by Difficulty (Normal through Hell on Earth), see wave counts, mutator and custom-server badges, browse real player counts, population history and uptime per server, and claim your own server to get monitoring, population graphs, downtime alerts and Discord notifications alongside the WebAdmin panel above.