# Lokale IP Adresse bestimmen



## bewerber2 (25. Apr 2010)

Hi,

ich habe folgendes Problem:
In einem Server steckt *eine Netzwerkkarte *und dieser Netzwerkkarte sind *mehrere IP-Adressen *zugewiesen. Ist es irgendwie möglich, einem JAVA-Programm zu sagen, welche der IP-Adressen (die der Netzwerkkarte zugewiesen sind) es als lokale IP-Adresse nutzen soll? 

Das *Hauptproblem *liegt darin, dass ich in meinem Programm für die Netzwerkkommunikation eine fertige Library benutze und diese nicht umprogrammieren kann - d.h. ich muss diese Einstellung der lokalen IP-Adresse in einer übergeordneten Form vornehmen, *bevor die Library initialisiert wird*. d.h. entweder als irgendein System-Property oder beim Startup von JAVA VM.

*Oder nochmal anders:*
Wenn ich das Programm ->3 laufen lasse, dann möchte ich als Ausgabe nicht die unter ->1 angegebene IP-Adresse bekommen, sondern eine der IP-Adressen (die ich selbst aussuche) aus dem IP-Pool ->2:







Geht das?

Viele Grüße aus München!


----------



## Empire Phoenix (25. Apr 2010)

ERm wie jetzt, du willst nicht die echte Ip benutzen sonder eine andere die theoretisch auch eine der echten Ip adressen wäre?
Klingt konfuz, wo liegt denn das eigentliche Poblem damit wenn die library die angegebene ip benutzt? Evtl haste ud dich da in einem der Konzepte/ideen verrant.


----------



## EdelStoff (25. Apr 2010)

bin mir nicht sicher ob folgendes funktioniert, aber probieren könntest du einmal


```
InetAddress[] a = InetAddress.getAllByName("*.*.187.242"); // Adresse die bei 1. Angegeben ist
```


----------



## bewerber2 (25. Apr 2010)

Das eigentliche Problem liegt darin, dass ich einen VPN-Tunnel zu einer Partnerfirma benötige. Der VPN-Tunnel ist so konfiguriert, dass er auf meiner Machine die *.*.*.250 nutzt. Die Partnerfirma erwartet also einen Call von der *.*.*.250.

Wenn ich jedoch mein JAVA-Programm ausführe, gibt es sich als *.*.*.242 aus. Deshalb kommt keine Verbindung zustande. Ich kann aber aus bestimmten Gründen unter ->1 nicht die *.*.*.250 eintragen.

Vielleicht fehlen mir aber auch grundlegende Kenntnisse über die Netzwerkprogrammierung in so einem Fall, wo mehrere Netzwerkadapter vorhanden sind oder ich habe einen Denkfehler bei der Sache!?

Wäre sehr dankbar für Aufklärung..


----------



## Empire Phoenix (25. Apr 2010)

Benutz doch bei 3 die gewünschte adresse, sonst nimmt der nur eine beliebige gültige.
Das geht natürlich nur wenn einer der an dem Rechner vorhandenen Schnittstellen in 1 den wert hat.

Das Problem ist demnach wie binde ich ein Socket auf eine spezifische adresse:
Socket("hier ip als string",hier port).

Wenn deine library jedoch den socket selber erstellt, dann kannst du nicht bestimmen wo der ist soweit ich weiß, ohne die betreffende library zu modifizieren.


----------



## bewerber2 (25. Apr 2010)

Ja, du hast es richtig verstanden, genau das ist das problem! Ich müsste in die Library eingreifen und das wäre zu aufwändig. Ich habe jedoch irgendwo gelesen, dass man einen bestimmten Netzwerkadapter über die Registry auswählen kann und dieser wird beim Startup der JAVA VM als Ausgangswert benutzt. 

Weiss jemand, ob und wie man das machen kann, resp. wo der Schlüssel in der Registry zu finden ist mit dem man einen bestimmten Adapter binden kann?


----------



## Empire Phoenix (25. Apr 2010)

Hm davon kenne ich nichts, aber ich habe mal ein ähnliches problem mithilfe eines Virtuellen Pc's gelöst, der nur den VPN adapter kannte als netzwerkkarte. (Ging darum skype durch nen Vpn zu zwingen, obwohl der pc direkten internet anschluss hat)


----------



## FArt (26. Apr 2010)

Ein Serversocket kann auf eine beliebige Adresse gebunden werden. Die Factory, die die Sockets erstellt, kann global gesetzt werden, indem man die Defaultimplementierung ersetzt, z.B. durch eine Implementierung, die sofort auch ein Binding übernimmt: ServerSocket (Java 2 Platform SE v1.4.2) und ServerSocket (Java 2 Platform SE v1.4.2). Die richtige IP könntest du beim Programmstart als Systemproperty setzten.

Ohne deine genauen Anforderungen verstanden zu haben bzw. deine lokale Konifguration verstanden zu haben, glaube ich, dass du eigentlich als Applikationsentwickler von dieser Infrastruktur keine Ahnung haben DARFST und z.B. einen VPN NICHT extra berücksichtigen musst.


----------



## Gast2 (26. Apr 2010)

bewerber2 hat gesagt.:


> Wenn ich jedoch mein JAVA-Programm ausführe, gibt es sich als *.*.*.242 aus. Deshalb kommt keine Verbindung zustande. Ich kann aber aus bestimmten Gründen unter ->1 nicht die *.*.*.250 eintragen


das klingt als wenn das VPN und das Netzwerk im selben Subnetz liegen ... wer hat den Blödsinn verzapft?

ansonsten FArt hat recht ... für Dich als Andwendungsentwickler ist es uninteressant wie das Netzwerk aufgebaut ist ... das einzige was Dich interessiert ist die Server-IP und der Server-Port ... der rest macht das Netzwerk automatisch (sofern richtig konfiguriert)


----------



## HoaX (26. Apr 2010)

Per API hast du da eh keine Chance was zu ändern, die Auswahl passiert über deine Routing-Tabelle, kannst ja da was konfigurieren, ka wie das bei Windoze geht.


----------



## bewerber2 (27. Apr 2010)

Scheinbar fehlen mir grundlegende Kenntnisse über Netzwerkprogrammierung. 

*Ich habe es mir so vorgestellt: *
- wenn ein VPN-Tunnel aufgebaut wird, dann werden zwei feste IP-Adressen miteinander verbunden
- mein Gegenüber erwartet also einen Call von der *.*.*.250 (weil der Tunnel mal so konfiguriert wurde), sonst lehnt er die Verbindung ab
- wenn unter ->1 die *.*.*.242 eingetragen ist, dann trete ich als *.*.*.242 auf und der andere Rechner lehnt die Verbindung ab, weil ich nicht die *.*.*.250 bin
- ich dachte, das was unter ->1 eingetragen ist, ist immer meine Default-IP mit der ich mich beim anderen Rechner "vorstelle" und wenn ich etwas Anderes aus dem IP-Pool ->2 haben will, so muss ich es explizit angeben 

Wo ist der Fehler, resp. welche der Annahmen ist falsch?


----------



## FArt (27. Apr 2010)

Um von einem Client einen Server zu erreichen, benutzt man die IP Adresse des Servers. Wenn dieser Server mit dieser IP nur über den VPN zu erreichen ist, und dieser richtig eingerichtet wurde, wird der Call auch nur über diesen virtuellen Netzwerkadapter mit der passenden IP Adresse (Client) gehen. 
Wenn der Server auch über einen andern Netzwerkadapter zu erreichen ist (und dieser halt zuerst versucht wird), dann wird der Client mit dieser IP Adresse (also des "falschen" Netzwerkadapters) beim Server aufschlagen.
Das ist aber alles Netzwerkkonfiguration des Clients.


----------



## Gast2 (27. Apr 2010)

FArt hat gesagt.:


> Um von einem Client einen Server zu erreichen, benutzt man die IP Adresse des Servers. Wenn dieser Server mit dieser IP nur über den VPN zu erreichen ist, und dieser richtig eingerichtet wurde, wird der Call auch nur über diesen virtuellen Netzwerkadapter mit der passenden IP Adresse (Client) gehen.



ACK ... der Client muss also *.*.X.* haben und der VPN-Server *.*.Y.* ... sitzt der VPN-Server selber noch in *.*.X.* drinnen, dann stimmt da was nicht ... und Du unterscheidest nur in der letzten Stelle ... damit wirst Du immer über die unverschlüsselte Verbindung kommen



> Das ist aber alles Netzwerkkonfiguration des Clients.


nein ... des Netzadmins ... mit dem Client kannst Du am Routing des Netzwerks nichts ändern


----------

