質問
私はルーターの背後にいるので、パブリック IP を検出するための簡単なコマンドが必要です (私の IP を検索して結果をクリックする代わりに)
これに関する標準プロトコルはありますか?STUN について聞いたことはありますが、どうやって使用すればよいのかわかりません。
追伸それを行うための短いPythonスクリプトを書くつもりです
解決
編集:curlmyip.comは使用できなくなりました。 (maxywbに感謝)
元の投稿:
この投稿を書いている時点で、curlmyip.comは機能しています。コマンドラインから:
curl curlmyip.com
これはサードパーティのウェブサイトであり、数年後に利用可能になる場合とされない場合があります。しかし、当分の間、それは非常にシンプルで、要点まで見えます。
他のヒント
これが最も簡単な方法かもしれません。次のコマンドの出力を解析します。
- トレースルートを実行して、マシンから 3 ホップ以内にあるルーターを見つけます。
- ソースルートを記録し、出力を解析するオプションを指定して ping を実行します。記録されたルートの最初の IP アドレスはパブリック 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 は私のパブリック 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は確かに最良の方法です。 一般に、(STUN)サーバーをどこかで実行することを計画する必要があります。 アプリケーションは、他の人のサーバーをハードコーディングしないでください。あなたはコーディングする必要があります rfc5389で説明されている特定のメッセージを送信します。
関連するリンクをよく読むことをお勧めします。 http://www.ietf.org/html.charters/behave-charter.html
IPv6とTeredoを見て、常にIPv6にアクセスできるようにすることをお勧めします。 (Microsoft Vistaはこれを非常に簡単にします、と言われています)
これを行いたいときはいつでも、 whatismyip.org をスクレイピングするだけです。サイトにアクセスすると、プレーンテキストのパブリックIPが提供されます。シンプルでシンプル。
スクリプトにそのサイトにアクセスしてIPを読み取らせるだけです。
投稿でこれを暗示しているかどうかはわかりませんが、自分のコンピューターからパブリックIPを取得することはできません。外部ソースから取得する必要があります。
2013 edit:このサイトはテキストではなく画像を返すため、この目的には役に立たない。
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"}
複数の人が述べているように、 STUN は確かに適切なソリューションです。
- 公開STUNサーバー のリスト
- フリーソフトウェア STUNクライアント
- STUN標準
ネットワークのゲートウェイでUpNpサーバーが実行されている場合、ゲートウェイと通信して外部IPアドレスを要求できます。
最も簡単な方法は、ネットワークの外部にあるサーバーに問い合わせることです。
留意すべきことの1つは、宛先ごとに異なるアドレスが表示される場合があるということです。ルーターはマルチホームである可能性があります。そして、まさにそこから問題が始まります。
外部IPを取得するには、特別なホスト名&quot; myip.opendns.com&quot;を使用して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モジュールはありません。 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
ライブラリを使用した場合も同じです:
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])
別の生意気な方法: ルーターに DynDNS でWeb IPを更新するオプションがある場合、次のような独自のIPを取得できます。 :
IP=`resolveip -s myalias.dyndns-home.com`
Duck Duck Goは、以下の独自のページに従って、APIに無料でアクセスできます。 https://duckduckgo.com/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()
によって返されるすべてをループして、IPアドレスである最初のアイテムを返すことができます。 IPアドレスの検証については、こちらをご覧ください。
PythonでIPアドレスを検証する方法
curl api.infoip.io
-完全な詳細
curl api.infoip.io/ip
-IPアドレスのみ
curl api.infoip.io/country
-国名のみ
...および同じもの
http://docs.ciokan.apiary.io/ でドキュメントを表示できます。
外部APIを使用せずにサーバーのパブリックIPアドレスを取得する方法を共有しています(もちろんセキュリティ上のリスクです)
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)
次のように機能します:
- Google DNSサーバーに到達するための最適なインターフェースを決定する
- そのインターフェイスの
ifconfig
エントリからパブリックIPを取得
独自の「サーバーレス」をホストするのは今ではかなり安価ですAPI。すべての主要なクラウドプロバイダーがこのためのサービスを提供しています。たとえば、Google Cloud Functionsを使用するのに必要なことは次のとおりです。
exports.requestIP = (req, res) => {
res.status(200).send(req.ip)
}
このアプローチは、おそらく上記のパブリックサービスを使用するよりも信頼性が高く、関数名に長いランダムな文字列を追加してプライベートにすることができます。