Тема создания сервера Counter-Strike избита и перелапачена и так и этак на просторах Интернета. По крайней мере она очень актуальна, т.к. игра захватила сердца многих геймеров, а каждый 3-й геймер мечтает о своем сервере, что бы быть на нем богом админом, ирать только со своими друзьями и т.д.

Я расскажу как создать сервер Counter-Strike на хост машине с операционной системой Linux CentOS x32 на виртуалке в интернете, либо у себя дома. Почему именно на Linux Системе? До потому что, если вы арендуете сервер, то с Linux это будет на порядок дешевле, т.к. Linux является бесплатной операционной системой. И для роли серверной операционки - линукс идеален. Вам потребуется виртуальная машина с минимальными параметрами. Хватит 512MB оперативной памяти и 5GB жесткого диска.

Сначала опишу, а точнее поведаю (как это делаю именно я) создание игрового сервера на виртуальной машине размещенной в интернете и имеющей белый IP адрес. А уж потом, как это сделать у себя дома, находясь за роутером и имея белый IP от провайдера.

Подготовка

Для работы с консолью сервера вам понадобится программа PuTTY. Соеденитесь с сервером (впишите IP адрес сервера и нажмите Open):

Установка нового соединения в PuTTY

Скачайте и установите бесплатный файловый менеджер для работы на удаленном сервере WinSCP. Возможно понадобится. Скачали? Установили? Ну тогда поехали дальше. Соединяемся с сервером:

Установка нового соединения в WinSCP

Процесс создания сервера Counter-Strike

И так, сессии в PuTTY и WinSCP начаты, значит мы можем приступить непосредственно к установке сервера.

Linux является многопользовательской сетевой операционной системой и по минимальным требованиям безопасности стоит запускать процесс «халвы» от своего пользователя, которого нужно создать. Обращаемся к PuTTY и вводим следующие команды:

Создаем группу hlds

[root@projects ~]# groupadd hlds

Создаем пользователя hlds и задаем ему домашний каталог, где и будет находиться сервер

[root@projects ~]# useradd hlds -g hlds -d /home/hlds

Задаем пользователю hlds пароль

[root@projects ~]# passwd hlds
Смена пароля для пользователя hlds.
Новый пароль :
Повторите ввод нового пароля :
passwd: все токены проверки подлинности успешно обновлены.

Переключаемся на нового пользователя и будем работать под ним. Сразу перейдем в домашний каталог.

[root@projects ~]# su hlds
[hlds@projects root]$ cd ~

Теперь скачиваем утилиту, которая будет качать сервер Counter-Strike из официального источника

[hlds@projects root]$ wget http://media.steampowered.com/client/steamcmd_linux.tar.gz

Теперь распаковываем архив

[hlds@projects root]$ tar -xvzf steamcmd_linux.tar.gz

Запускаем приложение установки

[hlds@projects root]$ ./steamcmd.sh

Утилита начнет обновляться, в итоге запустится. Появится приглашение Steam> Введите help для получения дополнительной информации. Для возможности скачивания большинства серверов, вы должны быть залогинены анонимно. Для Логинимся:

Steam>login anonymous

Если всё нормально, вы увидите: Connecting anonymously to Steam Public…Success. Если это не сработало, то вам необходимо залогиниться под Steam аккаунтом.

Скачиваем. Задаем путь для установки (не упустите точку):

Steam>force_install_dir ./server/

Установить можно любой сервер по его ID командой app_update app_id, где app_id - идентификатор приложения. Список соответствий идентификаторов и приложений тут

Для примера установим HLDS

Steam>app_update 90 validate

Началось скачивание файлов сервера. Если по какой либо причине скачивание прервалось, вводим данную команду повторно. Для корректного выхода из программы установки введите quit

Всё. Сервер скачался. Перейдем в каталог с установленным сервером

[hlds@projects ~]$ cd server

Дадим права на выполнеие файла запуска сервера:

[hlds@projects server]$ chmod +x hlds_run

Создадим правила для фаервола системы

iptables -A INPUT -p udp -m udp --sport 27000:27030 --dport 1025:65355 -j ACCEPT
iptables -A INPUT -p udp -m udp --sport 4380 --dport 1025:65355 -j ACCEPT

Пробуем запустить

./hlds_run -game cstrike +ip (ip нашего сервера) +port 27015 +maxplayers 32 +map crossfire

IP сервера вы должны знать. Если забыли, то смотрим

[hlds@projects server]$ ifconfig | grep "inet addr"
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet addr:10.8.0.1  Bcast:10.8.0.255  Mask:255.255.255.0
          inet addr:127.0.0.1  P-t-P:127.0.0.1  Bcast:0.0.0.0  Mask:255.255.255.255
          inet addr:81.176.79.200  P-t-P:81.176.79.200  Bcast:81.176.79.200  Mask:255.255.255.255

Вот у меня 81.176.79.200… Запускаем

./hlds_run -game cstrike +ip 81.176.79.200 +port 27015 +maxplayers 32 +map crossfire

Пошел запуск

Auto-restarting the server on crash

Console initialized.
Using breakpad crash handler
Setting breakpad minidump AppID = 10
Forcing breakpad minidump interfaces to load
dlopen failed trying to load:
/home/hlds/.steam/sdk32/steamclient.so
with error:
/home/hlds/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
Looking up breakpad interfaces from steamclient
Calling BreakpadMiniDumpSystemInit
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
Exe build: 17:45:07 Apr 25 2013 (6027)
STEAM Auth Server
Server IP address 192.168.1.10:27015
[S_API FAIL] SteamAPI_Init() failed; SteamAPI_IsSteamRunning() failed.
Setting breakpad minidump AppID = 70
dlopen failed trying to load:
/home/hlds/.steam/sdk32/steamclient.so
with error:
/home/hlds/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
Looking up breakpad interfaces from steamclient
Calling BreakpadMiniDumpSystemInit

couldn't exec listip.cfg
couldn't exec banned.cfg
Connection to Steam servers successful.
   VAC secure mode is activated.

Хорошо… запустился. Далее открываем WinSCP и правим файл /home/hlds/server/cstrike/server.cfg. Предлагаю такой вот конфиг:

// Set the Host Name
hostname "server_name" // Имя сервера.

// Set the rcon password
rcon_password "password" // Пароль для управления сервером через консоль клиента. Чтобы данная функция не работала, оставьте пустым.


// Server Logging
log on // включаем режим записи логов
mp_logdetail 3 // определяем детальность записи логов
mp_logmessages 1 // записывать сообщения

// Server Variables
mp_timelimit 30 // Время на карту (в мин)
mp_autokick 0  // разрешить автокик за убийство игроков своей команды
mp_autoteambalance 1 // Автоматический баланс команд.
mp_c4timer 35 // Время таймера на бомбе (в сек)
mp_flashlight 1 // Разрешить фонарик
mp_footsteps 1  // слышимость звуков шагов
mp_freezetime 1 // Время для закупки в начале раунда, когда нельзя двигаться (в сек)
mp_friendlyfire 1 // Режим попадания по своим тим-мэйтам
mp_hostagepenalty 0  // кикает террориста при убийстве заданного лимита заложников
mp_limitteams 0  // максимальное количество превышения игроков одной команды над другой (от 1 и до бесконечности )
mp_tkpunish 0    // в следующем раунде убить того, кто убил игрока своей команды
mp_roundtime 1.45 // Длительность раунда (в мин)
mp_buytime 0.25 // Время, от начала раунда, когда ещё можно купить оружие (в мин)
mp_fadetoblack 0  // после смерти экран становится чёрным, не давая игроку смотреть за другими игроками в режиме спектатора
mp_forcechasecam 2   // после смерти игрок может следить только за своей командой
mp_forcecamera 2  // разрешить переключения камер в режиме спектатора
mp_kickpercent 100
mp_playerid 1  // контролирует информацию которую игрок видет на панели статуса: 0 все имена; 1 только имена игроков своей команды; 2 без имён
mp_startmoney 800   // колличество начальных денег у игроков
mp_chattime 3  // время, в течении которого игроки смогут разговаривать между собой после окончания текущей карты
mp_falldamage 1 // Есть урон от падений
mp_winlimit 15

sv_airaccelerate 10  // определяет ускорение игрока, когда он находится в воздухе(например падает)
sv_airmove 1
sv_restartround 0
sv_maxspeed 320  // максимальная скорость игрока (320)

sv_allowdownload 1	// Разрешаем загрузку ресурсов с удаленного сервера
sv_downloadurl "http://cs26.ru:80/csfiles/" // Сервер с файлами для загрузок


sv_proxies 1
sv_allowupload 1   // разрешить закачку файлов (например decals, спрей-логи, карты) на сервер
sv_voiceenable 1   // разрешить использование микрофона
sv_region 3
sv_alltalk 1       // разрешить всем слышать переговоры друг друга по микрофону, вне зависимости от команды (даже мертвые)
sv_voicequality 5
sv_voicecodec "voice_speex"
allow_spectators 1
pausable 0    // разрешить ставить паузу во время игры
cl_weather 0

spec_mode_internal 4

// cheat and fun modes
sv_aim 0
sv_cheats 0  // разрешить игровые читы на сервере (пример: noclip)

// Set Rates
sv_maxrate 0    // максимальное колличество байт в секунду, которое может быть передано сервером(0 == без ограничения)
sv_spectatormaxspeed 500
sv_maxupdaterate 101   // ограничивает частоту обновлений сервера. Чем выше значение,тем больше пакетов будет послано клиентам (зависит от sv_maxrate и также считается по формуле )
sv_minrate 0        // минимальное колличество байт в секунду, которое может быть передано сервером (0 == без ограничения)
sv_minupdaterate 20    // минимальное колличество обновлений(колличество пакетов) которое разрешено на сервере
decalfrequency 10
sys_ticrate 1100
mm_insane 0

// Enable/Disable LAN mode
sv_lan 0 // Для локальной сети – 1, для Интернета – 0.

Сохраняем. Пробуем запустить:

[hlds@projects server]$ ./hlds_run -game cstrike +ip 192.168.1.10 +port 27015 +maxplayers 32 +map crossfire
Auto-restarting the server on crash

Console initialized.
Using breakpad crash handler
Setting breakpad minidump AppID = 10
Forcing breakpad minidump interfaces to load
dlopen failed trying to load:
/home/hlds/.steam/sdk32/steamclient.so
with error:
/home/hlds/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
Looking up breakpad interfaces from steamclient
Calling BreakpadMiniDumpSystemInit
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
Exe build: 17:45:07 Apr 25 2013 (6027)
STEAM Auth Server
Server IP address 192.168.1.10:27015
[S_API FAIL] SteamAPI_Init() failed; SteamAPI_IsSteamRunning() failed.
dlopen failed trying to load:
/home/hlds/.steam/sdk32/steamclient.so
with error:
/home/hlds/.steam/sdk32/steamclient.so: cannot open shared object file: No such file or directory
Looking up breakpad interfaces from steamclient
Calling BreakpadMiniDumpSystemInit

Server logging data to file logs/L1207000.log
L 12/07/2013 - 00:42:47: Log file started (file "logs/L1207000.log") (game "cstrike") (version "48/1.1.2.7/Stdio/6027")
L 12/07/2013 - 00:42:47: Server cvar "mp_logdetail" = "3"
L 12/07/2013 - 00:42:47: Server cvar "mp_timelimit" = "30"
L 12/07/2013 - 00:42:47: Server cvar "mp_autokick" = "0"
L 12/07/2013 - 00:42:47: Server cvar "mp_c4timer" = "35"
L 12/07/2013 - 00:42:47: Server cvar "mp_flashlight" = "1"
L 12/07/2013 - 00:42:47: Server cvar "mp_freezetime" = "1"
L 12/07/2013 - 00:42:47: Server cvar "mp_friendlyfire" = "1"
L 12/07/2013 - 00:42:47: Server cvar "mp_hostagepenalty" = "0"
L 12/07/2013 - 00:42:47: Server cvar "mp_limitteams" = "0"
L 12/07/2013 - 00:42:47: Server cvar "mp_roundtime" = "1.45"
L 12/07/2013 - 00:42:47: Server cvar "mp_buytime" = "0.25"
L 12/07/2013 - 00:42:47: Server cvar "mp_forcechasecam" = "2"
L 12/07/2013 - 00:42:47: Server cvar "mp_forcecamera" = "2"
L 12/07/2013 - 00:42:47: Server cvar "mp_kickpercent" = "100"
L 12/07/2013 - 00:42:47: Server cvar "mp_playerid" = "1"
L 12/07/2013 - 00:42:47: Server cvar "mp_chattime" = "3"
L 12/07/2013 - 00:42:47: Server cvar "mp_winlimit" = "15"
L 12/07/2013 - 00:42:47: Server cvar "sv_maxspeed" = "320"
L 12/07/2013 - 00:42:47: Server cvar "sv_alltalk" = "1"
L 12/07/2013 - 00:42:47: Server cvar "allow_spectators" = "1"
L 12/07/2013 - 00:42:47: Server cvar "sv_aim" = "0"
L 12/07/2013 - 00:42:47: Server cvar "decalfrequency" = "10"
Connection to Steam servers successful.
   VAC secure mode is activated.
L 12/07/2013 - 00:42:55: World triggered "Round_Start"

Видно, что раунд начат… Теперь, если вы закроете консоль, то сервер скорее всего отключится. Выход: запускать сервер с помощью утилиты screen. Зайдите снова под пользователем root. Установим screen на сервер:

[root@projects ~]# yum install screen

Установили? Переключаемся на пользователя hlds

[root@projects ~]# su hlds

Перейдем в каталог, где установлен сервер и запустим его с помощью screen

bash-4.1$ cd ~/server
bash-4.1$ screen -A -m -d -S hlds ./hlds_run -game cstrike +ip 192.168.1.10 +port 27015 +maxplayers 32 +map crossfire

Всё. Сервер должен запуститься в фоновом режиме. Проверим:

bash-4.1$ ps -A | grep hlds
 5075 pts/3    00:00:00 hlds_run
 5079 pts/3    00:00:49 hlds_linux

Если сервер запущен, а подключиться к нему не удается, скорее всего неверно настроен фаервол. Для теста, попробуйте временно отключить iptables командой из под root пользователя:

[root@projects ~]# service iptables stop

Если после этого подключение удалось, предлагаю свой конфиг для iptables. Находится он в файле /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 27015 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

Перезапускаем iptables

[root@projects ~]# service iptables restart
iptables: Сбрасываются правила межсетевого экрана:         [  OK  ]
iptables: Цепочкам назначается политика ACCEPT: filter     [  OK  ]
iptables: Выгружаются модули:                              [  OK  ]
iptables: Применяются правила межсетевого экрана:          [  OK  ]
iptables: Загружаются дополнительные модули: nf_conntrack_n[  OK  ]s