Autor: silmar.alech@wombaz.de (Silmar Alech) <--nur mein GW2-Pseudonym

 

Dies ist eine Anleitung, wie man ein eigenes privates VPN auf seinem Rechner einrichtet, um der Lag-Problematik bei Guild Wars 2 zu entgehen.

 

Die Anleitung richtet sich an Experten mit fortgeschrittenem Computer- und Netzwerkwissen, die einen eigenen (üblicherweise gemieteten) unter Linux laufenden root-Server in einem Rechenzentrum am laufen haben, sei es ein vps (virtuell) oder ein richtiger root-Server auf physischer Hardware. Manch einer hat so einen root-Server am laufen - warum also diesen nicht mitnutzen anstatt ein kostenpflichtiges VPN nur für Guild Wars 2 zu mieten?

 

Die Anleitung beschreibt die Einrichtung eines OpenVPN Servers auf dem Linux Server im RZ und des dazugehörigen OpenVPN Client auf dem Gaming-PC. Das VPN leitet sämtlichen Datenverkehr in die IP-Netzwerke 64.25.0.0/16 und 206.127.0.0/16 über den root-Server. Das ist quasi die Umleitung des Guild Wars 2-Datenverkehrs über den root-Server, um eine verstopfte Direktverbindung zu umgehen, die sonst die Lags produziert. Normales surfen und alles andere läuft weiterhin direkt über die eigene Internetverbindung.

 

Grundlegende und einige fortgeschrittene Linux- und Netzwerkkenntnisse bei der Installation und dem Betrieb von Diensten unter Linux werden vorausgesetzt!

 

Geschätzter Zeitaufwand für die Einrichtung des openvpn-Servers und erstem vpn-Client: 1 Abend.

 

1. Server-Voraussetzung überprüfen

a) Das /dev/tun Device muss auf dem root-Server verfügbar sein. Sicherstellen, dass es tatsächlich vorhanden ist:

 

$ ls -l /dev/tun

crw----r-x 1 root root 10, 200 Dec 18 23:57 /dev/tun

 

Ist das Device nicht vorhanden, kann OpenVPN nicht arbeiten und das ganze geht nicht. Nicht jeder Hoster stellt auf seinen vps das tun Device zur Verfügung.

 

b) Der root-Server muss performant angebunden sein. Einen ping vom root-Server auf einen der europäischen Client-Gateway Server von Guild Wars 2 absetzen:

 

$ ping 64.25.47.116

PING 64.25.47.116 (64.25.47.116) 56(84) bytes of data.

64 bytes from 64.25.47.116: icmp_seq=1 ttl=119 time=4.26 ms

64 bytes from 64.25.47.116: icmp_seq=2 ttl=119 time=4.24 ms

64 bytes from 64.25.47.116: icmp_seq=3 ttl=119 time=4.32 ms

64 bytes from 64.25.47.116: icmp_seq=4 ttl=119 time=4.30 ms

^C

--- 64.25.47.116 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3048ms

rtt min/avg/max/mdev = 4.242/4.284/4.323/0.031 ms

 

Die Latenzzeit sollte unter 10 ms liegen. Liegt sie deutlich höher, erhöht sich der ping zu Guild Wars 2 über die Maßen, und das vpn macht wenig Sinn.

 

2. OpenVPN Server Installation

Mit der Paketverwaltung des root-Servers (yum, rpm, apt-get, usw.) das Paket openvpn installieren.

 

Auf meinem root-Server läuft CentOS 6, da muss erst das epel Repository eingebunden werden, um das Paket zu finden:

$ sudo yum install epel-release

 

Dann den OpenVPN Servert installieren:

$ sudo yum install openvpn

 

3. OpenVPN Server Konfiguration

Die Konfiguration des CentOS Paketes wird in /etc/openvpn erwartet.

Diese server.conf dort hineinkopieren.

 

4. Certificate Authority und keys erstellen

Die folgenden Konfigurationsdateien und Skripte sind für unseren Zweck angepasste Dateien aus dem openvpn Paket.

Das Verzeichnis /etc/openvpn/ca erstellen und die folgenden Dateien hineinkopieren:

openssl.cnf

gen-server-keys.sh

gen-client.sh

 

Die beiden Skripte ausführbar machen:

 

$ chmod +x gen-server-keys.sh gen-client.sh

 

Das Verzeichnis ca gegen unbefugten Zugriff außer root absichern:

 

$ chmod 700 ca

 

Jetzt openssl.cnf editieren und die eigenen Daten bei countryName_default, stateOrProvinceName_default, localityName_default, 0.organizationName_default, emailAddress_default eintragen, falls sprechende Werte in den generierten Zertifikaten und Log-Einträgen gewünscht sind. Die Defaults gehen auch.

 

Auch gen-server-keys.sh und gen-client.sh editieren und analog die eigenen Daten bei den -subj Parametern eintragen.

 

Jetzt gen-server-keys.sh aufrufen und die folgenden generierten Dateien aus dem Verzeichnis /etc/openvpn/ca/my-ca nach /etc/openvpn kopieren:

 

ca.crt

dh2048.pem

server.crt

server.key

 

Danach darf man gen-server-keys.sh nie wieder aufrufen. Tut man dies trotzdem, kann man keine neuen Client-Zertifikate mehr erstellen, da eine neue ca.key erstellt wurde. In dem Fall muss man alle bereits ausgestellten Client-Keys mit neu erstellen und neu verteilen, sofern man die alte ca.key nicht im Backup hat.

 

Die Datei server.key so absichern, dass nur root Lesezugriff hat:

 

$ chmod 640 server.key

 

Den OpenVPN Server auf autostart setzen und starten:

 

$ sudo chkconfig openvpn on

$ sudo service openvpn start

 

 

Der Start wird in /var/log/messages protokolliert. Nachkontrollieren, ob openvpn korrekt gestartet wurde:

 

$ less /var/log/messages

 

5. Server Firewall öffnen und ip-forwarding aktivieren

Unter CentOS 6 wird iptables verwendet und über die Datei /etc/sysconfig/iptables konfiguriert.

Die folgenden Zeilen ganz an den Anfang von /etc/sysconfig/iptables eintragen:

 

*nat

-A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to-source xx.xx.xx.xx

COMMIT

 

Wobei xx.xx.xx.xx zu ersetzen ist in die IP-Adresse des root-Servers und venet0 in das IP Interface, das diese IP Adresse trägt. Auf einem unter Virtuozzo laufenden vps ist das üblicherweise venet0, bei einem physischen Server sowas wie eth0.

 

Dann muss der udp Port 1194 freigegeben werden:

 

-A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT

 

Diese Zeile gehört in die Mitte der Datei, dort wo auch die anderen Ports wie z.B. Webserver oder ssh freigegeben werden.

 

Und erlauben, dass Pakete weitergeleitet werden:

 

-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

-A FORWARD -p icmp -j ACCEPT

-A FORWARD -i lo -j ACCEPT

 

# networks for GW2 as forwarding target for openvpn tunnels

-A FORWARD -m state --state NEW -i tun+ -d 64.25.0.0/16 -j ACCEPT

-A FORWARD -m state --state NEW -i tun+ -d 206.127.0.0/16 -j ACCEPT

 

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j DROP

 

Hier ist eine komplette und funktionierende /etc/sysconfig/iptables Datei für die Serverdienste dns, ssh, Webserver, email, Teamspeak 3 und OpenVPN.

 

Nach dem Anpassen der Konfiguration iptables neu starten:

 

$ sudo service iptables restart

 

Zuletzt muss ip-forwarding im Kernel aktiviert werden. Dazu in /etc/sysctl.conf eintragen:

 

# Controls IP packet forwarding

net.ipv4.ip_forward = 1

 

Und mit sysctl -p aktivieren:

 

$ sudo sysctl -p

 

6. OpenVPN Client installieren

OpenVPN Client herunterladen und installieren:

https://openvpn.net/index.php/open-source/downloads.html

 

 

7. OpenVPN Client konfigurieren

Nun die Generierung eines Client-Zertifikats. Dazu auf dem root-Server gen-client.sh <username> <email> aufrufen, also z.B. so:

 

$ cd /etc/openvpn/ca

$ ./gen-client.sh test1 test1@mytestdomain.org

 

Dabei wird die Datei /etc/openvpn/ca/my-ca/client-<username>.p12 erzeugt. Auf den Gaming-PC herunterladen, nach "client.p12" umbenennen und nach "C:\Program Files\OpenVPN\config" verschieben.

 

Außerdem die Datei gw2.ovpn nach "C:\Program Files\OpenVPN\config" kopieren.

 

"OpenVPN GUI" auf "Als Administrator ausführen" setzen:

- Eigenschaften von "OpenVPN GUI" auf dem Desktop aufrufen. Karteikarte "Kompatibilität" -> "Programm als Administrator ausführen" ankreuzen

 

Servernamen anpassen:

- starte OpenVPN GUI. Es mus als Administrator laufen, sonst kann die Konfiguration nicht angepasst werden.

- rechte Maustaste auf Tray-Icon und den Menüpunkt "Konfiguration anpassen" aufrufen.

- Bei "remote …" den Hostnamen des root-Servers eintragen

 

8. OpenVPN Client starten

- starte OpenVPN GUI, wenn nicht bereits gestartet. Es mus als Administrator laufen, sonst können die Netzwerkrouten nicht eingetragen werden.

- Doppelklick auf das OpenVPN GUI Tray Icon oder rechte Maustaste auf das OpenVPN GUI Tray Icon -> Verbinden.

 

Ist die Verbindungsaufnahme erfolgreich, verschwindet das Log-Fenster und das Tray-Icon wird grün. Außerdem wird kurz angezeigt, dass eine IP Adresse im Bereich 10.8.0.* zugewiesen wurde. Zusätzlich meldet jetzt Windows ein neues unbekanntes Netzwerk und will wissen, was für ein Typ das ist. Dabei "öffentlich" auswählen und den Datenverkehr durch dieses Netzwerk erlauben, falls die Windows-Firewall oder Antivirus-/Security-Suite nach Erlaubnis fragt.

 

Auf dem root Server kann man in /var/log/messages den Verbindungsaufbau protokolliert finden. Auch etwaige Fehlermeldungen, falls der Verbindungsaufbau fehlgeschlagen ist.

 

Fertig!

 

Jetzt den Guild Wars 2 Client starten. War er vorher schon gestartet, verliert man in dem Moment die Verbindung, in dem die VPN Verbindung aufgebaut wurde. In dem Fall Guild Wars 2 neu starten. Also immer erst das VPN starten und dann den Guild Wars 2 Client.

 

Guild Wars 2 wird jetzt eine neue email-Authentifizierung oder Authentikator-Anfrage anfordern, weil man sich nun aus Sicht des Spiels mit der IP-Adresse des root-Servers angemeldet hat. Ab jetzt spielt man über das VPN.

 

Nach einem Rechner Neustart muss man OpenVPN GUI wieder neu aufmachen und manuell neu verbinden. Tut man das nicht, spielt man wieder wie früher direkt und ohne VPN.

 

9. Weitere Benutzer

Man kann auch Freunde mit diesem VPN versorgen. Dazu für jeden, der das VPN benutzen möchte, mit gen-client.sh jeweils einen neuen Key generieren und ihm sowohl die Datei gw2.ovpn als auch die client-<username>.p12 schicken. Letztere am besten schon vor dem Verschicken in client.p12 umbenennen, und in der gw2.ovpn sollte natürlich auch schon der Hostname des root-Servers eingetragen sein. Für jeden Teilnehmer einen anderen Usernamen vergeben.

 

Ein Massen-Event wie Tequatl produziert 40-45 Kbyte/s Durchsatz pro Spieler. Man sollte das Netzwerk auf dem root-Server nicht mehr belasten als es vertragen kann, sonst ist der root-Server seinerseits eine Quelle für Lags.

 

10. Sicherheit

Jeder, der root-Zugriff auf den root-Server hat, kann den Datenstrom mitlesen. Meines Wissens ist der Guild Wars 2 Datenstrom verschlüsselt, d.h. man kann Usernamen und Passwörter nicht im Klartext mitlesen und sie auch nicht entschlüsseln. Von daher sollte dieser Dienst auch für Mitbenutzer sicher sein.