我在路由器後面,我需要一個簡單的命令,以發現我的公網IP(而不是谷歌搜索什麼是我的IP,然後點擊一個結果)發現公共IP編程
是否有這方面的任何標準協議?我聽說過STUN,但我不知道如何使用它?
P.S.我打算寫一個簡短的python腳本來做到這一點
我在路由器後面,我需要一個簡單的命令,以發現我的公網IP(而不是谷歌搜索什麼是我的IP,然後點擊一個結果)發現公共IP編程
是否有這方面的任何標準協議?我聽說過STUN,但我不知道如何使用它?
P.S.我打算寫一個簡短的python腳本來做到這一點
編輯:curlmyip.com已不存在。 (感謝maxywb)
原貼:
至於寫這篇文章的,curlmyip.com工作。從命令行:
curl curlmyip.com
這是一個第三方網站,可能會或可能不會在幾年後提供。但就目前而言,這似乎非常簡單,重要。
每當我想這樣做,我只會刮whatismyip.org。當您訪問該網站時,它會爲您提供純文本公共IP。乾淨利落。
只需讓腳本訪問該站點並閱讀IP即可。
我不知道你是否在你的文章中暗示這一點,但它不可能從你自己的計算機上獲得你的公共IP。它必須來自外部來源。
2013編輯:這個網站現在返回一個圖片而不是文本,所以這對於這個目的沒用。
最簡單的方法可能是詢問網絡外部的某個服務器。
有一點要記住的是,不同的目的地可能會爲你看到不同的地址。路由器可能是多宿主的。這真的就是問題出現的地方。
我已經連接到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()
如果網絡網關上運行的UPNP服務器,你很談得來到網關並請它替你之外的IP地址。
針對www.whatsmyip.org是粗魯。他們請求不要在頁面上做到這一點。
只有與您的目標NAT相同級別的系統纔會看到相同的IP。例如,您的應用程序可能位於多個NAT層之後(這種情況發生在遠離美國,IP層過多的地方)。
STUN確實是最好的方法。 通常,您應該計劃在某處應用程序可以請求的地方運行(STUN)服務器:不要硬編碼其他人的服務器。你必須編碼 發送一些特定的消息,如rfc5389所述。
我建議一個很好的閱讀和相關鏈接。 http://www.ietf.org/html.charters/behave-charter.html
您可能更願意查看IPv6和Teredo以確保您始終擁有IPv6訪問權限。 (微軟Vista讓這很容易,我被告知)
這可能是最簡單的方法。解析以下命令的輸出:
例如,我在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是我的公有知識產權。
正如幾個人提到的那樣,STUN確實是正確的解決方案。
另一面露方式: 如果你的路由器已經得到了更新期權的網絡IP上DynDNS,你可以用類似的東西得到你自己的IP:
IP=`resolveip -s myalias.dyndns-home.com`
爲了讓您的外部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])
鴨鴨去給人根據自己的頁面在這裏他們的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?
我喜歡ipify.org:
$ curl api.ipify.org
167.220.196.42
$ curl "api.ipify.org?format=json"
{"ip":"167.220.196.42"}
curl api.infoip.io
- 全部細節
curl api.infoip.io/ip
- 只是IP地址
curl api.infoip.io/country
- 只有國名
.. 。與以上相同
查看文檔,我分享你我的檢索服務器的公網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)
它的工作原理是這樣的:
ifconfig
進入該接口
漂亮最好的界面!我不知道這個網站!通常谷歌會出現一堆網站,每個網站都很大很胖,可能有一張紙條說不要使用自動化工具!但這太棒了!謝謝 – hasen 2009-03-05 03:23:56
它使你的程序依賴於你不控制的外部網站(當然,除非你運行你自己的STUN服務器,同樣的事情)... – bortzmeyer 2009-03-09 21:49:39
Iwhatismyip.org似乎完全破碎:我得到的答案是192.168.2.1這顯然不是我的公共IP ... – bortzmeyer 2009-03-09 21:56:02