私はルーターの背後にいます。パブリック IP を検出するための簡単なコマンドが必要です (私の IP をグーグル検索して結果をクリックするのではなく)
このための標準プロトコルはありますか? STUN について聞いたことがありますが、どのように使用すればよいかわかりません。
PS私はそれを行うための短いpythonスクリプトを書くことを計画しています
私はルーターの背後にいます。パブリック IP を検出するための簡単なコマンドが必要です (私の IP をグーグル検索して結果をクリックするのではなく)
このための標準プロトコルはありますか? STUN について聞いたことがありますが、どのように使用すればよいかわかりません。
PS私はそれを行うための短いpythonスクリプトを書くことを計画しています
私は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()
私はipify.orgが好きです:
$ curl api.ipify.org
167.220.196.42
$ curl "api.ipify.org?format=json"
{"ip":"167.220.196.42"}
www.whatsmyip.org をターゲットにするのは失礼です。彼らはページでそれをしないように嘆願します。
ターゲットと同じレベルの NAT にあるシステムのみが同じ IP を認識します。たとえば、アプリケーションが複数の NAT レイヤーの背後にある場合があります (これは、IP が過剰に存在する米国から離れるにつれて、より多く発生します)。
STUN は確かに最良の方法です。一般に、アプリケーションが要求できる場所で (STUN) サーバーを実行することを計画する必要があります。他の人のサーバーをハードコーディングしないでください。rfc5389 で説明されているように、いくつかの特定のメッセージを送信するようにコーディングする必要があります。
よく読んで、関連するリンクをお勧めします。 http://www.ietf.org/html.charters/behave-charter.html
IPv6 と Teredo を調べて、常に IPv6 にアクセスできるようにすることをお勧めします。(Microsoft Vista ではこれが非常に簡単になっていると聞いています)
何人かの人々が述べたように、STUNは確かに適切な解決策です。
pynat
Pythonモジュールを使用したコード例を次に示します。
>>> import pynat
>>> pynat.get_ip_info()
('UDP Firewall', '192.0.2.2', 54320)
これをやりたいときはいつでも、whatismyip.orgをスクレイピングします。サイトにアクセスすると、プレーン テキストのパブリック IP が表示されます。簡潔でシンプル。
スクリプトでそのサイトにアクセスし、IP を読み取るだけです。
投稿でこれをほのめかしていたかどうかはわかりませんが、自分のコンピューターからパブリック IP を取得することはできません。外部ソースから取得する必要があります。
2013 年編集: このサイトはテキストではなく画像を返すようになったため、この目的には役に立ちません。
編集: curlmyip.com は利用できなくなりました。(maxywb に感謝)
元の投稿:
この投稿を書いている時点で、curlmyip.com は動作します。コマンドラインから:
curl curlmyip.com
これはサードパーティの Web サイトであり、数年後には利用可能になる場合と利用できない場合があります。しかし、当分の間、それは非常に単純で要点のように思えます。
最も簡単な方法は、ネットワークの外部にあるサーバーに問い合わせることです。
覚えておくべきことの1つは、宛先が異なれば、住所も異なる可能性があるということです。ルータはマルチホームである可能性があります。そして実際、そこから問題が始まります。
外部 IP を取得するには、特別なホスト名「myip.opendns.com」を使用して、opendns サーバーへの dns クエリを作成できます。
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 クエリを作成するために、 Twistedなどのサードパーティ ライブラリを使用できます。
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])
libraryasyncio
を使用したバリアントは次のとおりです。aiodns
$ pipenv install aiodns
$ pipenv run python -m asyncio
...
>>> import asyncio
>>> import aiodns # pip install aiodns
>>> resolver = aiodns.DNSResolver()
>>> resolver.nameservers = "208.67.222.222", "208.67.220.220"
>>> await resolver.query("myip.opendns.com", "A")
[<ares_query_a_result> host=192.0.2.2, ttl=0]
IPv6 アドレスを取得するには:
>>> resolver.nameservers = "2620:119:35::35", "2620:119:53::53"
>>> await resolver.query("myip.opendns.com", "AAAA")
ネットワークのゲートウェイで UpNp サーバーが実行されている場合、ゲートウェイと通信して外部 IP アドレスを要求できます。
Duck Duck Go は、 https ://duckduckgo.com/api の独自のページに従って、API への無料アクセスを提供します 。
IP アドレスが必要な場合にヒットする URL は次のとおりです: 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 アドレスの検証については、こちらを参照してください:
Python で IP アドレスを検証するには?
別の生意気な方法: ルーターにDynDNSの Web IP を更新するオプションがある場合、次のような方法で独自の IP を取得できます。
IP=`resolveip -s myalias.dyndns-home.com`