Обнаружение общедоступного 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"}
Ответ 7
Как упоминалось несколькими людьми, STUN действительно является правильным решением.
Ответ 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/