2009-03-05 9 views
23

estoy detrás de un router, necesito un simple comando para descubrir mi IP pública (en lugar de googlear Cuál es mi IP y haciendo clic en uno de los resultados)El descubrimiento de IP pública mediante programación

¿Hay alguna protocolos estándar para esto? He oído hablar de STUN pero no sé cómo puedo usarlo.

P.S. Estoy planeando escribir una secuencia de comandos corta de Python para hacerlo

Respuesta

8

EDIT: curlmyip.com ya no está disponible. (Maxywb gracias)

Post original:

Como de escribir este post, curlmyip.com obras. Desde la línea de comandos:

curl curlmyip.com 

Es un sitio web de terceros, que pueden o no estar disponibles un par de años en el camino. Pero por el momento, parece bastante simple y al grano.

+1

otro servicio más: 'curl icanhazip.com' – jfs

+0

Ahora está muerto. – maxywb

8

Cuando quiera hacer esto, simplemente rasparía whatismyip.org. Cuando va al sitio, le proporciona su IP pública de texto sin formato. Simple y simple.

Simplemente haga que su script acceda a ese sitio y lea la IP.

No sé si estaba implicando esto en su publicación o no, pero no es posible obtener su IP pública desde su propia computadora. Tiene que venir de una fuente externa.

2013 edit: Este sitio devuelve una imagen ahora en lugar de texto, por lo que es inútil para este propósito.

+0

agradable! ¡No sabía sobre este sitio! usualmente google aparece en un montón de sitios, cada uno de los cuales es grande y gordo, probablemente con una nota que dice ¡no use herramientas automatizadas! ¡pero esto es asombroso! gracias – hasen

+0

Hace que su programa dependa de un sitio externo que no controla (lo mismo con STUN, por supuesto, a menos que ejecute su propio servidor STUN) ... – bortzmeyer

+0

Iwhatismyip.org parece completamente roto: recibo la respuesta 192.168.2.1 que claramente no es mi IP pública ... – bortzmeyer

3

La manera más simple puede ser preguntarle a algún servidor en el exterior de su red.

Una cosa a tener en cuenta es que diferentes destinos pueden ver una dirección diferente para usted. El enrutador puede ser multihomed. Y realmente ahí es donde comienzan los problemas.

+0

Lo mismo si su ISP está haciendo un proxy –

+1

Completamente falso: hay un protocolo estándar, STUN, RFC 5389. – bortzmeyer

+0

Interesante: no estaba familiarizado con ese RFC. ¿Está ampliamente implementado? –

17

he hecho un programa que se conecta a http://automation.whatismyip.com/n09230945.asp se está escrito en D un alguien que consigue otra cosa que le diga lo que ven su IP como es probablemente la forma más fiable:

/* 
    Get my IP address 
*/ 


import tango.net.http.HttpGet; 
import tango.io.Stdout; 

void main() 
{ 
     try 
     { 
      auto page = new HttpGet ("http://automation.whatismyip.com/n09230945.asp"); 
      Stdout(cast(char[])page.read); 
     } 
     catch(Exception ex) 
     { 
      Stdout("An exception occurred"); 
     } 
} 

Editar código Python debe ser como:

from urllib import urlopen 
print urlopen('http://automation.whatismyip.com/n09230945.asp').read() 
+0

jeje me gusta tu nombre amigo! (por cierto, me encanta D) – hasen

+0

La URL se ha actualizado a http://automation.whatismyip.com/n09230945.asp; ver http://www.whatismyip.com/faq/automation.asp para las reglas. –

+0

, también le piden que agregue un agente de usuario de Mozilla según el faq - publicó una versión que lo hace en http://stackoverflow.com/questions/6452952/find-my-ip-address-in-python/10750359#10750359 (El ajuste con un excepto es una buena idea si va a confiar en este otro código) - https://gist.github.com/2786450 – Alvin

3

Si la red dispone de un servidor UPnP que se ejecutan en la puerta de entrada que son capaces de comunicarse con la pasarela y pregunte por su dirección IP externa.

11

Targeting www.whatsmyip.org es grosero. Ellos dicen que no hagan eso en la página.

Solo un sistema en el mismo nivel de NAT que su objetivo verá la misma IP. Por ejemplo, su aplicación puede estar detrás de varias capas de NAT (esto sucede más a medida que se aleja de los EE. UU., Donde está el exceso de IP).

STUN es de hecho el mejor método. En general, debe planear ejecutar un servidor (STUN) en alguna parte que su aplicación puede pedir: no codifique los servidores de otras personas. Debe codificar para enviar algunos mensajes específicos como se describe en rfc5389.

Sugiero una buena lectura de, y enlaces relacionados. http://www.ietf.org/html.charters/behave-charter.html

Es posible que prefiera mirar IPv6 y Teredo para asegurarse de que siempre tenga acceso a IPv6. (Microsoft Vista lo hace muy fácil, me dijeron)

+1

Parece que a whatsmyip no le molestan las búsquedas automáticas siempre y cuando siga algunas reglas: http://forum.whatismyip.com/f14/. Si rompes las reglas de lo que puedes prohibir. –

+0

el sitio sugerido por ryeguy es diferente .. lo que * es * .. no lo que * s * .. mykp.org – hasen

+3

No veo tales súplicas en whatismyip.org. ¿De qué página estás hablando? – Brian

21

Esta puede ser la forma más fácil.Analice la salida de los siguientes comandos:

  1. ejecute un traceroute para encontrar un enrutador que esté a menos de 3 saltos de su máquina.
  2. ejecutar ping con la opción de grabar la ruta fuente y analizar la salida. La primera dirección IP en la ruta registrada es la pública.

Por ejemplo, estoy en una máquina con Windows, pero la misma idea debería funcionar desde Unix también.

> tracert -d www.yahoo.com 

Tracing route to www-real.wa1.b.yahoo.com [69.147.76.15] 
over a maximum of 30 hops: 

    1 <1 ms <1 ms <1 ms 192.168.14.203 
    2  *  *  *  Request timed out. 
    3  8 ms  8 ms  9 ms 68.85.228.121 
    4  8 ms  8 ms  9 ms 68.86.165.234 
    5 10 ms  9 ms  9 ms 68.86.165.237 
    6 11 ms 10 ms 10 ms 68.86.165.242 

El 68.85.228.121 es un enrutador Comcast (mi proveedor). Podemos hacer ping a:

> ping -r 9 68.85.228.121 -n 1 

Pinging 68.85.228.121 with 32 bytes of data: 

Reply from 68.85.228.121: bytes=32 time=10ms TTL=253 
    Route: 66.176.38.51 -> 
      68.85.228.121 -> 
      68.85.228.121 -> 
      192.168.14.203 

Voila! El 66.176.38.51 es mi IP pública.

+2

+1: tal vez no sea la manera más fácil, pero es bueno ver una forma que no dependa de un sitio web. –

+1

+2. buena respuesta, de hecho – Sujoy

+3

Pero tenga en cuenta que "Muchos hosts ignoran o descartan la opción RECORD_ROUTE". Ver hombre ping. – kkurian

1

otra manera descarada: si el router tiene la opción de actualizar su web IP en DynDNS, puede Obtenga su propia IP con algo como:

IP=`resolveip -s myalias.dyndns-home.com` 
+0

Cheeky de hecho: si tiene un servicio de DNS dinámico, probablemente no * necesita * encontrar su dirección IP externa, ¡simplemente use el nombre en su lugar!Eso es * exactamente * para lo que son tales servicios: P – MestreLion

3

para obtener su IP externa, se puede hacer una consulta DNS a un servidor opendns con el nombre de host especial "myip.opendns.com":

from subprocess import check_output 

ip = check_output(["dig", "+short", "@resolver1.opendns.com", 
        "myip.opendns.com"]).decode().strip() 

En Windows, usted podría intentar nslookup.

No hay ningún módulo dns en Python stdlib que permita especificar el servidor dns personalizado. Puede usar bibliotecas de terceros, p., Twisted para hacer la consulta DNS:

from twisted.internet  import task # $ pip install twisted 
from twisted.names.client import Resolver 
from twisted.python.util import println 

def main(reactor): 
    opendns_resolvers = [("208.67.222.222", 53), ("208.67.220.220", 53)] 
    resolver = Resolver(servers=opendns_resolvers, reactor=reactor) 
    # use magical hostname to get our public ip 
    return resolver.getHostByName('myip.opendns.com').addCallback(println) 
task.react(main) 

Ésta es la misma utilizando dnspython library:

import dns.resolver # $ pip install dnspython 

resolver = dns.resolver.Resolver(configure=False) 
resolver.nameservers = ["208.67.222.222", "208.67.220.220"] 
print(resolver.query('myip.opendns.com')[0]) 
0

Duck Duck Go da libre acceso a su API de acuerdo con su propia página aquí: https://duckduckgo.com/api

Aquí está la URL que aparece si quiere su dirección IP: http://api.duckduckgo.com/?q=my+ip&format=json

que devuelve un objeto JSON. El atributo Answer tiene una cadena legible por humanos con su dirección IP. Ejemplo:

{ 
    ... 
    "Answer": "Your IP address is ww.xx.yyy.zzz in <a href=\"http://open.mapquest.com/?q=aaaaa(bbbbb)\">aaaaa(bbbbb)</a>" 
    ... 
} 

Usted puede extraer la dirección IP de ese cadena utilizando split()[4], si se piensa que es una suposición segura que esta cadena no va a cambiar o que está dispuesto a necesitar para fijar periódicamente.

Alternativamente, si desea tener un método más a prueba de futuro, puede recorrer todo lo devuelto por split() y devolver el primer elemento que sea una dirección IP. Ver aquí para la validación de direcciones IP: How to validate IP address in Python?

6

me gusta la ipify.org:

  • que es libre de usar (incluso mediante programación e incluso el tráfico pesado)
  • respuesta contiene sólo la dirección IP sin ningún tipo de basura (sin es necesario analizar los)
  • también se puede solicitar en la respuesta JSON
  • obras para IPv4 e IPv6
  • es
  • alojada en la nube
  • es de código abierto
$ curl api.ipify.org 
167.220.196.42 

$ curl "api.ipify.org?format=json" 
{"ip":"167.220.196.42"} 
+0

https://ipify.org/ no funciona: la página no se está cargando. –

+1

Está funcionando perfectamente. Si sospecha que algún sitio web no funciona, intente primero con algún servicio como http://downforeveryoneorjustme.com/ipify.org. –

+0

¡Tienes razón! ¡Ese es un gran consejo con el enlace! –

-1

curl api.infoip.io - detalles

curl api.infoip.io/ip - sólo la dirección IP

curl api.infoip.io/country - simplemente el nombre del país

.. .y más de lo mismo

puedes consulte los documentos en http://docs.ciokan.apiary.io/

0

Te estoy compartiendo mi método de recuperación de la dirección IP pública de un servidor sin tener que utilizar las API externas (que es un riesgo para la seguridad, por supuesto)

INTERFACE=`ip route get 8.8.8.8 | grep 8.8.8.8 | cut -d' ' -f5` 
HOSTIP=`ifconfig $INTERFACE | grep "inet " | awk -F'[: ]+' '{ print $4 }'` 

O en Python, si lo prefiere:

import subprocess 
public_ip = subprocess.check_output(["ifconfig `ip route get 8.8.8.8 | grep 8.8.8.8 | cut -d' ' -f5` | grep \'inet \' | awk -F'[: ]+' '{ print $4 }'"], shell=True) 

funciona así:

  • determina la mejor interfaz para acceder al servidor DNS Google
  • greps IP pública desde la entrada ifconfig para esa interfaz
Cuestiones relacionadas