ルーターのWAN側アドレスの表示 プログラムから行う方法も解説!
以前、ルーターのWAN側アドレスを知る方法を解説する記事を書きました。本日は、その続編です。プログラミング的な内容になっております。
以前の記事はこちらでご覧ください↓
ちなみに、あなたが、アクセスしてきているIPv4アドレス(WAN側アドレス)は以下のアドレスです。
18.191.97.229テック大家さんのサーバーでも表示
以前の記事では、cman.jpさんのサーバ上でWAN側IPアドレスが表示できるよ、という説明をしました。
しくみは、以下のようになっています。
LAN内部のクライアント(下図だと192.168.0.100のPC)からルーターを経由してサーバー(下図だとcman.jp)にアクセスします。サーバー側では、クライアントのアドレスが分かるのでそれをHTMLに含めて要求元に返すと、ブラウザの表示を通してWAN側のIPアドレスがわかる、というしくみでした。
冒頭の赤文字のIPアドレスは、この図の「サーバー」が筆者テック大家さんのブログ・サーバーとした場合の結果です。
実は、ちょっとしたPHPのプログラムを書いて表示できるようにしました。テック大家さんのブログサーバーはWordPressなのでPHPのプログラムが動作します。以下のようなコードを埋め込んでみたのでした。
function ( $args, $contents ) {
$addr = "";
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
$xForwardedFor = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
if (!empty($xForwardedFor)) {
$addr = trim($xForwardedFor[0]);
}
}
if ($addr == "" && isset($_SERVER['REMOTE_ADDR'])) {
$addr = (string)$_SERVER['REMOTE_ADDR'];
}
$contents = '<span class="tl-external-ip-address">' . $addr . '</span>';
return $contents;
};
HTTPのリクエスから判断するコードです。ただし、ホスティングサービス側でロードバランサなどWordPressが動作するサーバーとインターネットの間に中間的な何かが入っている可能性も考慮しています。(参考: HTTPプロキシやロードバランサーを通過して接続したクライアントのIPアドレスを取得するには)
ちょっとWAN側IPを知りたい、という趣旨から外れますが、しくみとしてはこんな感じになっているというわけです。
本題とは外れますがWordPressに関しては以下↓の記事に詳しくあります。こちらもご興味あれば合わせてご覧下さい。
コマンドラインからWAN側IPを知りたい
さて、これまではWebブラウザに表示してもらうことでWAN側IPアドレスを知ろう、という発想の解決方法でした。
コマンドライン、または、自分で作ったプログラムを実行することでWAN側IPアドレスを知りたい、という方もいるかも知れません。
そんなときに便利なのがno-ip.comのサービスです。以前、本サイト、テック大家さんでDynamic DNSの記事を書いたときに登場したものです。
no-ip.comを利用するうえでNATのWANアドレスを知りたいときあるでしょう。そんな意図で冒頭の赤字のIPアドレス相当のWAN側IPアドレスを返してくれるURLを用意してくれています。
For IPv4 networks make a request to:
http://ip1.dynupdate.no-ip.com/
…
For IPv6 networks make a request to:
http://ip1.dynupdate6.no-ip.com/
https://www.noip.com/integrate/ip-detection
サイトによると上記のように、IPv6のアドレスも取得可能です。すばらしいです!
これを使うと(もちろん、ブラウザでも表示されますが)、プログラム的にWAN側IPアドレスを知ることができます。
ちょっとやってみましょう。
curl プログラムを使います。コンソールで以下を叩いてみましょう。
$ curl http://ip1.dynupdate.no-ip.com/
とすると、IPアドレスが返ってきます。以下の動画では、echoコマンドも打っています。これは表示される結果の見やすさのためです。なくても構いません。
プログラムからWAN側IPを知りたい(JavaScript)
次は、別のやり方です。Nodejsのプログラムを書いてWAN側のIPアドレスを取り出します。上記同様にno-ip.comのURLを使っています。
fetch()関数を用いて一行のプログラムでWAN側IPアドレスをコンソールに表示します。
Nodejsを起動して以下をコピペでOKです。Nodejsのバージョンはv18.19.0です。バージョンが古いとfetch()関数が存在しないのでご注意を。
fetch("http://ip1.dynupdate.no-ip.com/").then((r) => r.text()).then((t) => console.log(t))
くれぐれも、上の図で説明したように知りたいルーターの管理するLANの中のPCで実行してくださいね。Cloudのリモートホストにログインなどして上記のコマンドを実行すると違う結果になります。絵を見ておわかりでしょうが、そのホストがいるネットワークのIPアドレスになってしまいます。そこだけご注意を。
ねっ。面白いでしょう。
ディスカッション
コメント一覧
まだ、コメントがありません