Run IPv6 ioQuake3 server

Hi Quake Nation! I am currently trying to launch a ioQuake3 server on my IPv6-mostly VPS. I have a domain proxied to my VPS’s IPv6 address, but its not connecting to the ioQuake server. I also have a generic/ugly vps domain name on IPv4 where I succesfully can start a ioQuake3 sever. So we have a IPv4 connection but I want a IPv6 connection. I cant seam to find the reason why it wont start. I am trying to connect with ioQuake3 build found on for Linux.

This is how I start the server:

/bin/bash -c "./ioq3ded.x86_64 +set dedicated 2 +exec server.cfg" &

This is the outcome:

root@m138:~/linquake/ioQuakeForLinux# ioq3 1.36_GIT_4003a5b-2021-03-17 linux-x86_64 Apr  3 2021
SSE instruction set enabled
----- FS_Startup -----
We are looking in the current search path:
./baseq3/pak8.pk3 (9 files)
./baseq3/pak7.pk3 (4 files)
./baseq3/pak6.pk3 (64 files)
./baseq3/pak5.pk3 (7 files)
./baseq3/pak4.pk3 (272 files)
./baseq3/pak3.pk3 (4 files)
./baseq3/pak2.pk3 (148 files)
./baseq3/pak1.pk3 (26 files)
./baseq3/pak0.pk3 (3539 files)
4073 files in pk3 files
execing default.cfg
execing q3config_server.cfg
couldn't exec autoexec.cfg
Hunk_Clear: reset the hunk ok
--- Common Initialization Complete ---
IP6: ::1
IP6: 2a01:1f:1f:1f:1f:138
IP6: fe80::7c76:44ff:fe1d:43f%eth0
IP6: 2001:db8:abc1::1
IP6: fe80::42:b7ff:fe54:aa1b%docker0
IP6: fe80::1%docker0
IP6: fe80::b0a6:8fff:fe50:883e%veth660caa7
Opening IP6 socket: [::]:27960
execing server.cfg
------ Server Initialization ------
Server: q3dm6
Hunk_Clear: reset the hunk ok
----- FS_Startup -----
We are looking in the current search path:
./baseq3/pak8.pk3 (9 files)
./baseq3/pak7.pk3 (4 files)
./baseq3/pak6.pk3 (64 files)
./baseq3/pak5.pk3 (7 files)
./baseq3/pak4.pk3 (272 files)
./baseq3/pak3.pk3 (4 files)
./baseq3/pak2.pk3 (148 files)
./baseq3/pak1.pk3 (26 files)
./baseq3/pak0.pk3 (3539 files)
4073 files in pk3 files
Loading vm file vm/qagame.qvm...
File "vm/qagame.qvm" found at "./baseq3"
...which has vmMagic VM_MAGIC_VER2
Loading 896 jump table targets
VM file qagame compiled to 1274153 bytes of code
qagame loaded in 3308192 bytes on the hunk
------- Game Initialization -------
gamename: baseq3
gamedate: Apr  3 2021
InitGame: \sv_hostname\Shadow Void Decay\sv_minRate\0\sv_maxRate\0\sv_dlRate\100\sv_minPing\0\sv_maxPing\0\sv_floodProtect\1\dmflags\0\fraglimit\30\timelimit\20 /\sv_maxclients\8\g_maxGameClients\0\capturelimit\8\version\ioq3 1.36_GIT_4003a5b-2021-03-17 linux-x86_64 Apr  3 2021\com_gamename\Quake3Arena\com_protocol\71\g_gametype\0\mapname\q3dm6\sv_privateClients\0\sv_allowDownload\0\gamename\baseq3\g_needpass\0
0 teams with 0 entities
19 items registered
------- BotLib Initialization -------
loaded weapons.c
loaded items.c
loaded syn.c
loaded rnd.c
loaded match.c
loaded rchat.c
------------ Map Loading ------------
trying to load maps/q3dm6.aas
loaded maps/q3dm6.aas
found 53 level items
32 bots parsed
35 arenas parsed
AAS initialized.
net_ip6 will be changed upon restarting.
net_port6 will be changed upon restarting.
net_port will be changed upon restarting.
g_gametype will be changed upon restarting.
Resolving (IPv6)
Sys_StringToSockaddr: Error resolving No address associated with hostname has no IPv6 address.
Resolving (IPv6)
Sys_StringToSockaddr: Error resolving No address associated with hostname has no IPv6 address.

I then can printout and confirm, that UDP6 is listening for ioQuake’s PID:

root@m138:~/linquake/ioQuakeForLinux# netstat -plntu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0*               LISTEN      183/python3         
tcp        0      0 *               LISTEN      134/systemd-resolve 
tcp        0      0  *               LISTEN      2366/docker-proxy   
tcp        0      0    *               LISTEN      2384/docker-proxy   
tcp6       0      0 :::8080                 :::*                    LISTEN      2371/docker-proxy   
tcp6       0      0 :::80                   :::*                    LISTEN      2389/docker-proxy   
udp        0      0 *                           134/systemd-resolve 
udp6       0      0 :::27960                :::*                                3202/.              

And my server.cfg file looks like this:

seta g_allowVote "1"
seta g_filterBan "1"
seta g_banIPs ""
seta g_logsync "0"
seta g_log "games.log"
seta g_doWarmup "0"
seta g_warmup "10"
seta g_teamForceBalance "0"
seta g_teamAutoJoin "0"
seta g_friendlyFire "0"
seta capturelimit "8"
seta g_maxGameClients "0"
seta cm_playerCurveClip "1"
seta sv_maxclients "8"
seta timelimit "20"/
seta fraglimit "30"
seta dmflags "0"
seta sv_dlURL ""
seta com_hunkmegs "64"
seta sv_banFile "serverbans.dat"
seta sv_floodProtect "1"
seta sv_maxPing "0"
seta sv_minPing "0"
seta sv_dlRate "100"
seta sv_maxRate "0"
seta sv_minRate "0"
seta sv_hostname "Shadow Void Decay"
seta vm_ui "2"
seta vm_game "2"
seta vm_cgame "2"
seta com_introplayed "0"
seta com_busyWait "0"
seta com_maxfpsMinimized "0"
seta com_maxfpsUnfocused "0"
seta com_ansiColor "0"
seta com_blood "1"
seta com_maxfps "85"
seta com_altivec "0"
seta com_zoneMegs "24"
set d1 "map q3dm6 ; set nextmap vstr d2"
set d2 "map q3dm17 ; set nextmap vstr d3"
set d3 "map q3dm4 ; set nextmap vstr d4"
set d4 "map q3dm16 ; set nextmap vstr d5"
set d5 "map q3dm13 ; set nextmap vstr d1"
vstr d1
set net_enabled 2
set net_ip6 [2a01:1f:1f:1f:1f:138]
set net_port6 29760
set net_port 29760
set g_gametype 1

I tried bracketed and unbracketed set net_ip6 entry
The global ip address I am showing here is obscurred and I write it like this for this post: [2a01:1f:1f:1f:1f:138]

Does anyone have any clue to what else I can try? Right, one more thing. This is how I start a client:

./ioquake3.x86_64 +connect "[2a01:4f9:6a:5165::138]:27960"

I’m not sure what the issue is. It’s opening IPv6 and there is a map loaded.

I think a fresh config (rename /root/.q3a/baseq3/q3config_server.cfg) and running ./ioq3ded.x86_64 +set net_enabled 2 +map q3dm6 should be possible to join. You could also add “+set developer 1” to see if server says anything when client tries to join.

You could try printing the status of the Q3 server from the server itself and the client. My fetch-serverinfo bash script.

If printing the status works on the server but not the client it may be an network issue outside of the Q3 server (or misconfigured net_ipv6 cvar, but you log shows “::” which should work).

Instead of running the Q3 server in the background with ./ioq3ded & (which quits when you disconnect from ssh?), you could run it under screen instead. screen can be reconnected to later (for Q3 server console access) and continues running the program after disconnecting from ssh.

It’s recommended to create a user to run it as instead of running it as root so there is less system access if the Q3 server was exploited somehow. I don’t think this affects when it’s possible to join though.

server.cfg nitpicks:

seta timelimit "20"/ – Unneeded slash, probably doesn’t affect anything though.

Networking gets started before commands are run on the command-line (for example, +exec server.cfg), so the below cvars do not take affect. +set / +seta on command-line are run before networking init though. You could also change them to seta in server.cfg and start server twice to update the values and then use them (from /root/.q3a/baseq3/q3config_server.cfg).

set net_enabled 2
set net_ip6 [2a01:1f:1f:1f:1f:138]
set net_port6 29760
set net_port 29760

net_ip6 should be fine as default “::”. It only needs to be set if you don’t want to listen on all IPv6 interfaces (for example a VPS with multiple public IPv6 addresses that you want run separate Q3 servers all on port 27960). You try to set net_port6 to 29760 which is swapped from default 27960. Though from log it’s clear these are not used; “Opening IP6 socket: [::]:27960”.


Firts, thank you for a prompt replay. I was worried I might have to wait some time for one :smiling_face_with_three_hearts:
Second. I only now noticed, my ISP lends me only IPv4, so I cant really ping, nmap etc.(from home) using my VPS’s IPv6 address. But since my domain is proxied by Cloudflair to my VPSs IPv6 address, as I understand it, I should be able to translate incomming IPv4 connections using domainname:27960, to the IPv6 address.
I did the trick with enabling “+set developer 1”, but when I try to connect form home the server does not show any traffic.
Thank you for the “screen” advice. Works nicely. I didnt know that tool before.
Yes, once I get all right I’ll switch from root to some other user, good point.
I am yet to try your script, although it probably wont work, since my network has no IPv6 IP address.
I’ll try contacting my ISP to see, if it is maby only a matter of switching IPv6 on, on their side. Then, I’ll be able of doing more debuging, and will raport back. :+1:


My ISP is only doing IPv6 at the time, so a big downer on their side. Also apparently my free plan on cloudflare is not covering other apps than HTTP servers and so on(port 80). But this I’am not 100% sure. Anyways I decided to go with my ugly url, that I had available with IPv4 :slight_smile: