Администраторы выделенных серверов Counter-Strike 2 часто сталкиваются с парадоксальной ситуацией: игроки могут напрямую подключиться к серверу через консольную команду connect <IP>:27015, сетевой геймплей работает без задержек, но сервер остаётся полностью невидимым в глобальном списке Steam Server Browser, а сторонние мониторинги рапортуют о статусе «Offline».
В этой статье мы разберём двухэтапный протокол опроса Valve A2S_INFO, напишем скрипт проверки сокета, проверим правила фаервола iptables на отбрасывание UDP-пакетов и настроим регистрацию токена GSLT в мастер-серверах Steam.
Анатомия запросов Valve A2S_INFO и двухэтапный рукопожатие#
Для отображения информации о сервере (название, текущая карта, количество игроков, теги) браузер Steam использует протокол Valve Source Query (A2S).
В Source 2 опрос происходит по следующему протоколу:
- Клиент отправляет UDP-пакет
\xFF\xFF\xFF\xFFTSource Engine Query\x00. - Сервер CS2 отвечает пакетом с вызовом (Challenge):
0xFF 0xFF 0xFF 0xFF 0x41 <4_байта_токена>. - Клиент повторно отправляет запрос, прикрепляя полученный 4-байтный токен в конце пакета.
- Сервер возвращает полезные данные (
A2S_INFO).
Если промежуточный фаервол фильтрует входящие UDP-запросы или отбрасывает пакеты без подтверждённой сессии, опросники зависают по тайм-ауту.
Проверьте, слушает ли процесс cs2 сетевой сокет UDP:
ss -ulnp | grep -E "cs2|27015"
Тестирование отклика сокета A2S через Python-скрипт#
Чтобы выяснить, отвечает ли сервер на внешние запросы протокола A2S, запустите локальный диагностический скрипт:
python3 - << 'EOF'
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(3.0)
target = ("127.0.0.1", 27015)
query = b"\xFF\xFF\xFF\xFFTSource Engine Query\x00"
sock.sendto(query, target)
try:
data, addr = sock.recvfrom(1400)
print(f"Initial response header: {data[:5]}")
if len(data) >= 9 and data[4:5] == b"\x41":
challenge = data[5:9]
sock.sendto(query + challenge, target)
data, addr = sock.recvfrom(1400)
print("Success: A2S_INFO payload received, size:", len(data))
except socket.timeout:
print("Failure: A2S query timed out.")
finally:
sock.close()
EOF
Если скрипт локально получает ответ Success: A2S_INFO payload received, а при запуске с внешнего компьютера падает по тайм-ауту, проблема гарантированно заключается в сетевом фаерволе или маршрутизации провайдера.
Проверка фаервола UFW, iptables и сетевых ограничений#
Частая причина блокировки — слишком агрессивные правила защиты от DDoS (rate limiting), которые ошибочно принимают регулярные опросы A2S за UDP-амплификацию.
Проверьте цепочки iptables на наличие сброшенных пакетов:
sudo iptables -L -n -v | grep -E "27015|DROP"
Убедитесь, что правила фаервола явно разрешают входящий UDP-трафик на порту 27015:
sudo ufw allow 27015/udp
sudo iptables -I INPUT -p udp --dport 27015 -j ACCEPT
Настройка токена GSLT и регистрация в мастер-серверах Steam#
Сервер CS2 не появится в глобальном списке браузера сообщества Steam без привязки валидного токена учётной записи сервера (Game Server Login Token).
Проверьте параметры в файле конфигурации game/csgo/cfg/server.cfg:
grep -E "sv_setsteamaccount|sv_lan" /opt/cs2/game/csgo/cfg/server.cfg
Убедитесь, что директива sv_lan выключена (sv_lan 0), а токен GSLT сгенерирован на официальном портале управления серверами Steam для AppID 730:
echo 'sv_lan 0' >> /opt/cs2/game/csgo/cfg/server.cfg
echo 'sv_setsteamaccount "YOUR_GSLT_TOKEN"' >> /opt/cs2/game/csgo/cfg/server.cfg
После перезапуска сервера демон отправит регистрационный пакет (heartbeat) на мастер-серверы Valve, подтвердит владение токеном и появится в глобальном поиске.
Если вам нужен выделенный сервер Counter-Strike 2 с гарантированной видимостью в браузере Steam, защитой от UDP-флуда и низким пингом, современный хостинг серверов CS2 предоставляет оптимизированную инфраструктуру с автоматической регистрацией портов.




