Свой сервер

Выделенный сервер KF2: полное руководство по портам, WebAdmin, картам и мутаторам

Статья - переработка очень большого бразильско-португальского руководства по хостингу выделенных серверов Killing Floor 2, частично основанного на более раннем английском руководстве zachjd (использовано с разрешением, автор указывает его заслуги). Здесь установка, проброс портов, несколько серверов, WebAdmin, несколько админов, пользовательские карты из Workshop или redirect, мутаторы и типы игры, настройки и множество советов. Основной путь - Windows. Другие материалы: выделенный сервер через SteamCMD, секреты и исправления сервера и проблема Workshop 2025.

Перед началом

  • Сервер кроссплатформенный: созданный вами сервер обслуживает и игроков Steam, и Epic.
  • В оригинале есть часть об основах сетей (как работает интернет, TCP и UDP, HTTP и HTTPS, IPv4 и IPv6, двойной NAT, брандмауэр). Её можно не читать, но она полезна. Серверы KF2 сейчас не поддерживают IPv6. Документировать каждое изменение сети (порт, протокол, дата) - хорошая практика.
  • Если у вас два маршрутизатора, пробросьте порты на обоих или переведите роутер провайдера в режим моста, чтобы избежать двойного NAT.
  • Автор оценивает сложность по трудоёмкости настройки: ванильный сервер проще всего, пользовательские карты чуть сложнее, несколько серверов с картами ещё сложнее, а глубокая настройка (админы, мутаторы, экран приветствия) - сложнее всего.
  • Совет: включите показ расширений файлов в Проводнике Windows (Вид, Расширения имён файлов), чтобы знать, какой файл вы правите.

Какие порты открыть

ПортНомерПротоколНазначение
Игровой7777UDPОсновной порт игровых подключений
Query27015UDPСвязь с главным сервером Valve
WebAdmin8080TCPВеб-администрирование
Steam20560UDPПорт Steam
NTP123UDPТолько режим Weekly: проверка режима недели

Откройте их в брандмауэре Windows (входящее правило, конкретные локальные порты, разрешить, профили домена и частный) и в роутере; при включённой DMZ и выключенном брандмауэре это не нужно, но так оставлять рискованно. У хоста должен быть статический IPv4. Проверяйте порты сервисом вроде canyouseeme.org.

Диагностика: неверно проброшенный игровой порт может скрыть сервер и во вкладке LAN, и в общем браузере; неверный query-порт может скрыть его в общем браузере, но показывать во вкладке LAN; неверный порт WebAdmin означает, что WebAdmin недоступен (или вы забыли включить KFWeb.ini). Другие способы: проверьте опечатки и перезагрузите роутер; попробуйте другой игровой порт, например 7780; временно включите DMZ для проверки (потом уберите); спросите у провайдера, не блокирует ли он порты; проверьте антивирус или брандмауэр, блокирующий сервер (функция AVG полностью блокировала серверы автора); снимите флажок «Без пользовательских серверов» в браузере серверов игры, если используете мутаторы; перезагрузите роутер; запускайте сервер до игры, если хостите на своём ПК; строгий или недоступный тип NAT ограничивает хостинг.

Установка сервера

  1. Скачайте SteamCMD и распакуйте в папку вроде C:\SteamCMD. Запустите, дайте обновиться и запустите снова.
  2. С конца 2021 порядок важен: сначала force_install_dir c:\KF2Server\, затем login anonymous, затем app_update 232130 validate. Дождитесь Success! App '232130' fully installed. и введите quit.
  3. Пользователям Linux следует использовать инструкции SteamCMD и вики KF2 для Linux; понадобится эмуляция .bat.
  4. Запустите сервер один раз, чтобы он создал файлы конфигурации, и закройте.

Настройка в C:\KF2Server\KFGame\Config:

Папка Config сервера Папка Config сервера; видна и подпапка Serverhell83 из примера с несколькими серверами.

  • KFWeb.ini: поставьте bEnabled=true (по умолчанию false), чтобы использовать WebAdmin.
  • PCServer-KFGame.ini: задайте ServerName=.

ServerName в PCServer-KFGame.ini Измените ServerName.

Проверьте порты: в PCServer-KFEngine.ini должно быть Port=7777, в KFWeb.ini ListenPort=8080 (оба по умолчанию). Можно также добавить ключи в .bat: -Port=7777 -QueryPort=27015 -WebAdminPort=8080, они имеют приоритет над конфигами.

ListenPort и bEnabled в KFWeb.ini KFWeb.ini хранит порт WebAdmin и переключатель включения.

Обновление

Сделайте ярлык SteamCMD.exe и добавьте в его поле «Объект» +login anonymous +force_install_dir ./KF2Server +app_update 232130 +exit (при необходимости абсолютный путь). Запускайте при каждом обновлении, он закроется сам. Для беты app_update 232130 -beta preview, а validate проверяет файлы. Команды отката нет, поэтому перед бетой делайте резервную копию.

Несколько серверов

Несколько серверов можно запускать из одной установки: конфиги разделяются ключом -ConfigSubDir=. Для второго сервера добавьте -ConfigSubDir=Serverhell83 в его .bat, запустите один раз, чтобы создалась KFGame\Config\Serverhell83, затем в этой папке в PCServer-KFEngine.ini измените Port=7777 на Port=7778, а в KFWeb.ini ListenPort=8080 на 8081, и пробросьте новые порты (игровые 7777-7778 UDP, query 27010-27019 UDP, WebAdmin 8080-8081 TCP, Steam 20560 UDP). Основному серверу ключ не нужен. Чтобы различать серверы, называйте папку и .bat по порту WebAdmin (совет -InSane-Lon). Инструменты: netstat -o -n -a и столбец PID в Диспетчере задач покажут, кто занимает порт (KFServer.exe должен держать 7777 UDP и 8080 TCP), а taskkill -f -t /im KFServer.exe остановит его.

Запуск с выбранным режимом

Измените в .bat часть ?Game=. Каждый параметр начинается с ?:

Пример .bat сервера Endless .bat, запускающий Endless на Hell on Earth со средней длиной.

РежимКоманда
Survival?Game=KFGameContent.KFGameInfo_Survival
Weekly?Game=KFGameContent.KFGameInfo_WeeklySurvival
Versus?Game=KFGameContent.KFGameInfo_VersusSurvival
Endless?Game=KFGameContent.KFGameInfo_Endless
Objective?Game=KFGameContent.KFGameInfo_Objective

Сложность - ?Difficulty= (0 Normal, 1 Hard, 2 Suicidal, 3 Hell on Earth), длина - ?GameLength= (0 короткая 4 волны, 1 средняя 7, 2 длинная 10). Другие URL-аргументы: AdminName=, AdminPassword=, MaxPlayers=, Port=, QueryPort=, WebAdminPort= (бета), Multihome= (привязка к конкретному IP), PREFERREDPROCESSOR= (привязка к ядру) и ConfigSubDir=.

Ключевые файлы: PCServer-KFGame.ini содержит AdminPassword, GamePassword ([Engine.AccessControl]), ServerName и AdminContact ([Engine.GameReplicationInfo]), bUseMapList=True и GameMapCycles=(Maps=("KF-BurningParis","KF-Bioticslab",...)). В PCServer-KFEngine.ini порты и NetServerMaxTickRate (по умолчанию 30).

Чтобы подключиться напрямую, откройте консоль (клавиша под Esc) и введите open <IPv4>:7777; IP узнаётся командой ipconfig.

WebAdmin

Откройте http://<IPv4>:8080. Пропишите AdminPassword= в PCServer-KFGame.ini и ?AdminName= в .bat. В игре используйте adminlogin <пароль> из консоли.

  • Смена карты: Change Map, выберите тип игры и карту, мутаторы и опции впишите в ADDITIONAL URL VARIABLES, например ?Mutator=ClassicScoreboard.ClassicSCMut,DamageDisplay.DmgMut,KFMutator.KFMutator_MaxPlayersV2?MaxPlayers=12?MaxMonsters=32?Difficulty=3?GameLength=1.

Дополнительные URL-переменные в Change Map Мутаторы и сложность в поле ADDITIONAL URL VARIABLES.

  • Экран приветствия: баннер должен быть .PNG (по сообщениям, глубина цвета должна быть более 8 бит; безопасный размер 720x361, хостится на сайте вроде Imgur и подключается прямой ссылкой). Есть также ссылка на сайт, девиз клана и сообщение дня (\n для новых строк, HTML-теги вроде <font color="#B22222" size="24">, <b>, <i>, <u>; выбор цвета в WebAdmin не работает, а # обязателен).

Экран приветствия в игре Так экран приветствия выглядит в игре.

  • Баны: Export сохраняет server-bans.json; чтобы импортировать, вставьте содержимое в секретный gist на GitHub, скопируйте Raw URL и вставьте в Import Bans, так один список могут использовать много серверов.
  • Журнал чата: WEBADMIN SETTINGS, вкладка CHAT LOGGING (метка времени, уникальные имена, шаблоны имени файла %i, %p, %c, %v); логи лежат в KFGame\Logs.
  • Несколько админов: в KFWebAdmin.ini под [WebAdmin.WebAdmin] добавьте AuthenticationClass=WebAdmin.MultiWebAdminAuth. После перезапуска создаётся KFMultiAdmin.ini, логин - Admin (с заглавной A) и ваш прежний пароль. Администраторов создавайте на новой странице Administrators с шаблонами Deny/Allow (порядок доступа Deny,Allow или Allow,Deny); кнопки удаления нет, поэтому удаляйте раздел из KFMultiAdmin.ini. Вход через ?AdminName= в .bat после включения multi-admin не работает.

Включение MultiWebAdminAuth Строка AuthenticationClass в KFWebAdmin.ini.

Создание администратора Создание учётной записи администратора WebAdmin.

  • «Exceeded login attempts»: увеличьте MaxConnections=18 (по умолчанию) в KFWeb.ini; ExpirationSeconds=86400 задаёт длительность сессии.
  • Список карт обрезается около 170-180 карт: в KFWeb.ini под [IpDrv.WebConnection] измените MaxValueLength и MaxLineLength с 4096 на 999999.
  • Показ уровней перков: правьте файлы в KFGame\Web\ServerAdmin (current.html, current_players.html, current_player_row.inc и current_players_row.inc, предварительно сделав копии), добавив столбец Level с <%player.perk.level%>.

Уровни перков в списке игроков WebAdmin Столбцы перка и уровня после правки.

  • Счётчик волн в Endless: в gamesummary.inc замените строки времени на <dt class="gs_wave">Wave <%wave.num%></dt><dd class="gs_wave"><%wave.monsters.dead%>/<%wave.monsters.total%></dd> и добавьте волну в current_rules.inc.

Значки сервера в браузере: значок рейтинга означает серверы с рейтингом, статистикой и XP, без мутаторов и пользовательских настроек; «рейтинг stock» - сервер настроен, но статистика включена (например мутаторы из белого списка или огонь по своим); без рейтинга - статистика отключена из-за мутаторов вне белого списка или пользовательской карты со скриптами.

Пользовательские карты

Карты Workshop скачиваются быстро, сжаты и обновляются автоматически, но должны быть публичными в Workshop; удалённая страница ломает карту. Redirect даёт больше контроля, но без автообновлений и сжатия и с более медленной загрузкой. Можно использовать оба сразу, у Workshop приоритет. Автор рекомендует Workshop.

Workshop:

  1. В PCServer-KFEngine.ini под [IpDrv.TcpNetDriver] добавьте DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload (выше других строк DownloadManagers).
  2. В конец добавьте [OnlineSubsystemSteamworks.KFWorkshopSteamworks] и ServerSubscribedWorkshopItems=<ID Workshop> (по строке на ID, комментарии через //).
  3. Запустите сервер, чтобы он скачал в KFGame\Cache, затем закройте.
  4. Добавьте хранилище данных и запись в цикл карт (ниже).

ID Workshop в конфиге Подписанные ID Workshop с комментариями.

Redirect: скачайте карты (например с сайта redirect), положите в KFGame\BrewedPC\Maps (по желанию в подпапку CustomMaps) и укажите RedirectToURL=<URL redirect> в PCServer-KFEngine.ini. В [IpDrv.WebServer] задайте ApplicationPaths[0]=/ServerAdmin, ApplicationPaths[1]=/images, ListenPort=80, большое MaxConnections, большое ExpirationSeconds и bEnabled=True. На Linux redirect используйте имена в нижнем регистре и косую черту в конце, иначе клиенты получат файл 1 КБ. Для IIS добавьте MIME-тип .kfm. Веб-серверы: HFS, Apache, NGINX, IIS; защищайте их (WAF, без случайных файлов с паролями).

Хранилище данных и цикл: в PCServer-KFGame.ini добавьте для каждой карты:

[KF-BikiniAtoll KFMapSummary]
MapName=KF-BikiniAtoll

(MapAssociation и ScreenshotPathName не нужны; имена карт redirect чувствительны к регистру, карт Workshop нет.) Затем добавьте карту в GameMapCycles либо используйте Map Cycles в WebAdmin с «ADD MISSING», чтобы добавить все недостающие карты.

Записи хранилища данных в PCServer-KFGame.ini Запись KFMapSummary для пользовательской карты.

Строка GameMapCycles Добавление карты в GameMapCycles.

Удаление карты: уберите её из ID Workshop, хранилища данных, цикла, папки Cache (названа по ID Workshop) или папки Maps. Для больших списков комментируйте ID, ведите таблицу, сортируйте по алфавиту и добавляйте разделители вроде "| =----= Killing Floor 2 Maps =----= |" в GameMapCycles (нажатие на разделитель загружает KF-BioticsLab).

Что значит содержимое Cache: папки с числами - ID Workshop, файлы .uxx - загрузки redirect, перечисленные в Cache.ini, а .tmp - временные. См. также где хранятся скачанные с серверов карты.

Состояния предметов в консоли сервера: 4 - установлен и актуален; 0 - не установлен, будет скачан; 12 - установлен, требует обновления; 20 - не проверен или потеряна связь с Workshop (перезапустите); 8 и 36 неясны. Предупреждения: «Steam не похож на работающий» - нет связи с Workshop (перезапустите Steam и сервер и не запускайте сервер дважды); «не удалось скачать предмет» - страница закрыта, отключена или неверный ID; «попытка проверить установку без загрузки» - это нормально, проверяется Binaries\Win64\steamapps\workshop\content\232090, затем копирование в KFGame\Cache.

Проблема Workshop 2025: моды, опубликованные после 11 июля 2025, не обновляются на сервере, потому что поставляемые DLL Steam не знают сжатых по ZSTD блоков Workshop. Краткосрочное решение - скопировать steamclient.dll, steamclient64.dll, tier0_s.dll, tier0_s64.dll, vstdlib_s.dll и vstdlib_s64.dll из SteamCMD в папку Binaries\Win64 сервера.

Более 519 карт в ротации роняет сервер при открытии Change Map или Map Cycles. Обход: используйте учётные записи MultiAdmin, в шаблонах запрета укажите /current/change и /settings/maplist, а карты меняйте из консоли WebAdmin командой switch KF-MapName (допустимы дополнения вроде ?Difficulty=3?GameLength=2) или restartmap.

Мутаторы и типы игры

Мутаторы и типы игры отключают XP и статистику, если не входят в белый список. Установка: впишите ID Workshop в ServerSubscribedWorkshopItems, запустите для загрузки, затем добавьте командную строку в .bat или WebAdmin. Всегда проверяйте инструкции автора.

МодКоманда
Unofficial Endless?Game=EndlessM.EndlessM_Main
Controlled Difficulty?Game=ControlledDifficulty.CD_Survival
Legs and Backpack?Mutator=FPBackPackMut.FPBPBaseMut
Infernal Nightmare Difficulty?Mutator=NightmareDifficulty.NightmareMutator?Difficulty=4
Server Extension Addons?Mutator=ServerExtMut.ServerExtMut
Boss Only?Mutator=OnlyBossMut.OnlyBossMut
Classic Scoreboard?Mutator=ClassicScoreboard.ClassicSCMut
MaxPlayers?Mutator=KFMutator.KFMutator_MaxPlayersV2?MaxPlayers=15?MaxMonsters=64

Несколько мутаторов разделяются запятыми, например ?Mutator=OnlyBossMut.OnlyBossMut,FPBackPackMut.FPBPBaseMut. Некоторым модам нужны файлы .u или .upk в KFGame\BrewedPC и .ini в Config; варианту MaxPlayers V1 нужно скопировать KFMutator.u из Cache в BrewedPC, V2 не нужно.

Чтобы показать пользовательский тип игры в WebAdmin, добавьте в PCServer-KFGame.ini рядом с другими KFGameInfoSummary:

[Controlled_Difficulty.CD_Survival KFGameInfoSummary]
ClassName=Controlled_Difficulty.CD_Survival
MapPrefix=KF

затем выберите его в Change Map и укажите его командную строку в ADDITIONAL URL VARIABLES.

Настройки сервера

Настройки, не делающие сервер пользовательским: ReadyUpDelay=90, GameStartDelay=4 (никогда не 0), TimeBetweenFailedVotes=10, VoteTime=60.0, MaxSpectators=2, KickVotePercentage=0.66, bDisableTeamCollision, bEnableDeadToVOIP, bAdminCanPause (adminpause), bDisableVOIP, bDisablePublicTextChat, bDisableMapVote, MaxIdleTime (максимум 300), bDisableKickVote, bSilentAdminLogin, bPartitionSpectators, bUsedForTakeover (включена по умолчанию; позволяет игрокам менять сложность и длину через подбор матча; стоит отключить) и bEnableMapObjectives (задаётся в разделах Survival или Endless, а не в [KFGame.KFGameInfo]). Настройки, делающие сервер «rated stock»: bDisablePickups и FriendlyFireScale.

Советы

  • Админов нельзя кикнуть, даже через WebAdmin.
  • Бан сессии действует до следующей карты; используйте вместе с киком.
  • Если после игры никто не голосует, сервер загружает следующую карту цикла, а не случайную.
  • Пароль админа подходит и как пароль игры и входит под админом.
  • Привяжите adminlogin <пароль> к клавише в KFInput.ini или командой bind l adminlogin 123.
  • Отключите столкновения команды, чтобы не было блокировщиков дверей.
  • Отключите автоперезагрузку Windows для серверов 24/7.
  • Держите в WebAdmin заметки о значениях сложности и длины.
  • Программы вроде Microsoft Visual Studio могут конфликтовать с сервером и вызывать случайные падения.
  • Если игроки голосуют за карту, которую сервер не находит, загружается BioticsLab; ServerLocalMap= в PCServer-KFEngine.ini может не помочь.

Вопросы и ответы

Какие порты нужны серверу KF2?
Игровой 7777 UDP, query 27015 UDP, WebAdmin 8080 TCP, порт Steam 20560 UDP и, для режима Weekly, NTP 123 UDP.
Какой ID у выделенного сервера?
232130 в SteamCMD (app_update 232130 validate). Сама игра - 232090.
Сколько пользовательских карт выдержит сервер?
Не более 519 карт в ротации; больше - и страницы карт WebAdmin роняют сервер, так что меняйте карты из консоли командой switch KF-MapName.
Работает ли это для игроков Epic Games?
Да, сервер кроссплатформенный, один сервер обслуживает и Steam, и Epic.