Linux dedizierter Server

From Team Fortress Wiki
Jump to: navigation, search

Dies ist eine Anleitung, die erklärt, wie man einen Team Fortress 2 Linux dedizierten Servers erstellt. Im folgenden Beispiel wird der Server im Heimatsverzeichnis des Users, in einem Ordner namens 'hlserver' erstellt.

Die Installation und Konfiguration des Linux dedizierten Servers ist für alle Distributionen gleich, jedoch gibt es kleine Unterschiede von Distribution zu Distribution, z.B. die Paket-Namen, Verzeichnisse o.ä. Es wird empfohlen, dass die benötigten Pakete vor der Installation des Servers überprüft werden.

Artikelnotation

Dieser Artikel wurde gemäß dem dokumentierten Linux Standard-Syntax geschrieben. Dies schließt ein:

  • Der Kommandopräfix # (Raute) weist darauf hin, dass dieses Kommando als Root ausgeführt werden muss. Fast alle Distributionen haben einen separaten Root-Account; für andere Distributionen wie z.B. Ubuntu, Linux Mint, Crunchbang, etc., stellt das Kommandopräfix sudo das Funktionsäquivalent dar, durch welches der folgende Befehl mit Root-Rechten ausgeführt wird.
  • Der Kommandopräfix $ (Dollarzeichen) weist darauf hin, dass dieses Kommando als normaler user ausgeführt werden muss.
  • ./ bedeutet "Aktuelles Arbeitsverzeichnis".

Voraussetzungen

Es gibt eine Reihe von Voraussetzungen um einen Team Fortress 2 Server unter Linux zu betreiben, diese sind:

  • Schreibzugriff auf das aktuelle Arbeitsverzeichnis
  • glibc >= 2.3.6
  • Ungefähr 4.49 GB freien Speicherplatz (für einen Standardserver ohne Customcontent wie zusätzliche Maps, Sounds, etc.)
  • Im Falle einer 64-bit Distribution wird das Package lib32gcc1 oder ia32-libs benötigt:

Auf 64-bit CentOS:

# yum install libgcc.i686 glibc.i686

Auf 64-bit Debian/Ubuntu/Linux Mint:

$ sudo apt-get install lib32gcc1 ia32-libs

Für x86_64 Arch Linux siehe hier(Englisch)

  • Wenn der Server auf CentOS installiert wird, muss dieses Kommando vorher benutzt werden: yum install ncompress
  • Wenn der Server auf FreeBSD (das nicht Linux ist) installiert wird, muss die Linux-Kompatibilität im Kernel eingeschaltet werden, sowie ein Basis-System via der Portsammlung installiert werden. Genauere Anweisungen sind hier(Englisch) zu finden.

Download und Installation des SteamCMD Tools

Es wird empfohlen, dass ein separater User (z.B. "Gameserver") angelegt wird, um den Server zu installieren und zu betreiben.

wget http://media.steampowered.com/client/steamcmd_linux.tar.gz
  • Verwenden SIe tar um die Datei in einen Ordner zu entkomprimieren, z.B. './hlserver' :
tar zxf steamcmd_linux.tar.gz

Ein SteamCMD Startscript erstellen

  • Erstellen Sie eine Datei namens tf2_ds.txt im Ordner wo SteamCMD installiert wird, z.B. './hlserver'
  • Bearbeiten Sie die Datei mit einem Texteditor und fügen Sie diesen Text ein:
@ShutdownOnFailedCommand 1
@NoPromptForPassword 1
login anonymous
force_install_dir ./tf2
app_update 232250
quit

Wenn Sie die Beta Version von Team Fortress 2 auf dem Server spielen wollen, fügen Sie dies vor die app_update Zeile:

beta prerelease

Ein Updatescript erstellen

  • Erstellen Sie eine Datei namens update.sh im Ordner wo SteamCDM installiert wird, z.B. './hlserver'
  • Bearbeiten Sie die Datei mit einem Texteditor und fügen Sie diesen Text ein:
#!/bin/sh
./steamcmd.sh +runscript tf2_ds.txt

Den Download starten

  • Führen Sie ./update.sh aus, um den Download zu starten. Dies kann mehrere Minuten bis zu Stunden dauern, je nach Geschwindigkeit der Internetverbindung, da der Inhalt des Servers 4.4 GB beträgt.
  • Wenn unerwarteterweise der Zugriff nicht gewährt wird, müssen Sie dieses Kommando ausführen:
chmod +x update.sh
  • Unter Umständen müssen Sie die Datei mehrmals ausführen, bis die Nachricht "Success! App '232250' fully installed." erscheint.

Serverdateien erstellen/anpassen

  • Erstellen Sie eine Datei namens server.cfg im Verzeichnis '~/hlserver/tf2/tf/cfg'
  • Bearbeiten Sie die Datei mit einem Texteditor und fügen Sie diesen Text ein:
hostname "Ihr_Server_Name"
rcon_password "Ihr_RCON_Passwort"
sv_contact "name@ihredomain.tdl"
mp_timelimit "30" 
  • Die Dateien motd.txt, maplist.txt and mapcycle.txt befinden sich alle im Verzeichnis '~/hlserver/tf2/tf'. modt.txt ist die Datei, deren Inhalt als MODT ("Message of the Day", Nachricht des Tages) beim Betreten des Servers angezeigt wird. maplist.txt ist eine Liste aller Maps, mapcycle.txt bestimmt die Maprotation.

Ein Shellscript erstellen

  • Erstellen Sie eine Datei namens tf.sh im Verzeichnis './hlserver/'
  • Bearbeiten Sie die Datei mit einem Texteditor und fügen Sie diesen Text ein:
#!/bin/sh
tf2/srcds_run -game tf +sv_pure 1 +map ctf_2fort +maxplayers 24

Die Werte +map und +maxplayers können angepasst werden. +map ist der Name der Map, mit der der Server startet, +maxplayers ist die Anzahl verfügbarer Slots.

  • Führen Sie die Datei tf.sh aus, um den Server zu starten.

Andere Kommandos

Hier einige andere, häufig benutzte Kommandos für den Team Fortress Linux dedizierter Server:

  • +ip 1.2.3.4 - Den Server an eine spezifische IP binden. Normalerweise hört er auf alle Netzwerkschnittstellen.
  • -port 27015 - Den Server an einen spezifischen Port binden, standartmässig wird der Port 27015 verwendet.
  • -strictportbind - Wenn der Server schon auf einem spezifischen Port läuft, kann damit der Server angehalten werden.
  • +randommap - Verwenden Sie dieses Kommando anstelle von +map, um eine zufällige Map auszuwählen.
  • +serverconfigfile - Hier können Sie ändern, welche Konfigurationsdatei innerhalb von tf/cfg/ bei einem Mapwechsel ausgeführt werden soll, standartmässig st dies die Datei server.cfg
  • +mapcyclefile - Hier können Sie ändern, welche Konfigurationsdatei innerhalb von tf/cfg/ den Mapcycle enthält, standartmässig ist dies die Datei mapcycle.txt. Kann auch gebraucht werden, um Dateien innerhalb von tf/ auszuwählen.
  • -replay - Führt replay.cfg aus und fügt einen zusätlichen Bot als Replay-Bot hinzu, aber es verringert die Slotanzahl um 1.
  • -autoupdate - Versucht den Server automatisch zu updaten, sollte ein Update erscheinen. Sie MÜSSEN -steam_dir und -steamcmd_script dafür benutzen.
  • -steam_dir ~/hl1server/ - Ort der SteamCMD Datei. Wird von -autoupdate benötigt.
  • -steamcmd_script ~/hl1server/tf2_ds.txt - Das SteamCMD Script, um den Server zu updaten. Wird von -autoupdate benötigt.
  • +sv_shutdown_timeout_minutes 360 - Wenn der Server automatisch geupdatet wurde, nach wie vielen Minuten soll der Server neu gestartet werden. Standartmässig sind es 360 Minuten (6 Stunden).

Screen

Viele Server Administratoren betreiben ihren Server mit Screen (Englisch), da damit einfach zwischen der Server-Konsole und der Shell hin- und hergewechselt werden kann. Des weiteren kann man damit die SSH Session beenden, ohne den Server zu stoppen. Screen kann via des Paketmanagers Ihrer Distribution installiert werden, z.B. auf Debian:

#apt-get install screen

Nach der Installation von Screen kann mit folgendem Kommando der Server gestartet werden:

$ screen -m -S tf2 ./srcds_run Parameter

wobei Parameter die normalen srcds_run Parameter sind. Sie können Ctrl+A+D verwenden, um die Konsole zu minimieren, und screen -r tf2 um die Konsole wieder zu öffnen. Ctrl+D beendet die Session und stoppt den Server, jedoch sollte zuerst das killserver Kommando verwenden, um den Server zu beenden. Mit Ctrl+A+[ können Sie durch die Konsole scrollen. Lesen Sie die Anleitung (Englisch) zu Screen durch, um mehr Informationen zu erhalten.

Automatischer Serverstart nach Servercrash

Nach einem unerwarteten Crash des ganzen Servers, z.B. nach einem Stromausfall, kann es nützlich sein, den Team Fortress Linux Desizierten Server automatisch aufstarten zu lassen. Das folgende Debian LSB init Script kann verwendet weden, um den Server automatisch starten zu lassen. Hierbei wird Screen verwendet. Das Script wird tf2-server genannt und in den Ordner /etc/init.d gelegt. Nachdem dies geschehen ist, sollte folgendes Kommando ausgeführt werden:

$ update-rc.d tf2-server defaults

Dies sollte einen reibungslosen Start des Servers nach jedem Neustart ermöglichen. Folgend, der Inhalt des Scripts:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          tf2server
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Team Fortress 2 server
# Description:       Starts a Team Fortress 2 server
### END INIT INFO

NAME="Team Fortress 2"
USER="tf2server"
SCREENREF="tf2"
BINARYPATH="/home/tf2server/hlserver/tf2"
BINARYNAME="srcds_run"
PIDFILE="tf2server.pid"

OPTS="-game tf +sv_pure 1 +maxplayers 32 +ip 0.0.0.0 +map mvm_decoy -autoupdate -steam_dir /home/tf2server/hlserver/ -steamcmd_script /home/tf2server/hlserver/tf2_ds.txt +sv_shutdown_timeout_minutes 5"

cd "$BINARYPATH"

running() {
    if [ -n "`pgrep -f $BINARYNAME`" ]; then
        return 0
    else
        return 1
    fi
}

start() {
    if ! running; then
        echo -n "Starting the $NAME server... "
        start-stop-daemon --start --chuid $USER --user $USER --chdir $BINARYPATH --exec "/usr/bin/screen" -- -dmS $SCREENREF $BINARYPATH/$BINARYNAME $OPTS
        pgrep -f $BINARYNAME > $PIDFILE
        if [ -s $PIDFILE ]; then
            echo "Done"
        else
            echo "Failed"
            rm $PIDFILE
        fi
    else
        echo "The $NAME server is already started."
    fi
}

stop() {
    if running; then
        echo -n "Stopping the $NAME server... "
        kill `cat $PIDFILE`
        while running; do
            sleep 1
        done
        rm $PIDFILE
        echo "Done"
    else
        echo "The $NAME server is already stopped."
    fi
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
	stop
        start
    ;;
    status)
        if running; then
            echo "The $NAME server is started."
        else
            echo "The $NAME server is stopped."
        fi
    ;;
    *)
        echo "Usage: $0 (start|stop|restart|status)"
        exit 1
esac
exit 0

iptables Regeln

-A INPUT -i venet0 -p tcp -m tcp --dport 27015 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p tcp -m tcp --dport 27005 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p udp -m udp --dport 27015 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p udp -m udp --dport 27005 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p tcp -m tcp --dport 27016 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p tcp -m tcp --dport 27017 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p tcp -m tcp --dport 27018 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p tcp -m tcp --dport 27019 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p tcp -m tcp --dport 27020 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p udp -m udp --dport 27016 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p udp -m udp --dport 27017 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p udp -m udp --dport 27018 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p udp -m udp --dport 27019 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i venet0 -p udp -m udp --dport 27020 -m state --state NEW,ESTABLISHED -j ACCEPT
  • Hinweis: Kann gekürzt werden, sofern die multiports Erweiterung installiert sein sollte.

CentOS 6.4 (Minimale Installation)

Bei CentOS 6.4 beinhaltet die standartmässige iptables Regel eine Abweis-Linie, die den gesamten Traffic abweist, wenn die oben genannten Regeln angewendet werden. Um dies zu beheben, sollten Sie zuerst herausfinden, welche Ports benutzt werden:

netstat -lnptu

Danach sollte etwas wie folgendes stehen:

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:27015               0.0.0.0:*                   LISTEN      1393/./srcds_linux  
tcp        0      0 :::22                       :::*                        LISTEN      -                   
tcp        0      0 ::1:25                      :::*                        LISTEN      -                   
udp        0      0 0.0.0.0:27020               0.0.0.0:*                               1393/./srcds_linux  
udp        0      0 0.0.0.0:26901               0.0.0.0:*                               1393/./srcds_linux  
udp        0      0 0.0.0.0:68                  0.0.0.0:*                               -                   
udp        0      0 0.0.0.0:27005               0.0.0.0:*                               1393/./srcds_linux  
udp        0      0 0.0.0.0:27015               0.0.0.0:*                               1393/./srcds_linux

Die Ports die mit der Beschreibung ./srcds_linux gelistet werden, werden vom Team Fortress 2 Server benutzt. In diesem Fall, Port 27015 benutzt TCP, und die Ports 26901, 27005, 27015 und 27020 benutzen UDP. Diese Ports müssen zu den iptables Regeln hinzugefügt werden, so dass die Firewall diese Ports nicht gegen eingehenden Traffic abblockt. Um diese Ports zu den Regeln hinzuzufügen, sollten Sie zuerst rausfinden, was im Moment in der iptables Konfigurationsdatei ist. Die beste Idee ist, Ihren Account zur Sudo Gruppe hinzuzufügen, so dass sie zeitbeschränkten Zugriff auf die Datei haben. Sie können aber auch su verwenden, um sich als root Benutzer einzuloggen.

sudo iptables -nL --line-numbers

Danach sollte etwas ähnliches wie folgendes erscheinen:

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination  

Hier werden Sie bemerken, dass in Linie 5 "REJECT all..." steht, d.h. dass Ihr Server jegliche Kommunikation abblockt. Wenn Sie sich dafür entscheiden, die neuen Regeln zu der iptables Konfigurationsdatein hinzuzufügen, wird dies immer noch nicht funktionieren, da die Regeln in der Reihenfolge, in der sie gelistet sind, ausgeführt werden. Um dies zu beheben, müssen Sie folgende Kommandos, als root Benutzer oder mit sudo, ausführen:

sudo iptables -I INPUT 5 -p tcp --dport 27015 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 6 -p udp --dport 27015 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 7 -p udp --dport 27005 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 8 -p udp --dport 27020 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 9 -p udp --dport 26901 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo service iptables save
sudo service iptables restart

Dies wird die neuen Regeln über die abweisende Regel hinzufügen. Wenn Sie sich die Kommandos anschauen, werden Sie bemerken, dass es eine Sektion gibt, in der "-I INPUT 5,6,7,8,9." steht. Dies bestimmt, welche Regelnummer für diesen Eintrag verwendet wird. Jedes Mal, wenn Sie eine neue Regel hinzufügen, wird die ablehnende Regel um eins nach untern versetzt, so müssen Sie jedes Mal die Regelnummer um eins erhöhen. Wenn Sie trotzdem immer nur "-I INPUT 5" eingeben, wird dies auch funktionieren, doch die Konfigurationsdatei wird unübersichtlicher. Am Ende sollte die iptables Konfigurationsdatei wie folgend aussehen:

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:27015 state NEW,ESTABLISHED 
6    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:27015 state NEW,ESTABLISHED 
7    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:27005 state NEW,ESTABLISHED 
8    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:27020 state NEW,ESTABLISHED 
9    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:26901 state NEW,ESTABLISHED 
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination 

Dies sollte Ihre Firewall-Probleme beheben.

Fehlerbeseitigung

Mein Server erscheint nicht im LAN Tab des Server Browsers meines Clients.
Ich kann mein Ausrüstungsmenü nicht erreichen wenn ich auf diesem Server spiele.
Sind Sie immer noch in der Lage, den Server mittels connect <ip-address>(Englisch) in der Entwicklerkonsole(Englisch) zu betreten?
Wird während dem Start des Servers folgendes in der Server Konsole angezeigt?
*	Unable to load Steam support library.*
*	This server will operate in LAN mode only.*
Wenn Sie sich mit dem Server verbinden, wird da folgendes angezeigt?
NULL ISteamGameServer in ConnectClient. Steam authentication may fail.
…
Cannot verify load for invalid steam ID […]
Wenn dies der Fall ist so müssen Sie sicherstellen, dass sich eine Datei namens steam_app.txt, die die Nummer 440 enthält, in Ihrem orange box Ordner befindet.
Mein Server wird nicht automatisch geupdatet beim Start.
Wird folgendes angezeigt, wenn der Server gestartet wird?
ERROR: -autoupdate requires -steam_dir and -steamcmd_script.
WARNING: Failed to locate steam binary.
WARNING: Could not locate steam binary:, ignoring.
Wenn dies der Fall ist, müssen Sie srcds_run mittels -steam_dir und -steamcmd_script mitteilen, wo Ihr SteamCMD Ordner und Script liegt.
Mein Server bleibt bei 0/0 während eines Updates stehen.
Wird folgendes während eines Updates angezeigt?
force_install_dir /home/ihr/server/verzeichnis
app_update 232250 validate
Initial App state (0x4) installed
App state (0x4) installed, progress: 0.00 (0 / 0)
Success! App '232250' already up to date.
Wenn dies der Fall ist, entfernen Sie den "validate" Parameter aus dem Updatekommando.

Siehe auch