Linux dedizierter Server
Diese Anleitung setzt Grundwissen im Umgang mit einer Unix Shell (Konsole) voraus.. |
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.
Inhaltsverzeichnis
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.
- Zuerst wird die SteamCMD-Datei runtergeladen:steamcmd_linux.tar.gz oder
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 Ihremorange 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.