# externe IP ermitteln



## zubi (18. Dez 2004)

Hallo,

will ein ganz kleines Java-Programm schreiben, welches auf Knopfdruck die externe IP ermittelt (für Leute hinter Router). Nun hab' ich mal im Netz nach grundlegenden Methoden gesucht, und bin auf folgende Aussage gestossen: 





> Here is a simple and elegant solution - hitting the webpage on external server. Webserver knows your real IP address (it has to, otherwise how will it return the page on your request?). Now all you need is the page returning REMOTE_HOST header.



Eine Verbindung über Socket zu einem WebServer ist ja kein Problem, aber komm ich als fragender Client an die REMOTE_HOST-Variable dran? Und wenn ja, wie muss ich den Server genau ansprechen?

Danke & Gruss,
zubi


----------



## Illuvatar (18. Dez 2004)

Weiß nicht, ob dir das was hilft, das hab ich mal im Forum gefunden, das löst es aber ein wenig anders:

```
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class IPbehindaRouter { 

   public static String getIP() { 
      String line = ""; 
      BufferedReader in = null; 
      int i = 0; 
      try { 
         URL getyouripurl = new URL( "http://www.whatismyip.com" ); 
         in = new BufferedReader( new InputStreamReader( getyouripurl 
               .openStream() ) ); 
      } catch( MalformedURLException e ) { 
         System.err.println( e ); 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      try { 
         while( ( line = in.readLine() ) != null ) { 
            if( line.startsWith( "<h1>Your IP is " ) ) { 
               return line.substring( 15, ( line.length() - 10 ) ); 
            } 
            i++ ; 
         } 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      return "Fehler"; 
   } 
   public static void main (String[] args)
   {
   		System.out.println(new IPbehindaRouter().getIP());
   }
}
```

Edit: Der Code ist übrigens von alshir.


----------



## Bleiglanz (18. Dez 2004)

meinst du einen einfachen Aufruf einer Webseite, wo dir der Server deine IP sagt?

schreib einfach ein Servlet mit

response.getPrintWriter().print(request.getRemoteAddr()));

schau in die Servlet API


----------



## zubi (18. Dez 2004)

@Illuvatar: hab's so auch schon gelöst. ich würde aber gerne einen Weg finden ohne den HTML-Code einer Site zu durchsuchen (if( line.startsWith( "<h1>Your IP is " ) ) {....). Trotzdem danke für deine Antwort!

@Bleiglanz: kenn mich noch nicht so wahnsinnig mit Servlets aus, aber wäre es mit deiner Variante nicht so, dass das Servlet auf einer Maschine laufen müsste zu welcher ich die Verbindung aufbaue? (korrigier mich wenn ich falsch liege)

Ich suche eigentlich einen Weg, bei dem ich zu irgendeinem WebServer die Verbindung aufbauen kann und ich dann die externe IP erhalte. So, dass ich nicht auf einen spezifischen Server angewiesen bin (sonst könnte ich die IP über einen ServerSocket dem fragenden Client zurückschicken).


----------



## Bleiglanz (18. Dez 2004)

zubi hat gesagt.:
			
		

> Ich suche eigentlich einen Weg, bei dem ich zu irgendeinem WebServer die Verbindung aufbauen kann und ich dann die externe IP erhalte. So, dass ich nicht auf einen spezifischen Server angewiesen bin (sonst könnte ich die IP über einen ServerSocket dem fragenden Client zurückschicken).



versteh ich nicht, genau das kannst du mit einem Servlet am allereinfachsten erreichen; wenn du sowas machst, dann schickst du einfach text/plain zurück und du brauchst kein html zu parsen

setzt natürlich einen Webserver voraus?

wahrscheinlich suchst du 

SocketAddress 	getRemoteSocketAddress()
          Returns the address of the endpoint this socket is connected to, or null if it is unconnected.

da kann ich nur RTFM sagen


----------



## zubi (18. Dez 2004)

ich versuch's wie gesagt ohne WebServer zu lösen. Ich möchte, dass Leute die irgendein Problem mit dem PC haben per "Knopfdruck" ihre externe IP ermitteln können (welche dann mir zugemailt wird), damit ich dann per VNC auf ihre Kiste zugreifen kann.

und ja: die API hab' ich natürlich konsultiert, und getRemoteSocketAddress() gibt mir nicht meine extern IP sondern die IP des Endknoten des Sockets.

Wahrscheinlich geht's nicht ohne Servlet oder feste IP (mit ServerSocket). Trotzdem Danke!


----------



## Bleiglanz (19. Dez 2004)

getRemoteSocketAddress()  -> war ja auch für den Client gedacht

WO sollen die denn auf einen Knopf drücken, keine Ahnung was du eigentlich willst....


----------



## Illuvatar (19. Dez 2004)

Sein Problem:
Er hat irgendein Programm, da gibts einen Fehler und Bleiglanz (btw: schöner Avatar  ) will einen Fehlerbericht, in dem die IP-Adresse steht. Er will aber keinen Webserver.
Ich glaube, das ging irgendwie mit java.net.NetworkInterface. Das folgende Programm gibt bei mir aber nicht die gewünschte IP aus:

```
import java.net.*;
import java.util.*;

public class Networkinttest {

  public static void main(final String[] args) throws Exception {
    Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
    while (eni.hasMoreElements()){
      NetworkInterface ni = eni.nextElement();
      System.out.println("NetworkInterface: " + ni.getName());
      Enumeration<InetAddress> eia = ni.getInetAddresses();
      while (eia.hasMoreElements()){
        InetAddress ia = eia.nextElement();
        System.out.println("InetAddress: " + ia.getHostName() + "(" + ia.getHostAddress() + ")");
      }
    }
  }
}
```
Mehr weiß ich net.


----------



## zubi (19. Dez 2004)

So schwer kann das doch nicht zu verstehen sein: jeder der hinter einem Router sitzt hat eine externe (bei dynamischen vom ISP zugewiesen) und eine interne IP. Wenn ich nun zu einem PC hinter einem Router eine direkte Verbindung aufbauen will, brauche ich die externe IP (welche über ipconfig und ähnliches nicht ersichtlich ist). Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.


----------



## Grizzly (19. Dez 2004)

zubi hat gesagt.:
			
		

> So schwer kann das doch nicht zu verstehen sein: jeder der hinter einem Router sitzt hat eine externe (bei dynamischen vom ISP zugewiesen) und eine interne IP. Wenn ich nun zu einem PC hinter einem Router eine direkte Verbindung aufbauen will, brauche ich die externe IP (welche über ipconfig und ähnliches nicht ersichtlich ist). Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.



Ich würde auf dem Router - wenn das geht - einen dynamischen DNS Namen einrichten. Bspw. über DynDNS. Dann kannst Du einfach Dir die Adresse Deines Domain-Namens geben lassen.

Beispiel:
Dein DynDNS Domain-Namen: test.dyndns.org
DynDNS bekommt von Deinem Router bei jeder Neueinwahl ins Internet 'ne neue IP und meldet die DynDNS.org. Dort wird das dann eingetragen.
Deine IP (Beispiel): 81.82.83.84

Dann kannst Du Dir über die Klasse InetAddress über den Namen _test.dyndns.org_ die IP geben lassen. In dem Beispiel müsste dann die IP _81.82.83.84_ als Ergebnis herauskommen.


----------



## Bleiglanz (20. Dez 2004)

zubi du verstehst mich einfach nicht!



> Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.


klar, aber von wo aus????

ein client braucht ja nur eine einschlägige Webseite ansurfen (dnsstuff.com) und sieht sie in seinem Browser

Ich habe dich gefragt, WO WO WO soll der Client auf einen Knopf drücken? Hat der Client schon vorher irgendeine Verbindung zu dir? Ich check einfach nicht, was du willst; 

Entweder der Client hat schon einen Socket zu dir aufgebaut

=> kannst du über java.net.* seine IP rauskriegen

Der Client hat noch keinen Kontakt zu dir

=> muss er sich über eine "Webseite" oder anders seine "öffentliche IP" geben lassen



> Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.


Das geht so nicht, durch Rumwursteln am lokalen PC kann man diese Adresse nicht rauskriegen (der PC kennt ja nur den Gateway als ansprechpartner, und der macht NAT und sagt dir nichts davon)

Du musst also einen externen Dienst (HINTER dem Gateway) aufrufen, und dieser externe Dienst müsste dir dann die IP, die er sieht, zurückgeben.

WO soll dieser externe Dienst laufen?

WER soll ihn aufrufen?

WIE soll er aufgerufen werden?

ts ts ts


----------



## Guest (21. Dez 2004)

wir haben uns wohl beide missverstanden.



> ein client braucht ja nur eine einschlägige Webseite ansurfen (dnsstuff.com) und sieht sie in seinem Browser


genau das sollte mein programm machen: die ip des gateways, hinter welchem der client, der das progi startet, sitzt, soll ermittelt und an den aufrufenden (den gleichen) client zurückgesendet werden, damit sie z.b. in einer variable weiterverarbeitet werden kann. einfacher: die "arbeit" auf dnsstuff.com zu surfen und die ip manuell abschreiben, soll übernommen werden.
und da ich folgendes


> Webserver knows your real IP address (it has to, otherwise how will it return the page on your request?). Now all you need is the page returning REMOTE_HOST header.


gelesen habe, hatte ich das gefühl es sei mögich, jeden beliebigen webserver irgendwie ansprechen zu können und so via REMOTE_HOST an die ip zu kommen.



> Hat der Client schon vorher irgendeine Verbindung zu dir?


es geht überhaupt nicht darum, dass irgendwer eine verbindung zu mir macht. ich sagte nur, dass das ein anderer weg sei, mein problem zu lösen und dass so die ip problemlos über getRemoteSocketAddress() ermittelt werden könne. dann müsste aber jeder, der das programm ausführt, zu mir verbinden und ich ihm die ip seines gateways zurückschicken, was bedingen würde, dass mein pc immer läuft.

deshalb und wegen dem zitat hatte ich hoffnung, irgendeinen webserver dafür "missbrauchen" zu können.



> ts ts ts


ich schätze ja deine hilfe, solche bemerkungen sind meiner meinung nach jedoch überflüssig.

gruss,
zubi


----------



## Bleiglanz (22. Dez 2004)

>>genau das sollte mein programm machen: 

leider habe ich keine Ahnung, wo dein Programm laufen soll? Am Client? Als Applet?

Dann nimm doch dnsstuff.com, besorg die HTML-Seite über URLConnection und zerlege den String, bis du die IP hast - ist nicht weiter schwer, ist der Zeugs nach dem String

"You appear to be located in GERMANY, based on your IP of"


----------



## highlander78 (27. Apr 2006)

Funktioniert der Code bei euch, Ich bekomme als ausgabe " Fehler" in der Konsole



Mfg





			
				Illuvatar hat gesagt.:
			
		

> Weiß nicht, ob dir das was hilft, das hab ich mal im Forum gefunden, das löst es aber ein wenig anders:
> 
> ```
> import java.io.BufferedReader;
> ...


----------



## Murray (27. Apr 2006)

Die haben offenbar ihre Seite leicht modifiziert, dort steht jetzt "Your IP Is" anstelle von "Your IP is".
So sollte es gehen:

```
if( line.startsWith( "<h1>Your IP Is " ) ) { //--- "is" -> "Is"
```

Insgesamt ist das natürlich ein eher fragwürdiges Vorgehen; bei jeder Modifikation der HTML-Seite kann es passieren, dass dieser Code angepasst werden muss.


----------



## highlander78 (27. Apr 2006)

@Murray

Danke jetzt gehts!


Mfg


----------



## highlander78 (27. Apr 2006)

Hallo brauche bisschen Hilfe von euch.

Habe mir ein kleines Fenster erstellt in dem die IP Angezeigt werden sollte,
die von dem 2ten code in der Konsole ausgegeben wird.
Da ich ein totaler Anfänger bin bringe ich es nicht auf die reihe die Ausgabe  in dem erstellten
Text-Fenster zu ausgeben. Könnte dass vielleicht jemand von euch so abändern dass es Funktioniert,
damit ich ein Beispiel habe.Bin wirklich für jede Hilfe dankbar.Kämpfe schon sei Tagen damit..

DANKE




```
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
 

/**
 *
 * @author  Prymka
 */
public class MyIP extends javax.swing.JFrame {
    
    /** Creates new form MyIP */
    public MyIP() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextPane1 = new javax.swing.JTextPane();
        label1 = new java.awt.Label();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setViewportView(jTextPane1);

        label1.setFont(new java.awt.Font("Dialog", 0, 10));
        label1.setForeground(new java.awt.Color(0, 0, 0));
        label1.setText("MyIP -----");

        jLabel1.setText("My IP is:");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(label1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 128, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                        .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 59, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 20, Short.MAX_VALUE)
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 127, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(label1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 20, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(18, 18, 18)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jLabel1))
                .addContainerGap(20, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyIP().setVisible(true);
                       }
                    });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextPane jTextPane1;
    private java.awt.Label label1;

    private static Object String;

    private static Object e;
    // End of variables declaration
    

  public static  String getIP() { 
      String line = ""; 
            BufferedReader in = null; 
           int i = 0; 
      try { 
         URL getyouripurl = new URL( "http://www.whatismyip.com" ); 
         in = new BufferedReader( new InputStreamReader( getyouripurl 
               .openStream() ) ); 
      } catch( MalformedURLException e ) { 
         System.err.println( e ); 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      try { 
         while( ( line = in.readLine() ) != null ) { 
            if( line.startsWith( "<h1>Your IP Is " ) ) { 
               return line.substring( 14, ( line.length() - 5 ) ); 
            } 
            i++ ; 
         } 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      return "Fehler"; 
    } 
    
 }
```




```
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class IPbehindaRouter { 

   public static String getIP() { 
      String line = ""; 
      BufferedReader in = null; 
      int i = 0; 
      try { 
         URL getyouripurl = new URL( "http://www.whatismyip.com" ); 
         in = new BufferedReader( new InputStreamReader( getyouripurl 
               .openStream() ) ); 
      } catch( MalformedURLException e ) { 
         System.err.println( e ); 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      try { 
         while( ( line = in.readLine() ) != null ) { 
            if( line.startsWith( "<h1>Your IP Is " ) ) { 
               return line.substring( 14, ( line.length() - 5 ) ); 
            } 
            i++ ; 
         } 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      return "Fehler"; 
   } 
   public static void main (String[] args) 
   { 
         System.out.println(new IPbehindaRouter().getIP()); 
   } 
}
```


----------

