Обнаружение общедоступного IP-программ

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

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

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

Ответ 1

EDIT: curlmyip.com больше не доступен. (спасибо maxywb)

Оригинальное сообщение:

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

curl curlmyip.com

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

Ответ 2

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

  • запустите traceroute, чтобы найти маршрутизатор, который меньше 3 ударов с вашего устройства.
  • запустить 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 что:

> 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! 66.176.38.51 - это мой публичный IP.

Ответ 3

Я создал программу, которая подключается к 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()

Ответ 4

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

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

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

Я предлагаю хорошее чтение и связанные ссылки. http://www.ietf.org/html.charters/behave-charter.html

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

Ответ 5

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

Просто запустите ваш script доступ к этому сайту и прочитайте IP-адрес.

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

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

Ответ 6

Мне нравится 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"}

Ответ 8

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

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

Ответ 9

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

Ответ 10

Чтобы получить внешний 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])

Ответ 11

другой нахальный способ: если у вашего маршрутизатора есть возможность обновить его IP-адрес на DynDNS, вы можете получить свой собственный IP-адрес с чем-то вроде:

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

Ответ 12

Duck Duck Go дает бесплатный доступ к их API в соответствии со своей собственной страницей здесь: https://duckduckgo.com/api

Здесь URL-адрес, который вы нажимаете, если вы хотите получить свой IP-адрес: http://api.duckduckgo.com/?q=my+ip&format=json

Возвращает объект JSON. Атрибут Answer имеет читаемую пользователем строку с вашим IP-адресом. Пример:

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

Вы можете извлечь ip-адрес из этой строки, используя split()[4], если вы считаете, что это безопасное предположение о том, что эта строка никогда не изменится или вы не захотите периодически ее исправлять.

В качестве альтернативы, если вы хотите иметь более перспективный метод доказательства, вы можете перебрать все, возвращаемое split(), и вернуть первый элемент, являющийся ip-адресом. См. Здесь для проверки IP-адресов: Как проверить IP-адрес в Python?

Ответ 13

Я делюсь с вами своим методом получения общедоступного IP-адреса сервера без необходимости использования внешних API (что, конечно же, является риском для безопасности)

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 }'`

Или в python, если вы предпочитаете:

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)

Он работает следующим образом:

  • определяет лучший интерфейс для доступа к серверу dns.
  • grep public IP из записи ifconfig для этого интерфейса

Ответ 14

curl api.infoip.io - полная информация

curl api.infoip.io/ip - только адрес ip

curl api.infoip.io/country - только название страны

... и больше того же

вы можете просмотреть документы в http://docs.ciokan.apiary.io/