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

StackOverflow https://stackoverflow.com/questions/613471

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Существуют ли какие-либо стандартные протоколы для этого?Я слышал об ОГЛУШЕНИИ, но я не знаю, как я могу его использовать?

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

Это было полезно?

Решение

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

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

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

curl curlmyip.com

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

Другие советы

Возможно, это самый простой способ.Проанализируйте выходные данные следующих команд:

  1. запустите трассировку, чтобы найти маршрутизатор, который находится менее чем в 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.

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

Нацеливание www.whatsmyip.org это грубо.Они умоляют не делать этого на странице.

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

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

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

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

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

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

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

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

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

Как упоминалось несколькими людьми, ОГЛУШИТЬ это действительно правильное решение.

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

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

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

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

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])

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

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

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?

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

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

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

...и еще больше того же самого

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

Я делюсь с вами своим методом получения общедоступного 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-серверу Google
  • greps общедоступный IP-адрес из ifconfig запись для этого интерфейса

Сейчас довольно дешево разместить свой собственный "бессерверный" API.У всех крупных облачных провайдеров есть сервис для этого.Например, при использовании облачных функций Google все, что для этого требуется, это:

exports.requestIP = (req, res) => {
    res.status(200).send(req.ip)
}

Этот подход, вероятно, более надежен, чем использование общедоступных сервисов, описанных выше, и вы можете добавить длинную случайную строку к имени функции, чтобы сохранить ее в тайне.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top