GameServerManagers / GameServerManagers/LinuxGSM

[Bug]: Cannot query lgsm server when crossplay is enabled (a2s_info won't connect)

Open
#4,888 1 comment 0 reactions 0 assignees View on GitHub
command: details command: monitor distro: Ubuntu engine: unity3d game: Valheim info: query type: bug
Dominant language
Shell
Stars
4.9k
Forks
864
PR merge metrics
No merged PRs in 30d

Description

### User story

As a dedicated server host, using cloud service providers, I want to be able to query my lgsm server so that I can automate server operations (startup / shutdown).

### Game

Valheim

### Linux distro

Ubuntu 24.04

### Command

command: details, command: monitor

### Further information

## Context

I've been hosting a [Valheim Server](https://linuxgsm.com/servers/vhserver/) for a group of friends off-and-on for several years. The game server is VM on GCP -- it starts `lgsm` / `vhserver` as soon as it boots. Then I built a discord bot that listens in our discord, and can turn the VM off/on using pub/sub messages attached to a "Cloud Function."

My Discord bot uses [Steam's a2s_info query](https://developer.valvesoftware.com/wiki/Server_queries) to determine if the server is up, and if so, state how many people are logged in. It uses the a2s_info query to tell people when the server is up (e.g. "*Starting.... Started!*"), so it's an important part of my setup.

## Problem

When crossplay is enabled, Steam's server queries are broken (e.g. A2S_info, A2S_ping).

At first I thought this was a port forwarding issue, but I think there's a more significant reason why this doesn't work. Specifically, when crossplay is enabled, queries are broken *on the host itself*.

With Crossplay Turned on.
```
$ ./vhserver start
$ echo -n -e "\xff\xff\xff\xff\x54\x53\x6f\x75\x72\x63\x65\x20\x45\x6e\x67\x69\x6e\x65\x20\x51\x75\x65\x72\x79\x00" | nc -u 127.0.0.1 2457

```

With Crossplay Turned off:
```
$ ./vhserver start
$ echo -n -e "\xff\xff\xff\xff\x54\x53\x6f\x75\x72\x63\x65\x20\x45\x6e\x67\x69\x6e\x65\x20\x51\x75\x65\x72\x79\x00" | nc -u 127.0.0.1 2457
I$servername$$servername$valheim
dl1.0.0.0 ̧8@g=0.221.12,n=36,m=*
```

Prior Issue: https://github.com/GameServerManagers/LinuxGSM/issues/4748

## Expected Behavior

Whether crossplay is enabled or not:

1. Players can join the game via the Valheim game client.
2. a2s_info server queries return server information.

## Game Startup

### With Crossplay

`./valheim_server.x86_64 -name $servername -password $passwd -port 2456 -world $worldname -public 1 -savedir '/home/vhserver/.config/unity3d/IronGate/Valheim' -saveinterval 1800 -backups 4 -backupshort 7200 -backuplong 43200 -crossplay -instanceid 1`

### Without Crossplay

`./valheim_server.x86_64 -name $servername -password $passwd -port 2456 -world $worldname -public 1 -savedir '/home/vhserver/.config/unity3d/IronGate/Valheim' -saveinterval 1800 -backups 4 -backupshort 7200 -backuplong 43200 -instanceid 1`

## Server Query

There are several ways to query a server.

* URL, using the Steam API: https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=$ip_addr
* **Note**: Replace $ip_addr with the public-facing IP of the game server.
* If successful the `servers:` list in the reply will not be empty.
* CLI: On the game server itself, attempt to send the A2S Challenge: `echo -n -e "\xff\xff\xff\xff\x54\x53\x6f\x75\x72\x63\x65\x20\x45\x6e\x67\x69\x6e\x65\x20\x51\x75\x65\x72\x79\x00" | nc -u 127.0.0.1 2457`
* If successful, a chunk of data will be returned on the command line,:

```
I$server_name$valheim
^C1.0.0.0 8@g=0.221.12,n=36,m=*
```

If run from a remote host, the steam game server could issue a challenge, which looks like several random characters in response. Otherwise, a failure looks like *nothing* happens.

## Network Setup

### IP

The game server, hosted on GCP, has a static, publicly routable IP. It's pingable from my home workstation as well as from another VM.

### Firewall

I've opened the following ports (ingress) from 0.0.0.0/0:

tcp:
2456-2458,
27015-27030,
27036-27037

udp:
2456-2458,
4380,
27000-27031,
27036

### Relevant log output

```shell
### Without Crossplay Enabled ###

$ ./vhserver dt

Distro Details
================================================================================================================
Date: Mon Mar 23 04:13:49 UTC 2026
Distro: Debian GNU/Linux 13 (trixie)
Arch: x86_64
Kernel: 6.12.73+deb13-cloud-amd64
Hostname: instance-20260322-040156
Environment: google
Uptime: 0d, 1h, 39m
tmux: 3.5a
glibc: 2.41

Server Resource
================================================================================================================
CPU
Model: AMD EPYC 7B13
Cores: 2
Frequency: 2449.998MHz
Avg Load: 0.14, 0.03, 0.01

Memory
Mem: total used free cached available
Physical: 7.8GB 1.3GB 6.4GB 866MB 6.4GB
Swap: 0B 0B 0B

Storage
Filesystem: /dev/sda1
Total: 9.7G
Used: 5.2G
Available: 4.0G

Network
IP: 0.0.0.0
Internet IP: 34.42.187.172

Valheim Resource Usage
================================================================================================================
CPU Used: 64.1%
Mem Used: 13.4% 1065MB

Storage
Total: 1.9G
Serverfiles: 1.7G

Valheim Server Details
================================================================================================================
Server name: $servername
App ID: 896660
Server IP: 0.0.0.0:2456
Internet IP: 34.42.187.172:2456
Server password: $passwd
Save interval: 1800s
Master server: not listed
Status: STARTED

vhserver Script Details
================================================================================================================
Script name: vhserver
LinuxGSM version: v25.2.0
glibc required: 2.15
IFTTT alert: off
Update on start: off
User: vhserver
Location: /home/vhserver

Backups
================================================================================================================
No Backups created

Command-line Parameters
================================================================================================================
./valheim_server.x86_64 -name $servername -password $passwd -port 2456 -world $worldname -public 1 -savedir '/home/vhserver/.config/unity3d/IronGate/Valheim' -saveinterval 1800 -backups 4 -backupshort 7200 -backuplong 43200 -instanceid 1

Ports
================================================================================================================
Change ports by editing the parameters in:
/home/vhserver/lgsm/config-lgsm/vhserver

Useful port diagnostic command:
ss -tuplwn | grep valheim_server.

DESCRIPTION PORT PROTOCOL LISTEN
Game 2456 udp 0
Query 2457 udp 1

Status: STARTED

core_exit.sh exiting with code: 0

$ ./vhserver qr

Valheim Developer Query Raw
=================================

IP Addresses Variables
=================================

IP: 0.0.0.0
HTTP IP: 10.128.0.4
Public IP: 35.208.212.176
Telnet IP: 10.128.0.4
Display IP:

Query IP Addresses
=================================

127.0.0.1
10.128.0.4
35.208.212.176

Game Server Ports
=================================
Port Name Port Number Status TCP UDP
Game: 2456 0
Query: 2457 1 UNCONN
API:
App:
BattleEye:
Beacon:
ReliableMessaging:
Client:
File:
HTTP:
HTTP Query:
Web Interface:
Game: Master:
RAW UDP Socket:
RCON:
Steam:
Steamworks P2P:
Steam: Auth:
Telnet:
Stats:
SourceTV:
UDP Link:
Voice:
Voice (Unused):

SS Output
=================================
Useful port diagnostic command:
ss -tuplwn | grep valheim_server.

udp UNCONN 0 0 0.0.0.0:2457 0.0.0.0:* users:(("valheim_server.",pid=37871,fd=36))
udp UNCONN 0 0 0.0.0.0:36565 0.0.0.0:* users:(("valheim_server.",pid=37871,fd=50))
udp UNCONN 0 0 *:47464 *:* users:(("valheim_server.",pid=37871,fd=35))
tcp LISTEN 0 128 127.0.0.1:39921 0.0.0.0:* users:(("valheim_server.",pid=37871,fd=32))

Query Port (2457) - Gamedig Output
=================================

PORT: 2456
QUERY PORT: 2457

Is My Game Server Online?
=================================
Game server status: https://ismygameserver.online//35.208.212.176:2457

Gamedig Raw Output
=================================

Failure! gamedig not installed

Query Port (2457) - gsquery Output
=================================

./query_gsquery.py -a "127.0.0.1" -p "2457" -e ""

usage: usage: python3 query_gsquery.py [options]
query_gsquery.py: error: argument -e/--engine: invalid choice: '' (choose from protocol-valve, protocol-quake2, protocol-quake3, protocol-gamespy1, protocol-unreal2, ut3, minecraft, minecraftbe, jc2m, mumbleping, soldat, teeworlds)
./query_gsquery.py -a "10.128.0.4" -p "2457" -e ""

usage: usage: python3 query_gsquery.py [options]
query_gsquery.py: error: argument -e/--engine: invalid choice: '' (choose from protocol-valve, protocol-quake2, protocol-quake3, protocol-gamespy1, protocol-unreal2, ut3, minecraft, minecraftbe, jc2m, mumbleping, soldat, teeworlds)
./query_gsquery.py -a "35.208.212.176" -p "2457" -e ""

usage: usage: python3 query_gsquery.py [options]
query_gsquery.py: error: argument -e/--engine: invalid choice: '' (choose from protocol-valve, protocol-quake2, protocol-quake3, protocol-gamespy1, protocol-unreal2, ut3, minecraft, minecraftbe, jc2m, mumbleping, soldat, teeworlds)

Query Port (2457) - TCP Output
=================================

bash -c 'exec 3<> /dev/tcp/'127.0.0.1'/'2457''

bash: connect: Connection refused
bash: line 1: /dev/tcp/127.0.0.1/2457: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'10.128.0.4'/'2457''

bash: connect: Connection refused
bash: line 1: /dev/tcp/10.128.0.4/2457: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'35.208.212.176'/'2457''

bash: connect: Connection refused
bash: line 1: /dev/tcp/35.208.212.176/2457: Connection refused

TCP query FAIL

Game Port (2456) - TCP Output
=================================

TCP Raw Output
=================================

bash -c 'exec 3<> /dev/tcp/'127.0.0.1'/'2456''

bash: connect: Connection refused
bash: line 1: /dev/tcp/127.0.0.1/2456: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'10.128.0.4'/'2456''

bash: connect: Connection refused
bash: line 1: /dev/tcp/10.128.0.4/2456: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'35.208.212.176'/'2456''

bash: connect: Connection refused
bash: line 1: /dev/tcp/35.208.212.176/2456: Connection refused

TCP query FAIL

Steam Master Server Response
=================================

curl -m 3 -s https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=35.208.212.176

Response: false

core_exit.sh exiting with code: 0

### With Crossplay Enabled ###

vhserver@instance-20260322-040156:~$ ./vhserver dt

Distro Details
================================================================================================================
Date: Mon Mar 23 04:59:58 UTC 2026
Distro: Debian GNU/Linux 13 (trixie)
Arch: x86_64
Kernel: 6.12.73+deb13-cloud-amd64
Hostname: instance-20260322-040156
Environment: google
Uptime: 0d, 2h, 25m
tmux: 3.5a
glibc: 2.41

Server Resource
================================================================================================================
CPU
Model: AMD EPYC 7B13
Cores: 2
Frequency: 2449.998MHz
Avg Load: 0.52, 0.17, 0.09

Memory
Mem: total used free cached available
Physical: 7.8GB 1.2GB 6.4GB 910MB 6.4GB
Swap: 0B 0B 0B

Storage
Filesystem: /dev/sda1
Total: 9.7G
Used: 5.3G
Available: 4.0G

Network
IP: 0.0.0.0
Internet IP: 35.208.212.176

Valheim Resource Usage
================================================================================================================
CPU Used: 65.3%
Mem Used: 11.6% 924MB

Storage
Total: 1.9G
Serverfiles: 1.7G

Valheim Server Details
================================================================================================================
Server name: $servername
App ID: 896660
Server IP: 0.0.0.0:2456
Internet IP: 35.208.212.176:2456
Server password: #passwd
Save interval: 1800s
Master server: not listed
Status: STARTED

vhserver Script Details
================================================================================================================
Script name: vhserver
LinuxGSM version: v25.2.0
glibc required: 2.15
IFTTT alert: off
Update on start: off
User: vhserver
Location: /home/vhserver

Backups
================================================================================================================
No Backups created

Command-line Parameters
================================================================================================================
./valheim_server.x86_64 -name $servername -password $passwd -port 2456 -world #worldname -public 1 -savedir '/home/vhserver/.config/unity3d/IronGate/Valheim' -saveinterval 1800 -backups 4 -backupshort 7200 -backuplong 43200 -crossplay -instanceid 1

Ports
================================================================================================================
Change ports by editing the parameters in:
/home/vhserver/lgsm/config-lgsm/vhserver

Useful port diagnostic command:
ss -tuplwn | grep valheim_server.

DESCRIPTION PORT PROTOCOL LISTEN
Game 2456 udp 0
Query 2457 udp 0

Status: STARTED

core_exit.sh exiting with code: 0

vhserver@instance-20260322-040156:~$ ./vhserver qr

Valheim Developer Query Raw
=================================

IP Addresses Variables
=================================

IP: 0.0.0.0
HTTP IP: 10.128.0.4
Public IP: 35.208.212.176
Telnet IP: 10.128.0.4
Display IP:

Query IP Addresses
=================================

127.0.0.1
10.128.0.4
35.208.212.176

Game Server Ports
=================================
Port Name Port Number Status TCP UDP
Game: 2456 0
Query: 2457 1 UNCONN
API:
App:
BattleEye:
Beacon:
ReliableMessaging:
Client:
File:
HTTP:
HTTP Query:
Web Interface:
Game: Master:
RAW UDP Socket:
RCON:
Steam:
Steamworks P2P:
Steam: Auth:
Telnet:
Stats:
SourceTV:
UDP Link:
Voice:
Voice (Unused):

SS Output
=================================
Useful port diagnostic command:
ss -tuplwn | grep valheim_server.

udp UNCONN 6400 0 0.0.0.0:2457 0.0.0.0:* users:(("valheim_server.",pid=40717,fd=46))
udp UNCONN 0 0 0.0.0.0:51794 0.0.0.0:* users:(("valheim_server.",pid=40717,fd=52))
udp UNCONN 0 0 *:35262 *:* users:(("valheim_server.",pid=40717,fd=45))
tcp LISTEN 0 128 127.0.0.1:34247 0.0.0.0:* users:(("valheim_server.",pid=40717,fd=33))

Query Port (2457) - Gamedig Output
=================================

PORT: 2456
QUERY PORT: 2457

Is My Game Server Online?
=================================
Game server status: https://ismygameserver.online//35.208.212.176:2457

Gamedig Raw Output
=================================

Failure! gamedig not installed

Query Port (2457) - gsquery Output
=================================

./query_gsquery.py -a "127.0.0.1" -p "2457" -e ""

usage: usage: python3 query_gsquery.py [options]
query_gsquery.py: error: argument -e/--engine: invalid choice: '' (choose from protocol-valve, protocol-quake2, protocol-quake3, protocol-gamespy1, protocol-unreal2, ut3, minecraft, minecraftbe, jc2m, mumbleping, soldat, teeworlds)
./query_gsquery.py -a "10.128.0.4" -p "2457" -e ""

usage: usage: python3 query_gsquery.py [options]
query_gsquery.py: error: argument -e/--engine: invalid choice: '' (choose from protocol-valve, protocol-quake2, protocol-quake3, protocol-gamespy1, protocol-unreal2, ut3, minecraft, minecraftbe, jc2m, mumbleping, soldat, teeworlds)
./query_gsquery.py -a "35.208.212.176" -p "2457" -e ""

usage: usage: python3 query_gsquery.py [options]
query_gsquery.py: error: argument -e/--engine: invalid choice: '' (choose from protocol-valve, protocol-quake2, protocol-quake3, protocol-gamespy1, protocol-unreal2, ut3, minecraft, minecraftbe, jc2m, mumbleping, soldat, teeworlds)

Query Port (2457) - TCP Output
=================================

bash -c 'exec 3<> /dev/tcp/'127.0.0.1'/'2457''

bash: connect: Connection refused
bash: line 1: /dev/tcp/127.0.0.1/2457: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'10.128.0.4'/'2457''

bash: connect: Connection refused
bash: line 1: /dev/tcp/10.128.0.4/2457: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'35.208.212.176'/'2457''

bash: connect: Connection refused
bash: line 1: /dev/tcp/35.208.212.176/2457: Connection refused

TCP query FAIL

Game Port (2456) - TCP Output
=================================

TCP Raw Output
=================================

bash -c 'exec 3<> /dev/tcp/'127.0.0.1'/'2456''

bash: connect: Connection refused
bash: line 1: /dev/tcp/127.0.0.1/2456: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'10.128.0.4'/'2456''

bash: connect: Connection refused
bash: line 1: /dev/tcp/10.128.0.4/2456: Connection refused

TCP query FAIL
bash -c 'exec 3<> /dev/tcp/'35.208.212.176'/'2456''

bash: connect: Connection refused
bash: line 1: /dev/tcp/35.208.212.176/2456: Connection refused

TCP query FAIL

Steam Master Server Response
=================================

curl -m 3 -s https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=35.208.212.176

Response: false

core_exit.sh exiting with code: 0
```

### Steps to reproduce

1. `./vhserver start`
2. `echo -n -e "\xff\xff\xff\xff\x54\x53\x6f\x75\x72\x63\x65\x20\x45\x6e\x67\x69\x6e\x65\x20\x51\x75\x65\x72\x79\x00" | nc -u 127.0.0.1 2457`

Contributor guide

Open the contributing guide

Research direction

No LinuxGSM file or test is identified in the report. Start by reproducing the comparison with ./vhserver start, the documented nc A2S query, and the ./vhserver dt and qr diagnostics with crossplay enabled and disabled. Done means identifying a LinuxGSM-side change, if one is supported, that restores the expected query behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
bash, linux
Domain
cli, devops
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.