2009-03-05 95 views
23

我在路由器後面,我需要一個簡單的命令,以發現我的公網IP(而不是谷歌搜索什麼是我的IP,然後點擊一個結果)發現公共IP編程

是否有這方面的任何標準協議?我聽說過STUN,但我不知道如何使用它?

P.S.我打算寫一個簡短的python腳本來做到這一點

回答

8

編輯:curlmyip.com已不存在。 (感謝maxywb)

原貼

至於寫這篇文章的,curlmyip.com工作。從命令行:

curl curlmyip.com 

這是一個第三方網站,可能會或可能不會在幾年後提供。但就目前而言,這似乎非常簡單,重要。

8

每當我想這樣做,我只會刮whatismyip.org。當您訪問該網站時,它會爲您提供純文本公共IP。乾淨利落。

只需讓腳本訪問該站點並閱讀IP即可。

我不知道你是否在你的文章中暗示這一點,但它不可能從你自己的計算機上獲得你的公共IP。它必須來自外部來源。

2013編輯:這個網站現在返回一個圖片而不是文本,所以這對於這個目的沒用。

+0

漂亮最好的界面!我不知道這個網站!通常谷歌會出現一堆網站,每個網站都很大很胖,可能有一張紙條說不要使用自動化工具!但這太棒了!謝謝 – hasen 2009-03-05 03:23:56

+0

它使你的程序依賴於你不控制的外部網站(當然,除非你運行你自己的STUN服務器,同樣的事情)... – bortzmeyer 2009-03-09 21:49:39

+0

Iwhatismyip.org似乎完全破碎:我得到的答案是192.168.2.1這顯然不是我的公共IP ... – bortzmeyer 2009-03-09 21:56:02

3

最簡單的方法可能是詢問網絡外部的某個服務器。

有一點要記住的是,不同的目的地可能會爲你看到不同的地址。路由器可能是多宿主的。這真的就是問題出現的地方。

17

我已經連接到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() 
3

如果網絡網關上運行的UPNP服務器,你很談得來到網關並請它替你之外的IP地址。

11

針對www.whatsmyip.org是粗魯。他們請求不要在頁面上做到這一點。

只有與您的目標NAT相同級別的系統纔會看到相同的IP。例如,您的應用程序可能位於多個NAT層之後(這種情況發生在遠離美國,IP層過多的地方)。

STUN確實是最好的方法。 通常,您應該計劃在某處應用程序可以請求的地方運行(STUN)服務器:不要硬編碼其他人的服務器。你必須編碼 發送一些特定的消息,如rfc5389所述。

我建議一個很好的閱讀和相關鏈接。 http://www.ietf.org/html.charters/behave-charter.html

您可能更願意查看IPv6和Teredo以確保您始終擁有IPv6訪問權限。 (微軟Vista讓這很容易,我被告知)

21

這可能是最簡單的方法。解析以下命令的輸出:

  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通:

> 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是我的公有知識產權。

1

另一面露方式: 如果你的路由器已經得到了更新期權的網絡IP上DynDNS,你可以用類似的東西得到你自己的IP:

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

爲了讓您的外部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]) 
0

鴨鴨去給人根據自己的頁面在這裏他們的API免費接入: https://duckduckgo.com/api

如果您想要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>" 
    ... 
} 

您可以通過使用split()[4]從字符串的IP地址,如果你認爲它是一個安全的假設,這個字符串永遠不會改變,或者你願意爲需要定期修復它。

或者,如果你想有一個更有前途的證明方法,你可以遍歷所有由split()返回的一切,並返回第一個是ip地址的項目。看到這裏的驗證IP地址: How to validate IP address in Python?

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"} 
-1

curl api.infoip.io - 全部細節

curl api.infoip.io/ip - 只是IP地址

curl api.infoip.io/country - 只有國名

.. 。與以上相同

你可以在http://docs.ciokan.apiary.io/

0

查看文檔,我分享你我的檢索服務器的公網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公網IP從ifconfig進入該接口