Обнаружение публичного IP программно - PullRequest
26 голосов
/ 05 марта 2009

Я за роутером, мне нужна простая команда, чтобы обнаружить мой публичный ip (вместо того, чтобы гуглить, какой у меня ip и нажимать один из результатов)

Существуют ли стандартные протоколы для этого? Я слышал о STUN, но не знаю, как я могу его использовать?

P.S. Я планирую написать короткий скрипт на Python, чтобы сделать это

Ответы [ 15 ]

23 голосов
/ 05 марта 2009

Это может быть самый простой способ. Разобрать выходные данные следующих команд:

  1. запустите traceroute, чтобы найти маршрутизатор, который находится менее чем в 3 прыжках от вашей машины.
  2. запустить ping с возможностью записи исходного маршрута и анализа выходных данных. Первый IP-адрес в записанном маршруте является вашим общедоступным.

Например, я на Windows-машине, но та же идея должна работать и в Unix.

> 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

68.85.228.121 - это маршрутизатор Comcast (мой провайдер). Мы можем пинговать это:

> 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

Вуаля! 66.176.38.51 - мой публичный IP.

17 голосов
/ 05 марта 2009

Я сделал программу, которая подключается к http://automation.whatismyip.com/n09230945.asp это написано на D, заставляя кого-то другого сказать вам, что они видят ваш ip как, вероятно, самый надежный способ:

/*
    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");
      }
}

Редактировать код Python должен выглядеть так:

from urllib import urlopen
print urlopen('http://automation.whatismyip.com/n09230945.asp').read()
11 голосов
/ 05 марта 2009

Таргетинг www.whatsmyip.org - это грубо. Они просят не делать этого на странице.

Только система на том же уровне NAT, что и ваша цель, увидит тот же IP. Например, ваше приложение может находиться за несколькими уровнями NAT (это происходит чаще, когда вы уезжаете из США, где есть избыток IP-адресов).

STUN действительно лучший метод. В общем, вы должны планировать запуск сервера (STUN) где-нибудь Приложение может спросить: не жестко кодировать чужие серверы. Вы должны кодировать отправить некоторые конкретные сообщения, как описано в rfc5389.

Предлагаю прочитать и ссылки по теме. http://www.ietf.org/html.charters/behave-charter.html

Вы можете предпочесть IPv6 и Teredo, чтобы убедиться, что у вас всегда есть доступ к IPv6. (Microsoft Vista делает это очень легко, мне сказали)

8 голосов
/ 05 марта 2009

Всякий раз, когда я хотел сделать это, я просто очищал whatismyip.org . Когда вы заходите на сайт, он дает вам ваш открытый текстовый IP-адрес. Просто и понятно.

Просто ваш скрипт должен зайти на этот сайт и прочитать IP.

Я не знаю, подразумевали ли вы это в своем посте или нет, но получить общедоступный IP-адрес с вашего компьютера невозможно. Он должен исходить из внешнего источника.

2013 г. edit: этот сайт теперь возвращает изображение вместо текста, поэтому для этой цели он бесполезен.

7 голосов
/ 10 февраля 2016

Мне нравится ipify.org :

  • это бесплатно для использования (даже программно и даже интенсивный трафик)
  • ответ содержит только IP-адрес без мусора (нет необходимости в разборе)
  • Вы также можете запросить ответ в формате JSON
  • работает как для IPv4, так и для IPv6
  • размещено в облаке
  • это открытый исходный код
$ curl api.ipify.org
167.220.196.42

$ curl "api.ipify.org?format=json"
{"ip":"167.220.196.42"}
7 голосов
/ 22 мая 2013

РЕДАКТИРОВАТЬ : curlmyip.com больше не доступен. (спасибо maxywb)

Исходное сообщение :

На момент написания этого поста, curlmyip.com работает. Из командной строки:

curl curlmyip.com

Это сторонний веб-сайт, который может быть недоступен через пару лет. Но пока это кажется довольно простым и конкретным.

5 голосов
/ 10 марта 2009

Как уже упоминали несколько человек, STUN действительно является правильным решением.

3 голосов
/ 27 февраля 2014

Чтобы получить ваш внешний ip, вы можете сделать запрос DNS на сервер opendns со специальным именем хоста "myip.opendns.com":

from subprocess import check_output

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

В Windows вы можете попробовать nslookup.

В Python stdlib отсутствует модуль dns, который позволял бы указывать пользовательский dns-сервер. Вы можете использовать сторонние библиотеки, например, Twisted , чтобы сделать запрос 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)

Вот то же самое, используя 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])
3 голосов
/ 05 марта 2009

Если в сети есть сервер UpNp, работающий на шлюзе, вы можете связаться со шлюзом и запросить у него внешний IP-адрес.

3 голосов
/ 05 марта 2009

Самым простым способом может быть запросить какой-либо сервер вне вашей сети.

Следует иметь в виду, что разные пункты назначения могут видеть для вас разные адреса. Маршрутизатор может быть многосетевым. И действительно, именно здесь начинаются проблемы.

...