# JDBC durch Firewall



## CeNoRiDeR (14. Aug 2007)

Hallo alle zusammen,

folgendes Problem: In einer Applikation soll eine Datenbank (MySQL) angesprochen werden. Ansich ja kein Problem.
Die Applikation soll allerdings auch hinter einer Firewall die die entsprechenden Ports für eine JDBC Verbindung sperrt funktionieren.

Und genau hier liegt auch mein Problem

Gibt es eine Möglichkeit die Verbindung über HTTP durchzuführen? Kennt jemand einen anderen Weg so etwas zu realisieren?

Bin um jeden Tip dankbar 

Gruß


----------



## Waldi (14. Aug 2007)

Also es kommt halt darauf an ob du den Server selbst verwaltest und den vollen Zugriff hast oder nicht. Falls Ja dann guck dir doch mal SSH und Port Forwarding an. Das dürfte dir wahrscheinlich sehr helfen.

Die Applikation müsste ja trotzdem funktionieren oder warum sperrst du den Port für die MySQL Datenbank von innen nach aussen?

Ansonsten muss ich sagen du drückst dich ein bisschen zu ungenau aus. Erkläre mal ein bisschen genauer wie das bei dir aussieht.


----------



## CeNoRiDeR (14. Aug 2007)

Okay dann erkläre ich mal etwas genauer:

Die Datenbank ist eine MySQL Datenbank von meinem Webspace bei all-inkl.

Ich bin gerade dabei ein Aktien Verwaltungs programm zu porgrammieren.
Von mir zuhause aus funktioniert das auch wunderbar.

In meiner Firma gehts aber nur über einen Proxy und Firewall nach ausen. Hier funktioniert die normale JDBC Verbindung dann eben nicht mehr.

Wenn es möglich wäre hier eben über HTTP bzw. Port 80 zu kommunizieren. Könnte ich das Programm auch für mich im der Firma lauffähig machen!


----------



## tuxedo (14. Aug 2007)

;-) Wie nett das hier immer mehr das gleiche "Problem" haben ...

MySQL via SSH tunneln ist eine Möglichkeit. Hat man aber keinen SSH Zugriff steht man doof da. So wie ich vor einiger Zeit. Deshalb hab ich mich mal hingesetztund angefangen das Problem zu lösen:

Schau dir mal das an: http://jpmdbc.dev.java.net
Du brauchst auf dem MySQL-Server nur einen Webserver mit PHP, und schon geht's.

Ach ja: Das Ding ist noch in der Entwicklung. Wenn du eine SQL-Exception mit "Method not supported" bekommst dann liegts daran dass ich noch nicht weit genug bin mit der implementierung ;-)

@Waldi:
So wie es aussieht will er eine MySQL-Datenbank benutzen die bei mittlerweile fast jedem Webspave dabei ist. Und diese Datenbanken sind nur via localhost zugänglich.

Gruß
Alex


----------



## Waldi (14. Aug 2007)

Ok in Ordnung. Wie wird denn das Problem mit der Firewall gelöst? Im Admin sagen er soll den JDBC Port aufmachen oder via SSH probieren weil das meist automatisch erlaubt ist. Aber so ganz schwarz ohne das das einer Checkt ?? Geht so was??


----------



## tuxedo (14. Aug 2007)

Aaaaalso... 
Erstmal muss man wissen um was für eine Firewall es sich handelt. Firmenfirewalls bzw. Proxys erlauben meist nur Port 80 für surfen und Port 21 für FTP. Hinzu kommt dann oft noch Port 443 für sichere HTTP-Verbindungen (https). Das war's dann erstmal mit offenen Ports für ausgehende Verbindungen. 
Port 22 für SSH ist in den wohl seltensten Fällen "automatisch" offen. Wohl gemerkt: Ich spreche jetzt von Firewalls und Proxys wie man sie i.d.R. in Firmen antrifft.

Wenn man durch so ein "Gebilde" auf eine DB zugreifen will, ist man mit SSH meist "aufgeschmissen. Zumal man erstmal einen SSH-Server außerhalb der Firewall haben muss.

Für JDBC gibt es keinen Port. Jede Datenbank wird anders angesprochen. Bei MySQL ist es der Port 3306. Und ob der Admin einem Port 3306 aufmacht ist fraglich (In seinen Augen: weniger offene Ports = besserer Schutz).

Wenn man einen SSH-Server außerhalb der Firewall besitzt und die Firewall oder der Proxy Port 443 für sichere HTTP-Verbindungen zulässt, dann kann man den SSH-Port 22, der ja normalerweise nicht durch so eine Firewall durch geht, auf Port 443 umlegen. Dann kommt man immerhin mal schon auf den SSH. Und damit kann man dann beliebige Ports tunneln und sich auch Port 3306 eines im Internet stehenden MySQL-Servers durch den SSH-Tunnel zu sich hinter die Firewall holen.

So, hat man aber nicht die Möglichkeit des eigenen SSH-Servers und lässt sich der Admin auch nicht überreden einen entsprechenden Port aufzumachen, dann bleibt nur noch der Weg über das was eh schon erlaubt ist: Nämlich ausgehende HTTP-Verbindungen über Port 80.

Und da setzt mein jPMdbc an. Was du brauchst:
Einen Webserver der mind. PHP4 beherrscht und der Zugriff auf die MySQL-Datenbank hat. Auf den Webserver legst du dann ein kleines PHP-Script welches dem Treiber beiliegt. Und jPMdbc, ein JDBC-Treiber, kann dann über dieses Script auf die Datenbank zugreifen. 

So, noch fragen?


----------



## Waldi (14. Aug 2007)

Nein. Vielen Dank für die ausführliche Erklärung. Sowas ist sehr interessant und für den einen oder anderen bestimmt gut zu gebrauchen.


----------



## CeNoRiDeR (14. Aug 2007)

Hey Alex0801,

also das hört sich doch schonmal super an!

Der Admin bei uns wird bestimmt keinen Port für mich öffnen, und SSH wär auch schlecht zu realisieren (kein Server).
Ich werde deine Möglichkeit mit dem PHP heut Abend direkt mal ausprobieren!!! 

Bei Fragen meld ich mich hier einfach wieder  

Gruß


----------



## CeNoRiDeR (14. Aug 2007)

Hey Alex ich bekomm beim ausführen deines Beispiels folgende Meldung:

java.lang.UnsupportedClassVersionError: de/root1/jpmdbc/jdbc/interfaces/IProgressListener (Unsupported major.minor version 49.0)
	at java.lang.ClassLoader.defineClass0(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
Exception in thread "main"

folgender Code:

```
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;

import de.root1.jpmdbc.jdbc.interfaces.IProgressProvider;
import de.root1.jpmdbc.testing.ProgressPrinter;

/**
*
* A Sample for connecting to a MySQL database behind a webserver
*
* @author Copyright (c) 2007 by Alexander Christian
*/
public class DBOverPHP {

public static void main(String[] args) throws SQLException {


// Connection via proxy is possible ...
System.setProperty("http.proxySet", "true");
System.setProperty("proxyHost", "MEIN_Proxy");
System.setProperty("proxyPort", "MEIN_PORT");
System.setProperty("http.proxyUser", ""MEIN_USER");
System.setProperty("http.proxyPassword", "MEIN_PW");

// if we don't use localhost at port 3306 for the db-connection ,
// we can set it here individually
System.setProperty("jpmdbc.dbhost", "myDbHostname");
System.setProperty("jpmdbc.dbport", "3306");


try
{
Class.forName( "de.root1.jpmdbc.Driver" );

// show some jdbc-info
for ( Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); ){
System.out.println( e.nextElement().getClass().getName() );
}
DriverManager.setLogWriter( new PrintWriter(System.out) );

// Create the connection-object
Connection con = DriverManager.getConnection("jdbc:jpmdbc:http://www.xyz.de:80/jpmdbc.php?MEINE_DB", "MEIN_DB_USER", "MEIN_DB_USER_PW");

// Create a statement
Statement s = con.createStatement();

// Optional: We want to track the current progress
ProgressPrinter progressPrinter = new ProgressPrinter(); // so we need a class that implements de.root1.jpmdbc.jdbc.interfaces.IProgressListener
IProgressProvider progressProvider = (IProgressProvider) s; // then we need the progressprovider
progressProvider.setProgressListener(progressPrinter); // to register our progress-listener

ResultSet rs = s.executeQuery("SELECT * FROM Aktien;"); // make a selection

while(rs.next()){
System.out.println("name="+rs.getString("name")+" security="+rs.getShort("security"));
}

}
catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
}

}
```


hab deinen Treiber: jPMdbc_0.0.1e.jar runtergeladen und eingebunden sowie das php file auf meinen Server gespielt...


----------



## tuxedo (14. Aug 2007)

Wie gesagt: Der Treiber ist noch nicht fertig. Aber die Grundsätzlichen Dinge gehen schon. Prepared Statements bereite ich gerade vor (*g* ein Wortspiel ;-) ). 

Wenn du Fragen hast: Benutz doch am besten das Forum (Discussion forums) auf der jPMdbc Projektseite.

- Alex


----------



## tuxedo (14. Aug 2007)

Hmm, welche Java-Version hast du benutzt?
Der Treiber ist mit Java5 Update 11 compiliert. 

- Alex

[update]

Hab die 0.0.1f als ZIP mal online gestellt.


----------



## CeNoRiDeR (14. Aug 2007)

Habs...lag an der Java Version...man brauch 1.5!

Hey super es funktioniert!!! Mit deiner erlaubnis werde ich das in mein Programm einbauen 

Vielen Dank!!!


----------



## tuxedo (14. Aug 2007)

Der Treiber ist mit Lesser GPL lizensiert. D.h. du darfst den Treiber als Bibliothek linken. Solltest du den Treiber-Quellcode als festen Bestandteil deines Programms/JARs machen, dann musst du dein Programm auch zu LGPL oder GPL machen. 

Weitere Infos zur Lizenz gibts hier: 
-> http://de.wikipedia.org/wiki/GNU_Lesser_General_Public_License
-> http://www.gnu.de/lgpl-ger.html

Die rechtsgültige Fassung der Lizenz findest du hier: http://www.gnu.org/licenses/lgpl.html

P.S. Dass man Java 5 brauchst steht auch auf der Projektseite ;-)
P.P.S. Ach ja: Immer mal wieder reinschauen und die neue Version ziehen. Das Ding ist ja noch nicht bug-frei


----------



## Guest (13. Feb 2008)

CeNoRiDeR hat gesagt.:
			
		

> Hey Alex ich bekomm beim ausführen deines Beispiels folgende Meldung:
> 
> java.lang.UnsupportedClassVersionError: de/root1/jpmdbc/jdbc/interfaces/IProgressListener (Unsupported major.minor version 49.0)
> at java.lang.ClassLoader.defineClass0(Native Method)
> ...


----------



## tuxedo (14. Feb 2008)

a) Du brauchst Java 1.5 und nix anderes (der Treiber ist mit Java 5 compiliert).
b) Nimm eine neuere Version. Diese findest du auf https://jpmdbc.dev.java.net/servlets/ProjectDocumentList (nimm die Datei ganz unten mit dem aktuellsten Datum). Für ältere Versionen gibts keinen Support!
c) Warum quotest du dich selbst?

- Alex


----------

