インターネットから見たネットワークの IP アドレスをプログラムで取得するにはどうすればよいですか? これは明らかに、ルーターが ISP に接続するときにアクセスできるプロパティです。標準プロトコルを使用してルーターからこの情報を取得する方法はありますか? 私の唯一の他のオプションは、私の IP アドレスを返す WS を見つけること (驚くほど難しいこと) か、whatismyip.comのようなものにアクセスして、すべての HTML を削除することです (非常に汚れていて、変更されやすい)。他に方法はありますか???
4 に答える
whatismyip.com をスクレイピングしないでください。アドレスを返すだけの API を呼び出す方法については、こちらを参照してください。
これを使用しない場合は、そのようなものを自分で作成する必要があります。つまり、見かけのアドレスを報告できるルーターの先のホストです。
次の理由により、Web サーバーが実際の WAN IP アドレスを認識しない場合があることに注意してください。
ISP が HTTP トラフィックを透過的にプロキシしている可能性があり、サーバーはプロキシの IP を認識します。その場合、通常はX-Forwarded-Forヘッダーを探して解析する必要があります 。
または、Olaf が指摘したように、あなたと広く開かれたインターネットの間に別の NAT ルーターがある可能性があります。つまり、あなたのルーターの WAN アドレスはプライベート ネットワーク上にあります。whatismyip.com のようなサービスから得られる最高のものは、最も外側の NAT ルーターの IP です。
ルーターがsnmpをサポートしている場合、それを使用して外部IPについて尋ねることができます。小さな例がここにあります:
ポール・ディクソンの回答は完全に見えたので投票しましたが、これにはもう1つの側面があります。
- ご利用の ISP がプライベート アドレスを提供している場合があります。これは一部の ISP で発生します。期待するものによっては、持っていないルーティング可能なアドレスが必要になる場合があります
- Paul が言及しているプロキシ情報 (HTTP-Header X-Forwarded-For) は、プロキシを使用している場合、ルーティングできないアドレスである可能性があります。
- これらすべての側面 (ISP からルーティング不可能なアドレスを取得し、自分でプロキシを使用する) を組み合わせると、奇妙な結果が得られる可能性があります。
これらの側面は一般的な日常の状況ではありませんが、ニーズによってはこれらを考慮に入れる必要がある場合があります。
言語仕様は表示されませんが、ここで Python で実行しました: Finding a publicfacing IP address in Python?
基本的に、外部サーバーに依存せずにそれを行う方法はありません。この場合、IP アドレスのみを提供するhttp://www.whatismyip.com/automation/n09230945.aspを使用します。または、PHP で次のような独自のスクリプトを使用することもできます。
<?php
echo $_SERVER['REMOTE_ADDR'];
?>