# VPN mit Java !



## tuxedo (12. Aug 2005)

Hi,
da ich auf meinem gemieteten virtuellen root-server keinen Kernel compilen darf und auch keine Kernelmodule laden darf und mit portweiterleitung per ssh keine Sicherheitslücke aufmachen will hab ich mir folgendes für meinen Gameserver überlegt:

Eine Art Game-VPN per Java:

Ein Server der Verbindungen von Clients auf Port 1 entgegen nimmt. Der Client meldet sich mit Name+PW am Server an. Ist die Anmeldung erfolgreich schaltet der Server die Verbindung zu einem Port der nur "lokal" erreichbar ist weiter. 
Gleiches muss der Client machen damit sich das Spiel das mit dem Server eigtl auf Port 99 kommunizieren will mit dem Client verbinden kann.


Ich versuchs mal zu skizzieren (mit frei erfundenen dummy-ports)

Game-Server-Anwendung (lauscht auf Port 99, per FW nur für localhost erreichbar)
/\
/\ <stream per localhost vom java-vpn-server>
/\
Java-VPN-Server (lauscht auf Port 1)
/\
/\
/\
/\ <INTERNET>
/\
/\
/\
Java-VPN-Client (lauscht auf localhost port 99, connected zu Java-VPN-Server auf Port 1)
/\
/\
/\ <Stream vom Spiel ausgehend>
/\
/\
Spiel das sich zum Spielserver verbinden will (der auf Port 99lauscht)

Nochmal das ganze in Kurzfassung:

Die Java-Client und der Java-Server leiten also local von einem Port zum anderen weiter...

Ist das in Java machbar ? "Vertragen" die Java-Socket-Streams "alle" Daten die über die Leitung gehen ? Also auch Spieldaten ?

Kann ich eingehende Streams auf andere ausgehende "umleiten"/"weiterreichen" ?

Es wird im übrigen von einem einzelnen Client nicht übermäßig viel traffic produziert. Das mittlere maximum liegt bei 2-5kbyte/sek. 
Die Bandbreite des Servers ist groß genig um locker 200 Spieler zu bedienen... wie performant könnte mein vorhaben laufen ? frisst Java da performance wenn es nur streams weiterleiten muss (sofern das überhaupt geht) ?

gruss 
Alex


----------



## Nick H. (12. Aug 2005)

> Ist das in Java machbar ? "Vertragen" die Java-Socket-Streams "alle" Daten die über die Leitung gehen ? Also auch Spieldaten ?



natürlich Spiel-Daten sind doch auch ganz normale Binärdaten
man kann mit Streams jede Art von Binär-Daten übertragen


> Kann ich eingehende Streams auf andere ausgehende "umleiten"/"weiterreichen" ?



klar geht das
einfach in einer Schleife ein byte auslesen und in den OutputStream schicken
dann wieder eins einlesen und so weiter


> frisst Java da performance wenn es nur streams weiterleiten muss (sofern das überhaupt geht) ?



das kostet leider ziemlich viel Performance
hab das ganze mal mit nem total trivialen ProxyServer probiert
der hat einfach das was der Browser im geschickt hat an den entsprechenden Server weitergeleitet und umgekehrt
wollte aber auch nur gucken ob das geht
hab jetzt nicht probiert das möglichst schnell zu machen
also kann ich das nicht mit großer ssicherheit sagen
aber ich denke schon dass das so ist


----------



## tuxedo (12. Aug 2005)

hab eben was von einem Java Redirector gelesen der ohne Streams, dafür aber mit Buffers arbeiten soll was sehr viel performanter sein soll. Werd mich da mal einlesen.

Danke für die Antwort,
gruß
Alex


----------



## byte (13. Aug 2005)

sowas? 

http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedInputStream.html
http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedOutputStream.html


----------



## tuxedo (13. Aug 2005)

Ne, keine Streams. NUR Buffers mit java.nio.* 

gruss
Alex


----------



## tuxedo (17. Aug 2005)

Also ich habs jetzt mit "normalen" Streams mal ausprobiert und es funktioniert. Auch die Performance sollte ausreichen.

Problem is jetzt nur dass wenn ich das VPN-Servertool auf meinem Root-Server parallel zu meinem Gameserver laufen lasse nicht genug Speicher zum ausführen der JVM da ist ?! 

Unter Windows braucht das Tool insgesamt 8MB RAM. Seltsam dass es unter Linux mehr frisst ?

Gruss
Alex


----------



## Nick H. (17. Aug 2005)

komisch
hört sich eher an als würde da was schief laufen...


----------



## AlArenal (17. Aug 2005)

Wieso wäre ne Port-Weiterleitung über SSH eine Sicherheitslücke??


----------



## tuxedo (17. Aug 2005)

Weil man, um einen Port per SSH weiterzuleiten dem Benutzer ein Benutzername und PW geben muss. Und wenn man Dummy-Shell oder ähnliches einsetzt das das einloggen auf der Linux-Console verhindert, der User sich wirklich einloggen kann. Alleine diese Tatsache ist streng genommen eine Sicherheitslücke... Aber das ist eine Frage der eigenen Sicherheitsphilisophie...

- Alex


----------



## Nick H. (17. Aug 2005)

wieviel RAM hat den dein Server?
das kann irgendwie ja nicht sein

besorg dir am besten so ein tool zum auslesen
vielleicht braucht der GameServer auch schon alles


----------



## tuxedo (18. Aug 2005)

Der Gameserver braucht schweine viel, da er eigtl für Windows ist und deshalb mit wine läuft. 
Die 8MB die das Tool unter Window frisst sind aber noch frei. Könnte mir höchsten vorstellen dass die JVM beim starten erstmal mehr allokiert und sich dann auf die 8MB des Tools einpendelt. 
Ist schon komisch. Vielleicht schreib ich das Tool auch in C# oder gleich in C. Muss mich da halt mal einlesen.

Gruss
Alex


----------



## Nick H. (18. Aug 2005)

sonst musste halt probieren den Gameserver kurz auszuschalten
dann die VM an und dann wieder den Gameserver

aber ich halte C auch für die bessere Lösung
auch wenn ich C++ bevorzuge


----------

