タイトル: 外部IPアドレスの確認方法(Linux)
SEOタイトル: Linux で外部 IP アドレス確認方法完全ガイド
| この記事の要点 |
|
外部 IP とは
外部 IP (グローバル IP) は、インターネットから見た自分の IP アドレス。NAT 配下のサーバでは、ip a で見えるローカル IP (例: 192.168.1.10) と、外部から見える IP (例: 203.0.113.42) が異なります。
| コマンド | 何が見える? |
|---|---|
ip a / ifconfig | NIC に振られたローカル IP |
hostname -I | 同じくローカル IP のスペース区切り |
curl ifconfig.me | ★ 外部 (グローバル) IP |
HTTP ベースの確認サービス
# 定番 (どれも text/plain で IP だけ返す)
curl ifconfig.me
curl ipinfo.io/ip
curl ifconfig.co
curl https://api.ipify.org
curl https://ipecho.net/plain
curl https://icanhazip.com
curl https://checkip.amazonaws.com # AWS 公式
# IPv4 / IPv6 を明示
curl -4 ifconfig.me # IPv4 のみ
curl -6 ifconfig.me # IPv6 のみ
# JSON 形式で詳細情報
curl ipinfo.io
# {
# "ip": "203.0.113.42",
# "city": "Tokyo",
# "country": "JP",
# "org": "AS17676 SOFTBANK CORP."
# }
curl https://ipapi.co/json/
DNS ベースの確認 (推奨)
HTTP より高速・軽量で、Web サービスがブロックされる環境でも動きやすい:
# OpenDNS の resolver に "myip" を問い合わせる
dig +short myip.opendns.com @resolver1.opendns.com
# 203.0.113.42
# Google Public DNS の場合
dig +short TXT o-o.myaddr.l.google.com @ns1.google.com
# "203.0.113.42"
# Cloudflare DNS (1.1.1.1)
dig +short txt ch whoami.cloudflare @1.0.0.1
# IPv6 を確認
dig -6 +short AAAA myip.opendns.com @resolver1.ipv6-sandbox.opendns.com
# host コマンドでも可
host myip.opendns.com resolver1.opendns.com
wget での確認
curl が入っていない最小構成では wget で代替:
wget -qO- ifconfig.me
wget -qO- icanhazip.com
wget -qO- https://api.ipify.org
# -q : quiet
# -O- : 標準出力に書く
スクリプトに組み込む
本番運用では 1 つのサービスが落ちても OK な多段フォールバック:
#!/bin/bash
# get-external-ip.sh
get_ip() {
local services=(
"https://api.ipify.org"
"https://ifconfig.me"
"https://ipinfo.io/ip"
"https://icanhazip.com"
"https://checkip.amazonaws.com"
)
for url in "${services[@]}"; do
ip=$(curl -s --max-time 3 "$url")
# IPv4 形式バリデーション
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo "$ip"
return 0
fi
done
# DNS フォールバック
dig +short myip.opendns.com @resolver1.opendns.com
}
EXTERNAL_IP=$(get_ip)
echo "External IP: $EXTERNAL_IP"
各方法の比較
| 方法 | 速度 | 信頼性 | 備考 |
|---|---|---|---|
dig +short myip.opendns.com @resolver1.opendns.com | ★★★ | ★★★ | ★ 推奨 |
curl ifconfig.me | ★★ | ★★ | シンプル |
curl ipinfo.io/ip | ★★ | ★★★ | レート制限あり (無料 1k/日) |
curl checkip.amazonaws.com | ★★ | ★★★ | AWS 公式、安定 |
curl api.ipify.org | ★★ | ★★★ | 軽量、SSL 対応 |
NAT 越え検証
# ローカル IP (NIC に振られている)
ip -4 addr show eth0 | awk '/inet / {print $2}'
# 192.168.1.10/24
# 外部から見える IP
curl -s ifconfig.me
# 203.0.113.42
# 一致するなら NAT なし (直接インターネット接続 / クラウド EIP)
# 一致しないなら NAT 配下 (家庭 LAN, AWS NAT GW etc.)
IPv6 の確認
# IPv6 グローバルアドレス
ip -6 addr show scope global
# inet6 2001:db8::abcd:1234/64 scope global
# 外部 IPv6
curl -6 https://ifconfig.me
curl -6 https://api64.ipify.org
# IPv4 / IPv6 両方を一括取得
echo "IPv4: $(curl -4 -s ifconfig.me)"
echo "IPv6: $(curl -6 -s ifconfig.me 2>/dev/null || echo 'なし')"
cron で定期的に監視
# /etc/cron.d/external-ip-watch
# 10 分ごとに外部 IP を記録、変化したら通知
*/10 * * * * root /usr/local/bin/check-ip.sh
# check-ip.sh
#!/bin/bash
CURRENT=$(curl -s --max-time 5 ifconfig.me)
LAST=$(cat /var/lib/external-ip 2>/dev/null)
if [ "$CURRENT" != "$LAST" ] && [ -n "$CURRENT" ]; then
echo "$CURRENT" > /var/lib/external-ip
logger -t ip-watch "External IP changed: $LAST -> $CURRENT"
# Slack 通知など
fi
FAQ
Q: ip a で見えるのが外部 IP か確かめたい
A: curl ifconfig.me の結果と比較。一致すればクラウドや専用線で直接インターネット接続、不一致なら NAT 配下です。
Q: 社内プロキシ経由でも動く?
A: http_proxy / https_proxy 環境変数を設定すれば curl が利用します。返るのはプロキシの外向き IP。
Q: 全部のサービスが落ちている
A: DNS ベースの dig +short myip.opendns.com @resolver1.opendns.com を試してください。HTTP より生存率が高いです。