IP アドレスから何がわかるか — dig と curl で種別・逆引き・プライベート判定を読み解く
IP アドレスは単なる数字の列ではありません。種別(IPv4 か IPv6 か)、逆引きホスト名(PTR レコード)、プライベートアドレスかどうかの 3 点を確認するだけで、ネットワーク上の素性がかなり見えてきます。この記事では dig コマンドと Labee Dev Toolbox の IP API を使って、1 つの IP アドレスから読み取れる情報を整理します。
IPv4 と IPv6 の判定
IP アドレスには IPv4 と IPv6 の 2 種類があります。IPv4 は 203.0.113.45 のようにドット区切りの 10 進数 4 オクテットで表記し、IPv6 は 2001:db8::1 のようにコロン区切りの 16 進数で表記します。自分の環境がどちらで接続しているかを知ることは、トラブルシューティングの出発点です。
たとえば、サーバーに接続できないとき、サーバー側が IPv6 に対応していないのにクライアントが IPv6 で接続を試みている場合があります。接続元の IP アドレスの種別を確認するだけで、原因の切り分けが進みます。
dig を使って自分のグローバル IP を確認する方法の一つに、Google Public DNS の o-o.myaddr.l.google.com への TXT クエリーがあります。
dig TXT o-o.myaddr.l.google.com @ns1.google.com +short
"203.0.113.45"
返ってきたアドレスの形式で、IPv4 と IPv6 のどちらで通信しているかがわかります。
Labee Dev Toolbox の IP API を使うと、インターネット側のサーバーから見た接続元 IP を確認できます。dig がローカルのリゾルバー経由で返す結果とは異なり、外部から自分がどう見えているかを知る手段です。
curl "https://labee.dev/api/ip"
{
"success": true,
"data": {
"ip": "203.0.113.45",
"type": "IPv4",
"isPrivate": false,
"ptr": "host-203-0-113-45.example-isp.net"
},
"error": null,
"meta": { "responseTime": 12 }
}
type フィールドが IPv4 または IPv6 で種別を示します。特定の IP アドレスを調べたい場合は ip パラメーターで指定します。
curl "https://labee.dev/api/ip?ip=2001:4860:4860::8888"
{
"success": true,
"data": {
"ip": "2001:4860:4860::8888",
"type": "IPv6",
"isPrivate": false,
"ptr": "dns.google"
},
"error": null,
"meta": { "responseTime": 30 }
}
type が IPv6 で返り、PTR レコードも取得されています。
PTR レコードで IP の「身元」を調べる
PTR(Pointer)レコードは、IP アドレスからホスト名を引く逆引き DNS の仕組みです。通常の DNS が「ホスト名 → IP アドレス」の正引きであるのに対し、PTR は「IP アドレス → ホスト名」の方向で引きます。
IPv4 の逆引きでは in-addr.arpa ドメインを使います。たとえば 8.8.8.8 の PTR を調べるには、オクテットを逆順にした 8.8.8.8.in-addr.arpa に対して PTR クエリーを送ります。IPv6 では ip6.arpa ドメインを使い、各ニブル(4 ビット単位)を逆順に並べます。
dig で逆引きを確認するには -x オプションを使います。
dig -x 8.8.8.8 +short
dns.google.
dns.google が返りました。この IP アドレスが Google の DNS サーバーであることがわかります。末尾のドットは DNS の FQDN 表記です。
PTR レコードが設定されていない IP アドレスに対しては、dig は何も返しません。
dig -x 203.0.113.1 +short
Labee Dev Toolbox の API でも逆引き結果を確認できます。
curl "https://labee.dev/api/ip?ip=8.8.8.8"
{
"success": true,
"data": {
"ip": "8.8.8.8",
"type": "IPv4",
"isPrivate": false,
"ptr": "dns.google"
},
"error": null,
"meta": { "responseTime": 25 }
}
ptr フィールドにホスト名が入ります。逆引きレコードが存在しない場合は null が返ります。
メールサーバーと PTR の関係
PTR レコードが特に重要になるのはメール配送の場面です。Gmail や Outlook などの主要なメール受信サーバーは、送信元 IP アドレスの逆引きを検証します。PTR レコードが未設定の場合、あるいは PTR で得たホスト名を正引きしたときに元の IP アドレスと一致しない場合、スパムと判定される要因になります。
Gmail のガイドラインでは、送信元 IP に有効な PTR レコードを設定することが送信者要件の一つとされています。PTR に加えて SPF・DKIM・DMARC の設定も必要です。メールサーバーを運用している場合は、IP アドレスの逆引きが正しく設定されているかを確認してください。
dig -x 198.51.100.25 +short
mail.example.com.
さらに、この PTR 結果を正引きして元の IP と一致するか検証します。
dig A mail.example.com +short
198.51.100.25
正引きと逆引きが一致していれば、FCrDNS(Forward-confirmed reverse DNS)が成立しています。
プライベートアドレスの判定
IP アドレスには、インターネット上でルーティングされないプライベートアドレスの範囲が定義されています。IPv4 では RFC 1918 で以下の 3 つの範囲が規定されています。
10.0.0.0/8— クラス A 相当、大規模ネットワーク向け172.16.0.0/12— クラス B 相当、中規模ネットワーク向け192.168.0.0/16— クラス C 相当、家庭やオフィスの LAN で多用
これ以外にも、ループバック(127.0.0.0/8)やリンクローカル(169.254.0.0/16)があります。IPv6 では、ユニークローカルアドレス(fc00::/7)やリンクローカル(fe80::/10)が該当します。
ある IP アドレスがプライベートかどうかを判定するには、上記の範囲と手動で照合します。たとえば 192.168.1.1 は先頭 16 ビットが 192.168 なので 192.168.0.0/16 に含まれ、プライベートアドレスです。172.20.0.5 は 172.16.0.0/12(172.16.0.0 〜 172.31.255.255)の範囲内なのでプライベート、172.32.0.1 は範囲外なのでグローバルです。判定に迷ったときは、CIDR のネットワーク部とホスト部を計算して範囲に含まれるかを確認します。
Labee Dev Toolbox の API を使えば、この判定をまとめて行えます。isPrivate フィールドが RFC 1918 を含む予約済みアドレス範囲との照合結果を返します。
curl "https://labee.dev/api/ip?ip=192.168.1.1"
{
"success": true,
"data": {
"ip": "192.168.1.1",
"type": "IPv4",
"isPrivate": true,
"ptr": null
},
"error": null,
"meta": { "responseTime": 3 }
}
isPrivate が true になり、ptr は null です。プライベート IP アドレスにはインターネット上の PTR レコードが存在しないため、API は逆引きをスキップします。
プライベートアドレス判定の活用場面
この判定が役立つのは、外部に公開しているつもりのサーバーが実はプライベート IP で応答していないかを確認する場面です。ロードバランサーやリバースプロキシーの設定ミスで、バックエンドのプライベート IP がレスポンスヘッダーに漏れるケースがあります。API やログに記録された IP アドレスが本当にグローバル IP かどうかを素早く判定できます。
シェルスクリプトでグローバル IP を取得する
シェルスクリプトで自分のグローバル IP を変数に格納したい場面は多くあります。dig を使えば外部サービスに依存せずに取得できます。
MY_IP=$(dig TXT o-o.myaddr.l.google.com @ns1.google.com +short | tr -d '"')
echo "$MY_IP"
203.0.113.45
Google Public DNS の TXT レコードに問い合わせると、手元のリゾルバーが経由したグローバル IP が返ります。tr -d '"' でダブルクォートを除去し、そのまま変数として扱えます。
API でまとめて確認したい場合は、Labee Dev Toolbox の plain パラメーターも使えます。
MY_IP=$(curl -s "https://labee.dev/api/ip?plain")
echo "$MY_IP"
203.0.113.45
dig の方法は手元のリゾルバーを経由して名前解決した結果を返すのに対し、Labee API はインターネット側のサーバーから見た接続元 IP を返します。NAT やプロキシーを挟んでいる環境では結果が異なる場合があるため、外部から自分がどう見えているかを確認する手段として使い分けてください。
ドキュメントやサンプルコードに IP アドレスを記載する際は、RFC 5737 で予約された TEST-NET の範囲を使います。ブラウザーから IP アドレスの情報を確認する場合は Labee Dev Toolbox の IP チェック画面を利用できます。