PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IP Herausfinden



bischi
03-04-2005, 20:07
Hallo zusammen - gibt es eine Möglichkeit einigermassen zuverlässig die eigene IP herauszufinden - sowohl mit Linux als auch mit Windows (die einzelnen Varianten kenn ich...). Am besten mit Java - aber zur Not auch anders.

Zweitens: Wenn möglich sowohl die lokale als auch die, die ich im Internet habe (localhost gibt mir 127.0.0.1 obwohl meine Lan-Adresse 192.1... wäre)

MfG Bischi

anda_skoa
03-04-2005, 20:24
java.net.InetAddress

java.net.Socket

Ciao,
_

bischi
03-04-2005, 20:25
Ja - und dann (da war ich schon - bekomm aber irgendwie immer nur die 127.0.0.1)

MFG Bischi

anda_skoa
03-04-2005, 20:40
Du brauchst ansich nur zu deinem Ziel connecten, dann weißt du welches lokale Interface dafür verwendet wurde (Socket.getLocalAddress)

Was deine externe IP betrifft, brauchst du jemanden auf der anderen Seite, der dir sagt, unter welcher Adresse die Verbindung bei im eingegangen ist.

Ciao,
_

peschmae
03-04-2005, 21:30
Deine "externe" d.h. router-ip gibt dir z.B. die Seite da: http://checkip.dyndns.org/ oder auch kurz:


peschmae@thinkpad:~/bash$ alias ip='wget http://checkip.dyndns.org/ -O /dev/stdout 2>/dev/null | sed "s/.*Current IP Address: \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/"'
peschmae@thinkpad:~/bash$ ip
242.147.128.124


Ich weiss - Monsterregexp das, eine Jugendsünde halt und solange die geht ändere ich sie auch nicht. :)

MfG Peschmä

bischi
04-04-2005, 15:27
http://checkip.dyndns.org/ scheint praktisch zu sein - werd mal damit rumbasteln... Andere Frage:

Ich hab nen Server und nen Client.

Fall 1: Wenn ich den Server auf meinem Windows-PC starte, kann ich problemlos von meinem Linux-PC aus mittels Client connecten.

Fall2: Selber Server auf Linux-PC. Die Client-Verbindung vom Windows-PC aus funktioniert aber nicht (null-Pointer-Exception, dh. Server nicht gefunden)

Beide Male verwende ich die Lan-IP 192.168.243.... die garantiert stimmt. Verwende ich diese IP um lokal zu verbinden (also sowohl win-win als auch lin-lin) funktioniert dies einwandfrei.

Am Firewall kanns nicht liegen, den hab ich zum Testen abgeschaltet.

Hat jemand ne Idee?

MFG Bischi

anda_skoa
04-04-2005, 16:10
Der Server hat ohne Probleme den Port allokiert?
(häufiger Fehler ist port < 1024)

Ciao,
_

bischi
04-04-2005, 16:16
Port liegt bei 20300.

MfG Bischi

bischi
06-04-2005, 14:44
Also: Ich hab mit http://checkip.dyndns.org/ mal ein wenig rumprobiert - ich bekomm aber für beide PC's die selbe IP - also wohl die vom Router. Wie kann das funktionieren, bzw, woher weiss der Router, an welchen Compi er ein Datenpacket senden muss? Spielt da die MAC-Adresse noch mit? Und wenn ja - wie bekomm ich die?

MfG Bischi

fs111
06-04-2005, 15:17
Benutz doch einfach den XML-Service von showmyip.com

fs111

bischi
06-04-2005, 17:26
Nützt nichts - gibt mir immer noch Router-IP: Ich glaub, ich hab das Problem gefunden: Ich müsste ein Portforwarding vom Router her machen und könnte dann direkt auf gewisse Ports zugreifen - mit der Router-IP.

Was mich aber auf eine weitere Frage bringt: Wie merkt bspw ICQ, auf welchen Computer es zugreifen muss?

Und nochwas: mittels nmap hab ich meine eigenen offenen Ports gescannt - komischerweise ist 20300 gar nicht geöffnet, selbst wenn ich neben dem Server noch nen Client starte und verbinde!

Vielleicht hatte Anda doch recht und der Socket war nicht richtig geöffnet. Hat jemand dazu irgend einen eventuell vielleicht möglicherweise nützlichen Tipp?

MfG Bischi

PS: Port öffnet sich auch nicht als root

peschmae
06-04-2005, 17:57
Nützt nichts - gibt mir immer noch Router-IP: Ich glaub, ich hab das Problem gefunden: Ich müsste ein Portforwarding vom Router her machen und könnte dann direkt auf gewisse Ports zugreifen - mit der Router-IP.


Um von aussen auf deinen Server zuzugreifen, ja. Aber ich dachte du bist im LAN?



Was mich aber auf eine weitere Frage bringt: Wie merkt bspw ICQ, auf welchen Computer es zugreifen muss?

ICQ greift auf nichts zu, die Anfrage geht ja von deinem Client über den Router in Richtung AOL - und der Router weiss halt welcher lokaler pc die verbindung geöffnet hat.



Und nochwas: mittels nmap hab ich meine eigenen offenen Ports gescannt - komischerweise ist 20300 gar nicht geöffnet, selbst wenn ich neben dem Server noch nen Client starte und verbinde!


Dann bräuchte man wohl etwas Code... :)

Eventulel auch mal das Socket fragen ob es meint es sei verbunden (getPort() sollte ja nur was liefern wenn der Port auch "besetzt" wurde). Oder hast du etwa ein bind() auf irgendwas gemacht?

MfG Peschmä

bischi
06-04-2005, 18:04
gibt mit und ohne bind() keinen geöffneten Port an... Ich versuchs später mal auf meinem Windows-PC und schau, ob dort ein Port offen ist...

MfG Bischi


Um von aussen auf deinen Server zuzugreifen, ja. Aber ich dachte du bist im LAN?
Ich bin dran ein Chat-Programm zu schreiben - da ist es für mich sowohl ein Problem, wenn ich intern im Lan meinen Linux-PC nicht finde (ping von windows aus funktioniert) und auch, wenn ich meine externe IP nicht kenne (ich wollte mal versuchen, das ding mit bind() an meine externe IP zu hängen)

edit: Quizfrage: Was passiert, wenn ich meinen Server in ein Applet stecke und dieses auf eine HP lade, von der Ich die Adresse kenne?

peschmae
06-04-2005, 18:19
Applets laufen auf deinem Lokalen Computer...
Bind war übrigens eher das was du _nicht_ tun sollst :D

Die IP deines Servers im Lan musst du halt kennen um eine Verbindugn aufzubauen - anders geht das nicht wirklich.

MfG Peschmä

bischi
06-04-2005, 18:29
Applets laufen auf deinem Lokalen Computer...
Bind war übrigens eher das was du _nicht_ tun sollst :D

Die IP deines Servers im Lan musst du halt kennen um eine Verbindugn aufzubauen - anders geht das nicht wirklich.

MfG Peschmä

Ähm - wieso nicht bind? (wenn ich "ServerSocket s = new ServerSocket("localhost")" mache, gehts auch nicht - auch ohne bind) Und: Die lokale IP kenn ich natürlich (ist in etwa 192.168.243.xxx)

MfG Bischi

PS: Hier ein Code-Auszug:



InetAddress localHost = null;
localHost = localHost.getByName(locIP);
System.out.println("Lokale IP: " +localHost);
ServerSocket listener = new ServerSocket(Port,1,localHost);
wobei locIP = "localhost" oder "192.168.234.bla" sein kann

edit: bind hatte ich schon vorher herausgenommen, das nicht funktioniert hatte...

peschmae
06-04-2005, 18:40
Ähm - wieso nicht bind? Wegen weil das nur Verbindungen von einem bestimmten anderen Computer erlaubt...





InetAddress localHost = null;
localHost = localHost.getByName(locIP);
System.out.println("Lokale IP: " +localHost);
ServerSocket listener = new ServerSocket(Port,1,localHost);
wobei locIP = "localhost" oder "192.168.234.bla" sein kann


Sollte eigentlich gehen finde ich - aber ein


ServerSocket listener = new ServerSocket(port, 1, InetAddress.getLocalHost())
täte es auch um herauszufinden wer Localhost denn so ist.


Localhost brauchst du gar nicht - ein
new ServerSocket(port) tuts ja auch

Buch lesen da steht was scheint mir... (http://www.oreilly.com/catalog/javanp2/chapter/ch11.html)

MfG Peschmä

bischi
06-04-2005, 18:48
ServerSocket listener = new ServerSocket(port, 1, InetAddress.getLocalHost())
täte es auch um herauszufinden wer Localhost denn so ist.


Localhost brauchst du gar nicht - ein
new ServerSocket(port) tuts ja auch


Letzteres hatte ich am Anfang - aber funktioniert hats auch nicht - da hab ich halt versucht, anstatt der Lokalen ip 127.0.0.1 die LanIP anzugeben - doch genützt hats auch nichts...

Mfg Bischi

peschmae
06-04-2005, 20:12
Mal das da versucht während dein Server läuft?


import java.net.*;
import java.io.*;

public class LocalPortScanner {

public static void main(String[] args) {

for (int port = 1; port <= 65535; port++) {

try {
// the next line will fail and drop into the catch block if
// there is already a server running on the port
ServerSocket server = new ServerSocket(port);
}
catch (IOException e) {
System.out.println("There is a server on port " + port + ".");
} // end try

} // end for

}

}


Von dem schlauen Buch oben...

MfG Peschmä

anda_skoa
07-04-2005, 16:38
Nützt nichts - gibt mir immer noch Router-IP: Ich glaub, ich hab das Problem gefunden: Ich müsste ein Portforwarding vom Router her machen und könnte dann direkt auf gewisse Ports zugreifen - mit der Router-IP.

Korrekt.
Bei ausgehenden Verbidnungen kennt das NAT natürlich den Rückweg, aber bei eingehenden hat es keine Information darüber wenn man es ihm nicht sagt.



Was mich aber auf eine weitere Frage bringt: Wie merkt bspw ICQ, auf welchen Computer es zugreifen muss?

Der ICQ Client hinter einer Firewall/NAT Router kann eine Portrange angeben und die seinem Gegenüber mitteilen, welche dann am Router natürlich entsprechend geforwarded sein muss.
Und auch nur dann, wenn der Client hinter dem Router Direct Connects bekommen will, zB eingehende Filetransfers.
Messages gehen ja auch über eine Verbindung die er selbst aufbaut, bzw auch indirekt über den ICQ Server.



Und nochwas: mittels nmap hab ich meine eigenen offenen Ports gescannt - komischerweise ist 20300 gar nicht geöffnet, selbst wenn ich neben dem Server noch nen Client starte und verbinde!

Am besten beim Server Socket keine Adresse angeben, dann wird der Socket auf allen Interfaces angefordert.

Ciao,
_

bischi
07-04-2005, 19:27
Also - hab noch einiges probiert: Hab mal serversocket.tostring() ausgeben - es kommt dann eine anzeige à la: "port:0 localport:20300" (PS: @peschmä: Das Beispiel ist ja schön und gut, aber wenn du als Port 0 angibst, sucht sich das ServerSocket selbst einen aus (der frei ist) - hilft aber auch nicht weiter... Durchprobieren kann ichs aber bei gelegenheit trotzdem nochmals)

Also2: nmap zeigt mir entsprechenden Port doch an - muss ihm nur sagen, dass es so hoch suchen soll ... *YEAH-GUTE SOFTWARE* (@man: zeigt alle offenen ports an...)




Der ICQ Client hinter einer Firewall/NAT Router kann eine Portrange angeben und die seinem Gegenüber mitteilen, welche dann am Router natürlich entsprechend geforwarded sein muss.
Und auch nur dann, wenn der Client hinter dem Router Direct Connects bekommen will, zB eingehende Filetransfers.
Messages gehen ja auch über eine Verbindung die er selbst aufbaut, bzw auch indirekt über den ICQ Server.
Da ist ja das komische: wir haben im Lan 3 Compis mit ICQ - aber auf dem Router ist überhaupt nichts geforwardet (und alle 3 clients funktionieren!!!)




Am besten beim Server Socket keine Adresse angeben, dann wird der Socket auf allen Interfaces angefordert.

Die Idee ist grundsätzlich nicht schlecht - die hatte ich anfangs auch (hat aber nicht funktioniert, drum hab ichs abgeändert). Das Hauptproblem ist, dass das ServerSocket dann immer auf 127.0.0.1 zeigt - und diese IP ist von aussen ja nicht zugreifbar.

Ich hab heute im WLan der Uni mal noch das ganze von Debian zu Debian ausprobiert (obwohl das mit der IP da irgendwie komisch war - meine regex die ich heruntergeladen habe hat mir keine IP angezeigt, dynnds aber schon). Der langer rede kurzer sinn: Funktioniert hats wieder mal nicht....

Noch jemand Ideen?

MfG Bischi

PS: Was mich nervt, ist, dass es auf Windows läuft... :confused: :eek:

peschmae
07-04-2005, 20:03
Also - hab noch einiges probiert: Hab mal serversocket.tostring() ausgeben - es kommt dann eine anzeige à la: "port:0 localport:20300" (PS: @peschmä: Das Beispiel ist ja schön und gut, aber wenn du als Port 0 angibst, sucht sich das ServerSocket selbst einen aus (der frei ist) - hilft aber auch nicht weiter... Durchprobieren kann ichs aber bei gelegenheit trotzdem nochmals)[quote]

Das Beispiel hatte - wie auch im Text steht - die Ausgabe das da rauszufinden:

[quote]
Also2: nmap zeigt mir entsprechenden Port doch an - muss ihm nur sagen, dass es so hoch suchen soll ... *YEAH-GUTE SOFTWARE* (@man: zeigt alle offenen ports an...)

Nämlich obs dein Programm geschaft hat sich and as Socket zu hängen oder nicht. Aber egal, das geht ja offenbar...



Da ist ja das komische: wir haben im Lan 3 Compis mit ICQ - aber auf dem Router ist überhaupt nichts geforwardet (und alle 3 clients funktionieren!!!)


Was ist da seltsam? Das ist normal. Für irgendwas hast du ja einen Router, oder?



Die Idee ist grundsätzlich nicht schlecht - die hatte ich anfangs auch (hat aber nicht funktioniert, drum hab ichs abgeändert). Das Hauptproblem ist, dass das ServerSocket dann immer auf 127.0.0.1 zeigt - und diese IP ist von aussen ja nicht zugreifbar.

Sicher? Würde mich jetzt überraschen wenn du da von aussen nicht zugreifen kannst...
Das sollte wie anda_skoa schon erwähnt hat für alle Interfaces gelten, also loopback und echtes Netzwerk. (Solange du nicht speziell das Dings mit bind() z.B. auf 127.0.0.1 einschränkst...)



Ich hab heute im WLan der Uni mal noch das ganze von Debian zu Debian ausprobiert (obwohl das mit der IP da irgendwie komisch war - meine regex die ich heruntergeladen habe hat mir keine IP angezeigt, dynnds aber schon). Der langer rede kurzer sinn: Funktioniert hats wieder mal nicht....

Im WLan der Uni brauchst du das dyndns ding eh nicht - das liefert dir ja höchstens die IP des (letzten) Gateways aber mit der kannst du im LAN nicht wirklich was anfangen.

MfG Peschmä

bischi
07-04-2005, 20:33
Was ist da seltsam? Das ist normal. Für irgendwas hast du ja einen Router, oder?
Was daran seltsam ist? Ein Age-Of Server wird nicht gefunden - ICQ ohne Portforwarding aber problemlos (ok, das eine ist der Server, das andere ein Client - aber trotzdem...) Irgendwie seh ich bei dem ganzen noch nicht so durch: Hat jemand einen guten Link dazu?




Sicher? Würde mich jetzt überraschen wenn du da von aussen nicht zugreifen kannst...
Das sollte wie anda_skoa schon erwähnt hat für alle Interfaces gelten, also loopback und echtes Netzwerk. (Solange du nicht speziell das Dings mit bind() z.B. auf 127.0.0.1 einschränkst...)

Für Windows hats funktioniert - aber für Linux eben irgendwie nicht...




Im WLan der Uni brauchst du das dyndns ding eh nicht - das liefert dir ja höchstens die IP des (letzten) Gateways aber mit der kannst du im LAN nicht wirklich was anfangen.

Drum hab ich ja auch eine Regex, die mir lokal (irgendwo proc,...) nachschaut, was ich für ne IP habe - funktioniert problemlos, solange ich zuhause bin (192....) Im WLan stand da allerdings nichts... Ich hatte also keine IP - konnte aber aufs Internet zugreifen :) COOL :)

MfG Bischi

peschmae
07-04-2005, 21:14
Was daran seltsam ist? Ein Age-Of Server wird nicht gefunden - ICQ ohne Portforwarding aber problemlos (ok, das eine ist der Server, das andere ein Client - aber trotzdem...) Irgendwie seh ich bei dem ganzen noch nicht so durch: Hat jemand einen guten Link dazu?


Der Punkt ist:
ICQ geht so: AOL hat einen Server mit einer bestimmten IP (nee, wohl mehrere, aber egal) - auf den greifst du zu - auf einen bestimmten Port. Also Verbindung von dir aufgebaut via den Router - der weiss dann weil dein 192.168.1.39 Computer die Verbindung aufgebaut hat dass die zu dir gehört und schickt dir alle dazu gehörigen Pakete.

AGE: Du hast einen Server. Jemand will darauf zugreifen - fragt also deinen Router - der weiss nicht was damit anfangen und wirfts weg (es sei denn du hättest eingestellt dass er alle Anfragen an einen bestimmten oder Anfragen auf einen bestimmten Port an einen bestimmten Compi im LAN weiterleitet, genau wegen dem wegwerfen bist du im Lan hinter dem Router auch relativ sicher auch wenn du nicht überall Firewalls hast).

Letzteres betrifft aber Chatprogramme normalerweise nicht, da die im Allgemeinen (ausser den erwähnten Filetransfers die oft p2p ablaufen) auf einen Fixen Server im Internet zugreifen, der eben nicht hinter einem Router ist und eine klar definierte IP + einen Port hat wo er zu erreichen ist.

In der Wikipedia steht jede Menge Zeugs dazu. Nur nich tin einem klaren Artikel und vor allem fangen die immer mit diesem (*Protz ich kenn das auch*)-OSI Schichtmodell an ;)



Für Windows hats funktioniert - aber für Linux eben irgendwie nicht...


Das sollte eigentlich der Hinweis sein dass dein Code ok ist. Java ist normalerweise in den Bereichen schon sehr Portabel.

Was für eine JVM hast du überhaupt? Sicher dass die von Sun genutzt wird und nicht eine andere (die ja möglicherweise da ein Problem haben könnte, auch wenn das mittlerweiele auch alle freien jvms hinkriegen sollten)?



Drum hab ich ja auch eine Regex, die mir lokal (irgendwo proc,...) nachschaut, was ich für ne IP habe - funktioniert problemlos, solange ich zuhause bin (192....) Im WLan stand da allerdings nichts... Ich hatte also keine IP - konnte aber aufs Internet zugreifen :) COOL :)

Dann hattest du eine IP. Hast du eventuell für eth0 nachgeguckt (vermutlich dein Kabel-Lan) und Wlan war auf eth1?

Am besten machst du ifconfig dann siehst du alle Schnittstellen mit Daten von deinem Computer (auch das liebe Loopback-Inteface ;))

MfG Peschmä

bischi
24-04-2005, 13:17
So, die sinnvollste Lösung scheint ein VPN-Tunnel zu sein - hat da jemand dazu ein gutes Tut, Anleitung, ...

MfG Bischi

PS: Hab ein wenig gegoogelt - scheint nicht so einfach zu sein...

peschmae
24-04-2005, 17:08
Hmm, naja. Für den VPN Tunnel stellt sich aber dann ja wieder genau dasselbe Problem wie für das Programm einzeln ohne VPN Tunnel. Da bist du keinen Schritt weiter.

MfG Peschmä