Linux BashスクリプトでパブリックIPを取得する方法

「curl -s ifconfig.me」のように、curlコマンドでWebサイトから外部IPを取得できます。ただし、Webサイトは変更される可能性があります。より信頼性の高い回答を得るには、代わりに「dig @resolver1.opendns.com myip.opendns.com +short」のようにdigコマンドを使用して、DNSサーバーからIPを取得します。

コンピュータにリモートで接続する場合は、外部IPアドレスが必要です。手動で探すのは簡単ですが、Linuxスクリプト内から見つける方法は次のとおりです。

内部IPアドレスと外部IPアドレス

インターネットプロトコルアドレスは、ネットワーク上のデバイスを識別するために使用されます。これらはネットワーク上のユニークなラベルであり、1つのデバイスに割り当てられています。別のデバイスがそのデバイスにデータを送信する場合は、そのIPアドレスを使用して送信できます。

ブロードバンドモデムには、ネットワークトラフィックをデバイスからデバイスへとネットワーク全体に送信するネットワークルーターが組み込まれています。また、デバイスがネットワークに参加したときにIPアドレスを割り当てるローカルの権限でもあります。ネットワーク名とIPアドレスのテーブルも保持します。これにより、ネットワーク上のコンピューターに意味のある名前を付けることができます。人間にとっては、名前は数字のリストよりも操作しやすいからです。

インターネット上のデバイスにもIPアドレスがあります。Webサイトなど、名前が付いているものもあります。ドメインネームサービスプロバイダーは、Webサイトのドメイン名を自動的に検索し、IPアドレスと交換します。

ブロードバンドモデムには、インターネットサービスプロバイダー(ISP)によって独自のインターネット接続または外部IPアドレスが与えられます。自宅でインターネットに接続しているデバイスの数に関係なく、それらのトラフィックはすべてその単一のIPアドレスを介して送信されます。

あなたが外出中で、自宅のコンピューターの1つで実行しているサービスに接続したい場合は、外部IPアドレスを使用する必要があります。もちろん、ルーターは、自宅内の適切なデバイスに接続要求をルーティングするように設定する必要があります。

ISPに毎月少し追加料金を支払って静的IPアドレスを取得しない限り、外部IPアドレスは時々変更される可能性があります。ブロードバンドモデムを再起動すると、別の外部IPアドレスを取得する可能性があります。したがって、外部IPアドレスを知る必要がある場合は、一度確認して保存するだけではいけません。定期的にそれを判断する必要があります。

外部IPアドレスを見つける

外部IPアドレスを検出するには、ネットワークの外部にあるものと通信する必要があります。言い換えると、私たちが必要な情報を提供できるインターネット上のものにアクセスする必要があります。私たちは空虚を覗き込み、何が私たちを見ているのかを見る必要があります。そして、外部アドレスを教えてもらいます。

これを行うには2つの方法があります。1つの方法は、Webサイトを介したものです。外部IPアドレスとその他の情報を表示するWebサイトがたくさんあります。これらにはブラウザからアクセスするか、HTTPSリクエストを作成できるcurlなどのコマンドラインツールを使用できます。

もう1つの方法は、digのような専用のコマンドを使用することです。digコマンドはDNSサーバーに問い合わせて情報を取得します。

ブラウザを使用する

もちろん、ブラウザを使用することは、外部IPアドレスを取得するためのスクリプトに適した方法ではありません。ただし、そのサービスを提供するWebサイトを見ると、役立つ情報を得ることができます。以前はip4.meを推奨していましたが、このサイトはHTTPSに更新されていません。依然として、古くて安全性の低いHTTPを使用しています。サイトは依然として機能しますが、現在ではより良い代替手段があります。

ifconfig.meサイトは、優れた情報を提供します。

これにより、外部IPが178.238.11.140であることが報告されます。Webページを下にスクロールすると、サイトから情報を取得するために使用できるコマンドのリストが表示されます。

彼らが示す例はすべて、サイトを照会するためにcurlを使用しています。では、curlの使用例を見てみましょう。

curlを使用する

テストマシンでは、Fedora 37にcurlがすでにインストールされていました。UbuntuとManjaroのコンピューターにインストールする必要がありました。

Ubuntuにインストールするには、次のように入力します。

sudo apt install curl

Manjaroのコマンドは次のとおりです。

sudo pacman -S curl

ifconfig.me Webページにリストされている最初のコマンドでこれを試すことができます。

curl ifconfig.me

外部IPアドレスが取得され、ターミナルウィンドウに表示されます。出力は基本的なものです。文字列の後に改行文字すら印刷されません。コマンドプロンプトはIPアドレスにぴったりと隣接しています。

このコマンドが機能するのは、IPアドレスを返すことがWebサイトのデフォルトのアクションであるためです。デフォルトのアクションが変更された場合、異なる結果が返される可能性があります。これに対応するために、URLに「ip」識別子を追加することで、IPアドレスを要求していることを指定できます。

curl ifconfig.me/ip

これにより、以前のようにIPアドレスが返されます。

これは、WebサイトをIPアドレスのソースとして使用することの問題を示しています。Webサイトは閉鎖されるか、動作方法が変更されるか、返される情報の形式が変更される可能性があります。これらの変更により、これらのサイトに依存するスクリプトは失敗するか、予測不能な動作をします。

DNSサーバーのような評判の良い信頼できるリソースを使用することは、外部IPを取得するためのより堅牢な方法です。DNSサーバーにクエリを実行するには、digコマンドを使用する必要があります。

digコマンドを使用する

今回は、FedoraとUbuntuにdigがインストールされており、Manjaroにのみインストールする必要がありました。

コマンドは通常のpacmanコマンドなので、驚きはありませんが、パッケージ名は予想とは異なる可能性があります。

sudo pacman -S bind-tools

digを使用して外部IPアドレスを検出するには、DNSサーバーを指定する必要があります。私たちは、シスコが提供するOpenDNSサーバーを使用しています。

使用するDNSサーバーの名前を指定する必要があります。その前にアットマーク「@」を付けます。また、取得したいレコードの種類を指定する必要があります。この場合は「myip」です。+shortオプションにより、冗長な応答ではなく、簡潔な応答が得られます。

dig @resolver1.opendns.com myip.opendns.com +short

今回は、IPアドレスの後に改行文字が印刷されています。ご覧のように、これはIPアドレス文字列の後に印刷されており、文字列自体に不可欠な部分ではありません。

スクリプト内での使用

スクリプト内から外部IPアドレスを知る必要がある理由はたくさんあります。おそらく、外部IPアドレスが変更されたかどうかを監視するスクリプトがあり、変更があったときに通知されるでしょう。または、サーバーがアドレスが変更されたときにクライアントに通知する場合があります。理由が何であれ、コマンドラインで使用したコマンドをスクリプト内に簡単に実装できます。

外部IPアドレスを取得して変数に割り当てるには、コマンドをコマンド置換$(...)で囲み、次のように変数に割り当てるだけです。

variable=$(...)

カッコ内のコマンドが実行され、戻り値が式に代入されます。この例では、コマンドは「variable=return value」に簡略化されます。

スクリプトで説明します。データ取得の進行状況を報告しないように、curlコマンドに-s(サイレント)オプションを追加しました。

#!/bin/bash
extaddr=$(curl -s ifconfig.me)
echo "The external IP address is $extaddr (from cURL)"

このスクリプトをエディターにコピーして「getex1.sh」として保存し、chmodコマンドで実行可能にします。

chmod +x getex1.sh

スクリプトを実行して、何が得られるかを確認しましょう。

./getex1.sh

WebサイトではなくDNSサーバーを使用するというより堅牢なオプションで同じことを行うには、curlコマンドをdigコマンドに置き換えるだけです。

#!/bin/bash
extaddr=$(dig @resolver1.opendns.com myip.opendns.com +short)
echo "The external IP address is $extaddr (from dig)"

これをスクリプト「getex2.sh」として保存し、chmodを使用して実行可能にします。

chmod +x getex2.sh

このスクリプトを実行してみましょう。

./getex2.sh

2つのスクリプトの出力を確認すると、digコマンドがコマンドラインに改行文字を印刷しても、スクリプトではextaddr変数に改行が追加されないことがわかります。

信頼性を重視する

「非公式」Webサイトを使用するよりも、定評のある認識されたサービスを使用し、予測可能な出力形式にする方が常に安全です。インターネット上の他のすべてのように、情報の出所を注意深く確認してください。