グローバルIPアドレスをコマンド(curl/dig等)で確認する方法
目次
皆様こんにちは。
寒くなると布団から出られなくなる システムソリューション部所属の なか です。
ブログに何を書くか悩んでいると、ふと最近「グローバルIPアドレスの確認方法って人によって微妙に違うな」
「コマンドの内容も微妙に違う」という事に気が付きました。
なので今回は「グローバルIPアドレスをコマンド(curl/dig/nslookup)で確認する方法」を主眼に説明していきたいと思います。
といっても「そもそもコマンドで確認できるの?」「curl以外にも方法あるの?」
と思う人もいらっしゃるかと思います。
一応よくあるブラウザでの方法も合わせて説明します。
実行環境
● Linux環境
・OS:Ubuntu 20.04.5 LTS (WSL2環境)
・Shell:bash
・ロケールを日本語に変更
● Windows環境
・OS:Windows11 (バージョン:21H2)
・Shell:コマンドプロンプト
・言語設定を日本語に変更
一般的なブラウザでの確認方法
まず、一般的な方法の説明です。
インフラエンジニアでも、そうでない方でも
とりあえず自分が使っているPCのグローバルIPを確認するときに使うのは
IP確認サイトにブラウザでアクセスする方法が多いかと思います。
※検索上位に上がる有名な物として主に下記の2サイト様かと思います。
○「CMAN」 様
https://www.cman.jp/network/support/go_access.cgi
○「確認くん - UGTOP」 様
https://www.ugtop.com/spill.shtml
これらのIP確認サイトにアクセスすると、現在使用しているグローバルIP等が表示されます。
原理
原理としてはシンプルです。
クライアント(ユーザー)がブラウザを使ってWEBサーバーにアクセスする際、
HTTP(S)プロトコルを使用してサーバーにHTTPリクエストを送ります。
この際、ブラウザが送信する「HTTPリクエスト」は概ね4つの構造に分かれています
(詳細はこれだけで1本記事がかけるので割愛します)。
- 通信プロトコルやメソッドを指定する「リクエスト行」
- リクエストを送った側の情報等を含んだ「ヘッダー行」
- 空行
- 「メッセージボディ」
この「ヘッダー行」の中には「リクエストヘッダ」と呼ばれる、
アクセスをリクエストしたクライアント(ユーザー)のIPアドレス等々の情報が記載されています。
要するに、IP確認サイトではこのアクセスした人が送ってきたリクエストヘッダの情報を
アクセスした本人に提示することでグローバルIPアドレスを教えてくれるわけです。
この原理は後述のコマンドでも利用していますので頭の片隅に置いて貰えますと幸いです。
curlコマンドでの確認方法(Linux&Windows)
● curl
コマンドを使って確認する方法といえば、恐らく100人中95人(憶測)はcurlコマンドだと思う定番の方法です。
このコマンド自体は様々な通信プロトコルでデータの送受信が行える素晴らしいコマンドで、
一般的にはWEBサーバーが正常に稼働しているかをコマンドで確認する際の用途で使うことが多いと思います。
最近のLinuxの主要ディストリビューションでは標準導入されており、
Windowsでも10( 2018年 Ver.1803(RS3)~)から標準導入されています。
curl inet-ip.info xxx.xxx.xxx.xxx curl ifconfig.co xxx.xxx.xxx.xxx curl httpbin.org/ip { "origin": "xxx.xxx.xxx.xxx" } ※json形式で出力
使い方としては主に上記のようになります。
「WEBサイトにリクエストを送っている?」と気が付いたかと思いますが、
その通りで上記で説明していた「リクエストヘッダ」を使った方法と同じ原理です。
微妙に違うのはドメイン名の部分
curlコマンドでIP確認サイトにHTTPリクエストを送って、
その中のリクエストヘッダ情報からIPアドレスのみを返答してもらっています。
他にも同じ用途のサイトは複数ありますので、その選定はドメイン名の好みかと思います。
この確認に利用するサイトが人によって違うのが「人によって微妙に違う」正体かと思います。
結論として、「curlはグローバルIPを内部で確認するコマンドではない」事を意識しておいて下さい。
あくまで外部サービスを利用している形です。
dig・nslookupコマンドでの確認方法(Linux・Windows)
● dig (Linux)
● nslookup (Windows)
ドメインの確認にお馴染みのdigとnslookupコマンドです。
上記2つのコマンドは名前もツールも違う物ではありますが、
今回の使用方法としては概ね同じ形式なので合わせて説明いたします。
このコマンドはDNSサーバーに問い合わせてDNSレコードの応答をもらうツールですが、
実は自分のグローバルIPを教えてくれるDNSサーバーがいくつか存在しています。
- Cisco(OpenDNS)
- Cloudflare
例えば上記の特定のDNSサーバーにおいて、特定の問い合わせをすると問い合わせた側のグローバルIPを返答してくれます。
これら機能は本来その当該DNSを使ったサービスを利用しているかの確認などに使われる物らしく、
あまり大体的に周知されている訳ではないようです。
今回は当該企業や関連企業の公式ドキュメントや社員投稿のフォーラムなどを確認した所、
その存在や利用方法等について少しですが記述がなされておりました。
公に存在が開示されていると判断した「Cisco(OpenDNS)」のDNSサーバーを利用した確認方法になります。
●ubuntu(bash) dig myip.opendns.com @208.67.222.222 +short xxx.xxx.xxx.xxx
「dig」の場合は「+short」オプションが使えるため、グローバルIPのみを表示させる事ができます。
●Windows(CMD) nslookup myip.opendns.com 208.67.222.222 サーバー: dns.opendns.com Address: 208.67.222.222 権限のない回答: 名前: myip.opendns.com Address: xxx.xxx.xxx.xxx
「nslookup」だと短縮オプションがないですが、「dig」のフル表示よりかは短いため見やすいかと思います。
Cisco社のコミュニティに社員の方が投稿したナレッジに記載がありました。
※digのshortオプションは筆者が追加して使っていますが、本筋の使い方自体はナレッジと変わりません
Umbrella: Umbrella の DNS サーバーでのみ使える特殊な DNS リクエスト
余談:GoogleのDNS
ちなみにですが、Googleにも実は公開ドキュメントに少し記述がありました。
ただ、こちらは求めている結果を完璧に得られるコマンドの説明では無かったのと
Ciscoと違ってTXTレコードで返答される形式のために使用するコマンドが少し長くなるので、
今回は解説は割愛いたします。
curl と dig & nslookup どっちが便利なの
どちらも「コマンドを実行したクライアント(グローバルIP)」という同じ回答を得られます。
ですので、お好みの方法で問題ないです。
ただこれでは納得される回答になりませんよね。
実際そこまで大きな優劣は無いと考えますが、差を言うのであれば dig & nslookup のほうが 筆者は安定はしているとは考えます。
curl の方法は、問い合わせる先のWEBサーバーが稼働していなければ結果を得られません。
この記事を書く際にいくつかIP確認サービスのサイトにアクセスしましたが、
「429 Too Many Requests」のエラーコードを出して結果が確認できなかったサイトがありました。
ですが、dig や nslookup はDNSに問い合わせる方法です。
そう……GoogleやCisco(OpenDNS)が管理しているDNSサーバーは基本的に安定稼働していますので安心です。
というか停止したら大惨事です。
問い合わせる先にサービスの安定性を考えた時には、
1WEBサーバーと大企業のDNSサーバーでは明らかに後者のほうが安定稼働しています。
余談:実は内部的には dig & nslookup の方が速い
体感できる程の差はないですが ”内部的”な実行速度は dig & nslookup のほうが速いです。
これは curl が 通信プロトコルに応答を確認する TCP を使っているのに対して、
dig & nslookup は 一方的に送る UDP を使っているので速度差があります。
おわりに
「極端な差はないので使いやすいやり方を使えばいいです」「しいて言うなら dig & nslookup の方が速い」
サーバーのグローバルIPを確認したり等、使う場面は結構ある物ですのでこの記事が多少でも参考になりましたら幸いです。
長文となりましたが、ここまで読んで頂きありがとうございました!
参考資料
HTTP の概要
https://developer.mozilla.org/ja/docs/Web/HTTP/Overview
curl shipped by Microsoft (curl公式サイト)
https://curl.se/windows/microsoft.html
Umbrella: Umbrella の DNS サーバーでのみ使える特殊な DNS リクエスト