You are not logged in.

Dear visitor, welcome to sourceserver.info. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Bubelbub

Beginner

  • "Bubelbub" started this thread

Posts: 19

Location: Niedersachsen

Occupation: Web-Entwickler

wcf.user.option.userOption53: Ja

  • Send private message

1

Saturday, May 4th 2013, 10:44pm

[Linux (Debian/Ubuntu)] Sicherer Fastdownload Server in wenigen Minuten

Hallöchen liebe Leserinnen und Leser,

nach meinem ersten Tutorial habe ich mich nun dazu entschlossen, euch zu zeigen, wie ihr schnell und einfach einen sicheren Fastdownload (FastDL) Server erstellen könnt.

Schnell im Sinne von:

- Ihr habt die Anleitung schnell durch
- Downloads sind schneller da BZIP2

Und Sicher im Sinne von:
- Garantierter Map-Download (Ihr müsst nichts irgendwo uploaden)
- FastDL NUR für EUREN, definierten Server (Kein Fremdzugriff)

Ihr nutzt noch keinen Nginx Server?
Und auch keinen Apache Server?
Sprich Port 80 ist frei? (shell: lsof -i :80)

Dann geht's jetzt los :bestteam:

Schritt 1.) (root)
Installation von gebrauchten Paketen.

Source code

1
apt-get install bzip2 nginx

Ubuntu Tipp: sudo apt-get ....

Schritt 2.) (root)
Nun stellen wir den Server ein, sodass er alles richtig weiterleitet zum richtigen Ordner.

Source code

1
cd /etc/nginx/sites-available && vi default


Die Datei sollte zum Schluss so aussehen...

Spoiler Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {

	listen   80; ## IPv4 anschalten
	listen   [::]:80 default ipv6only=on; ## IPv6 anschalten

	server_name {eure server ip}; ## beispiel: server_name 127.0.0.1; ######################################

	access_log  /var/log/nginx/fastdl.access.log;

	location /cstrike/maps {
		alias	"{euer maps verzeichnis}"; ## beispiel: alias "/home/gameserver/Steam/SteamApps/common/Counter-Strike Source Dedicated Server/cstrike/maps"; #################################
		if ($http_referer != "hl2://{eure game server ip}:{euer game server port}") ## beispiel: if ($http_referer != "hl2://127.0.0.1:27015") ###################################################
		{
			return 403;
		}
		if ($http_user_agent != "Half-Life 2")
		{
			return 403;
		}
		autoindex off;
	}

	location / {
		root   /var/www;
		index  index.html index.htm;
	}
}


Schritt 3.) (root)
Nginx ist fertig und darf die Einstellungen nun laden.

Source code

1
service nginx reload


Schritt 4.) (root)

Man könnte jetzt schon den Fastdl nutzen!
Wir wollen jetzt noch die Maps als bz2 packen, sodass uns das Vorhaben auch etwas bringt.
Also ab zum user mit dem wir unseren Server auch immer starten. (Mein o.g. Beispiel wäre gameserver)

Source code

1
su gameserver -s /bin/bash


Schritt 5.) (gameserver)
Ab in den Spiel-Ordner, der in der "default"-Datei als "alias" markiert wurde.
Sprich, in meinem Beispiel wieder: /home/gameserver/Steam/SteamApps/common/Counter-Strike Source Dedicated Server/cstrike/maps

Source code

1
cd "/home/gameserver/Steam/SteamApps/common/Counter-Strike Source Dedicated Server/cstrike/maps"


Schritt 6.) (gameserver)
Jetzt lassen wir absolut den ganzen Ordner als .bz2 packen.
=> Den Befehl kann man immer ausführen, wenn eine neue Map eingefügt wurde :!: (Fehler ignorieren)

Source code

1
bzip2 -9kf *

Für das spätere automatisieren von dem ganzen könntet ihr folgendes Script nutzen.

Spoiler Spoiler

Source code

1
2
3
4
5
6
7
8
#!/bin/bash
OIFS="$IFS" # fuer spezielle dateinamen
IFS=$'\n' # fuer spezielle dateinamen
for i in $(find ./cstrike -type f -iname *.bsp -o -iname *.res -o -iname *.nav -o -iname *.mp3 -o -iname *.wav -o -iname *.vmt -o -iname *.vtf); do
	if [ ! -f "${i}.bz2" ]; then
		bzip2 -9k "$i"
	fi
done


Passt noch euren cstrike Ordner an. Solltet ihr TF2 o.ä. nutzen wollen. (Zeile 4)


Schritt 6.1.) (gameserver) (Info)
Euer Maps Ordner sollte danach so aussehen...

Bzw. per

Source code

1
ls

Source code

1
cs_assault.bsp	cs_assault.bsp.bz2
und so weiter....

Schritt 7.) (gameserver)
Jetzt fehlt nur noch der Eintrag in unserer Server-Konfiguration.

Source code

1
../cfg/server.cfg

Dort fügt ihr nun die folgende Zeile an das Ende an bzw. ersetzt eine bereits vorhandene.
Notfalls einfach ans Ende einfügen :)

Source code

1
sv_downloadurl "http://{eure server ip}/cstrike"

=> Bitte beachtet, dass das cstrike in dem Moment nichts aussagt! Ändert ihr es in z.B. tf2, müsst ihr es oben in der "default"-Datei auch anpassen.

So, wie gefällt euch mein zweites Tutorial?

Kritik, Meinungen, Wünsche, etc. bitte posten.
Ggf. folgt dann noch ein Tutorial für weitere Plugins 8)

Bei Fehlern bitte alles beschreiben und zusätzlich die /var/log/nginx/error.log Datei anfügen oder posten.

This post has been edited 2 times, last edit by "Bubelbub" (May 11th 2013, 12:10pm) with the following reason: 11.05.13 - Script für automatisiertes BZIPPEN eingefügt.


LeXx

Unregistered

2

Saturday, May 4th 2013, 11:01pm

Der Ordner wo die Maps etc. drin sind muss nicht cstrike heißen, denn kann man so nennen wie man will.

@Für die ohne Root/vServer:

Damit keiner euern FastDL mit benutzt solltet ihr das Fake sv_downloadurl to players Plugin nutzen, das zeigt den Usern einfach ein andern Link an, diesen Link kann man in einer Cvar festlegen.

Lg
LeXx

Bubelbub

Beginner

  • "Bubelbub" started this thread

Posts: 19

Location: Niedersachsen

Occupation: Web-Entwickler

wcf.user.option.userOption53: Ja

  • Send private message

3

Sunday, May 5th 2013, 12:05am

Der Ordner wo die Maps etc. drin sind muss nicht cstrike heißen, denn kann man so nennen wie man will.

Genau.
Man könnte es in dem Sinne auch weglassen.
Kommt eben auf die Konfiguration an.
Ich denke weiter an zukünftige Tutorials, die ggf. auch models o.ä. mit einbeziehen oder eben auf andere Seiten verlaufen.

Damit keiner euern FastDL mit benutzt solltet ihr das Fake sv_downloadurl to players Plugin nutzen, das zeigt den Usern einfach ein andern Link an, diesen Link kann man in einer Cvar festlegen.

Ich schreibe oben Sicher...

nginx fragt extra ab, ob der passende Source Server auf den Space zugreift oder eben ein Fremdserver.
Sprich: Nur die eigenen Spieler kommen drauf, andere werden abgeblockt.
So übrigens auch alle lokalen Zugriffe o.ä.
=> Testen schwer ;)

Hauwech

Unregistered

4

Sunday, May 5th 2013, 12:35am

Moin,
nette Anleitung. Ich würde den Zugriff auf den Webserver über iptables lösen um diesen nerst gar nicht mit der Anfrage zu belasten.
Ansonsten sollte ein "allow 127.0.0.1;" ebenfalls das Ziel erreichen oder? Ich stell mir die Abfrage bei >5 Gameserver unübersichtlich vor. Somit eine Zeile und gut ist.

Source code

1
2
listen   80; ## IPv4 anschalten
listen   [::]:80 default ipv6only=on; ## IPv6 anschalten


Eigentlich sollte die Zeile so ausreichen:

Source code

1
listen   [::]:80;


Welche Ubuntu- und ngixversion setzt du ein?

LeXx

Unregistered

5

Sunday, May 5th 2013, 1:24am

Das ganze geht auch via Apache2 allerdings sieht es dann mit dem absichern bzw. einstellen anders aus. Wenn ich mal Zeit habe werde ich auch mal eine Anleitung für einen Apache2 Webserver machen.

Lg
LeXx

Hauwech

Unregistered

6

Sunday, May 5th 2013, 1:29am

Ich denke, er hat sich dabei etwas gedacht. Der Apache ist was die Ressourcen angeht sehr hungrig und zu mächtig für einen Fastdownload-Server. Nginx ist schneller, kleiner und performanter als ein Apache. Das sieht man ganz gut an den Benchmarktests. Was würde in diesem Fall für Apache sprechen?

LeXx

Unregistered

7

Sunday, May 5th 2013, 1:34am

Ich mag Apache2 mehr nutze es seit Jahren, klar ist Nginx kleiner schneller etc. ich jedoch finde den Apache2 besser. Und ich denke im Forum gibt es bestimmt noch andere die auch diese Meinung haben :melo:

Lg
LeXx

Lacrimosa99

Intermediate

Posts: 275

Location: Leipzig

Occupation: IT-Systemintegrator

wcf.user.option.userOption53: Ja

  • Send private message

8

Sunday, May 5th 2013, 1:36am

noch System schonender würd ich zu Lighttpd tendieren... noch schlanker als NGinx und System schonender was die Prozesse angeht.. einzigst und allein, hatt Lighttpd keinen Proxy onboard ;)




Bara

Professional

Posts: 834

wcf.user.option.userOption53: Ja

  • Send private message

9

Sunday, May 5th 2013, 1:40am


Infr@red

Intermediate

Posts: 378

Occupation: Management

wcf.user.option.userOption53: Ja

  • Send private message

10

Sunday, May 5th 2013, 2:40am

Damit hab ich mich kürzlich auch befasst und aufgrund der regelmäßigen Updates hatte ich mich damals für Nginx entschieden, denn die Updatepolitik von Lighttpd ist eher dürftig und thttpd ist aus der Steinzeit, die letzte Stable ist von 2003, wenn dann würde ich den Fork einsetzen, der nennt sich sthttpd. Da ich an Nginx aber die einfache und schnelle Konfiguration mag, war es für mich damals die erste Wahl.

Und den Apache2 als reinen Downloadserver einzusetzen ist doch wie mit Kanonen auf Spatzen zu schießen 8)

Impact

Super Moderator

Posts: 1,276

wcf.user.option.userOption53: Nein

  • Send private message

11

Sunday, May 5th 2013, 3:13am

@Bubelbub
Der Ansatz ist gut, allerdings fehlen einige Details (zB was die Werte in der Nginx Config machen, warum ich IPv6 anschalten sollte etc).
Ich würde den docroot central irgendwo außerhalb eines Gameserver anlegen und dann symlinks für jeden Gameserver benutzen.
Zum komprimieren der Maps wäre etwas wie (Code ist ungetestet und nur ein Beispiel)

Source code

1
2
3
4
5
for i in $(ls *.bsp); do
	if [ ! -f ${i}.bz2 ]; then
		bzip2 -9k "$i"
	fi
done

Besser geeignet.
Der Port des Webserver sollte irrelevant sein, ich weiß auch nicht wozu ein FastDL Server Ipv6 brauchen sollte.

@Hauwech
Man kann Dienste wie Nginx auch lokal binden, eine Regel benötigt man dann nicht mehr (Mach für einen FastDL wie hier aber keinen Sinn).

MfG
Impact

This post has been edited 3 times, last edit by "Impact" (May 5th 2013, 4:01pm)


Hauwech

Unregistered

12

Sunday, May 5th 2013, 10:55am

@Impact
Localhost war nur ein Beispiel. :-) Wenn alle Gameserver auf dem gleichen Host laufen ist das am EInfachsten - hast du Recht. Jedoch soll es vorkommen, dass der FastDL ein kl. vServer ist auf den >5 Gameserver zugreifen.

Bubelbub

Beginner

  • "Bubelbub" started this thread

Posts: 19

Location: Niedersachsen

Occupation: Web-Entwickler

wcf.user.option.userOption53: Ja

  • Send private message

13

Sunday, May 5th 2013, 12:59pm

Ich würde den Zugriff auf den Webserver über iptables lösen um diesen nerst gar nicht mit der Anfrage zu belasten.

Ansonsten sollte ein "allow 127.0.0.1;"
Ist eben nicht das selbe.
Die Anfragen kommen nämlich nicht vom CS: S Server sondern vom Client.
Was bringt das sonst auch, wenn der CS: S Server sich die Datei downloaden muss um sie dem Client zu schicken!?
Das ganze geht auch via Apache2 allerdings sieht es dann mit dem absichern bzw. einstellen anders aus.
Ja wurde schon erklärt.
Apache2 = Unnötig für so etwas.

Nginx ist einfach schnell etc. und bietet die nötigen Sicherheiten, sage ich mal. (Siehe unten wegen thttpd)
Was würde in diesem Fall für Apache sprechen?
Eben... Nichts...
http://www.ulrich-block.de/klein-schnell-effizient/
Wegen thttpd:
Da wusste ich jetzt nicht ob dieser auch die Sicherheitseinstellungen hätte.
Sprich ob der Referer und der User-Agent stimmt...

Ich denke aber eher nicht, deshalb Nginx.
zB was die Werte in der Nginx Config machen, warum ich IPv6 anschalten sollte etc
Ist erklärt, zumindest was die Werte machen.

IPv6 muss man nicht aktivieren...
Nur wieso sollte man es dann direkt deaktivieren?
Man kann der Technik doch folgen... Ich z.B. habe alle Roots auf IPv6 freigeschaltet. Sprich da könnten die CS: S Server auch per IPv6 laden, wenn CS: S das mal können sollte :P
Ich würde den docroot central irgendwo außerhalb eines Gameserver anlegen und dann symlinks für jeden Gameserver benutzen.
Kannst du gerne machen.
Für dein Vorhaben würde ich aber eher folgendes machen:

1.) Globales Map-Verzeichnis anlegen
2.) In jedem Gameserver einen Symlink von "cstrike/maps" (o.ä.) zu "/global/maps" anlegen.
3.) Nginx Location "alias" auf /global/maps verweisen.

Dann nutzen absolut alle Gameserver das selbe Map-Verzeichnis.
Wenn man mehrere getrennt möchte (sprich Jail Maps, CS Maps, AIM, etc.), dann ist das natürlich sinnlos.
Dann wäre das "einfache" Symlinken aber auch wieder sinnlos, weil du dann sagen müsstest:
sv_downloadurl "http://.../server1"
Zum komprimieren der Maps wäre etwas wie
Ja schön und gut.
Ich möchte es Anwender freundlich bzw. Anfänger-Freundlich halten.
Sprich du packst einfach alle Dateien in dem Ordner als bz2 und fertig.
Er ignoriert die bereits bz2 Dateien ja automatisch (mit Fehlern).

So kannst du die Maps immer aktuell gepackt halten ohne Script.
Der Port des Webserver sollte irrelevant sein, ich weiß auch nicht wozu ein FastDL Server Ipv6 brauchen sollte.
Ja klar.
Ich hab mein Nginx auch auf nem anderen Port laufen...
Nur müsste ich dann wiederum erklären wo man den Port überall eintragen muss.

Und wie gesagt, IPv6 ist in dem Fall egal.
Obs aktiviert ist oder nicht, was solls...
Jedoch soll es vorkommen, dass der FastDL ein kl. vServer ist auf den >5 Gameserver zugreifen.
Ist bei mir auch tatsächlich der Fall.
Wobei ich nur 2 Gameserver nutze.

In dem Fall erweitert man das ganze einfach um eine weitere Location.
Die kann man ja anstatt "cstrike" dann "server1" und "server2" nennen.
Oder wie auch gesagt: einfach weglassen, Symlink von den Maps Ordnern auf nen Globalen Ordner.

Wenn die Gameserver alle die selbe ip haben und nur im Port Unterschiede aufweisen, kann man auch einen kleinen Regex rein packen der nur abfragt ob der anfang des Referers so einer wäre... "hl2://ip:".

MadMakz

Super Moderator

Posts: 1,878

Location: ~#

wcf.user.option.userOption53: Ja

  • Send private message

14

Sunday, May 5th 2013, 3:31pm

mh, IPv6 ist garnicht mal so "dumm" als optionale einstellung.

Die Telekom stellt schon seit längerer zeit, vor allem bei IP kunden, dual-stack anschlüsse (ipv6 und v4 nativ).

Je nachdem wie der Sourceclient domain-adressen behandelt und über das betriebsystem auflösen lässt, was sehr wahrscheinlich ist, kann es durchaus gut sein das auch über ipv6 geladen wird wenn der domain-record denn auch eine ipv6 beinhaltet.

Mit etwas glück kann ich das demnächst mal testen weil ein IP-anschluss bei mir in-der-mache ist. weiß aber nicht ob es dual-stack sein wird.

Bubelbub

Beginner

  • "Bubelbub" started this thread

Posts: 19

Location: Niedersachsen

Occupation: Web-Entwickler

wcf.user.option.userOption53: Ja

  • Send private message

15

Saturday, May 11th 2013, 12:12pm

Zum komprimieren der Maps wäre etwas wie (Code ist ungetestet und nur ein Beispiel)

Source code

1
2
3
4
5
for i in $(ls *.bsp); do
	if [ ! -f ${i}.bz2 ]; then
bzip2 -9k "$i"
	fi
done
Besser geeignet.


Habe an Stelle 6. mal ein geeignetes Script eingefügt.
Dieses erkennt alle Dateien und packt diese.
-> Sollte man vielleicht noch ein altes System nutzen ohne SteamCMD oder so und Sounds etc. haben ;)

Ist recht nützlich zum automatisieren ;)