在 Ubuntu 命令列中查找外部 IP 位址的快速指南

🌏 Read the English version


前言

在現代網路環境中,了解自己的外部 IP 位址對於網路除錯、遠端存取設定、伺服器配置等場景都非常重要。對於 Ubuntu 使用者來說,透過命令列快速查詢外部公開 IP 位址是最高效的方式。

本文將介紹多種在 Ubuntu 命令列中查找外部 IP 位址的方法,並說明各種方法的優缺點與適用場景。

為什麼需要知道外部 IP?

外部 IP 位址(也稱為公開 IP 或公用 IP)是您在網際網路上的唯一識別碼。以下是幾個常見的使用場景:

  • 遠端存取設定:設定 SSH、VPN 或遠端桌面時需要知道目標主機的公開 IP
  • 防火牆規則:配置 IP 白名單或黑名單
  • 網路除錯:確認是否成功連線到網際網路
  • 伺服器監控:追蹤伺服器的公開 IP 變化
  • 地理位置驗證:確認目前網路所在的地理區域

方法一:使用 curl 指令

1. 使用 ifconfig.me

這是最簡單快速的方法:

# 查詢外部 IPv4 位址
curl ifconfig.me

# 查詢詳細資訊(含 IP、主機名稱、使用者代理)
curl ifconfig.me/all

# 僅取得 IP(靜默模式)
curl -s ifconfig.me

2. 使用 icanhazip.com

這個服務回應速度快且可靠:

# IPv4 位址
curl ipv4.icanhazip.com

# IPv6 位址
curl ipv6.icanhazip.com

# 自動偵測(IPv4 或 IPv6)
curl icanhazip.com

3. 使用 api.ipify.org

提供 API 格式回應,適合腳本處理:

# 純文字格式
curl https://api.ipify.org

# JSON 格式
curl https://api.ipify.org?format=json

# 範例輸出:{"ip":"203.0.113.45"}

方法二:使用 wget 指令

如果系統未安裝 curl,可使用 wget:

# 使用 wget 查詢 IP
wget -qO- ifconfig.me

# 使用 icanhazip.com
wget -qO- icanhazip.com

# 使用 ipinfo.io(JSON 格式)
wget -qO- ipinfo.io

參數說明:

  • -q:安靜模式(不顯示下載進度)
  • -O-:輸出到標準輸出而非檔案

方法三:使用 dig 指令

透過 DNS 查詢取得 IP 位址(適合無法連線到外部 HTTP 服務時):

# 使用 OpenDNS 解析器
dig +short myip.opendns.com @resolver1.opendns.com

# 使用 Google DNS
dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | tr -d '"'

# 使用 Akamai DNS
dig +short @ns1-1.akamaitech.net ANY whoami.akamai.net

方法四:使用 host 指令

簡單的 DNS 查詢方法:

# 使用 OpenDNS
host myip.opendns.com resolver1.opendns.com | grep "myip.opendns.com has" | awk '{print $NF}'

方法五:使用 nc (netcat)

透過特定服務的 TCP 連線取得 IP:

# 使用 icanhazip.com(port 80)
echo -e "GET / HTTP/1.1nHost: icanhazip.comn" | nc icanhazip.com 80 | tail -1

各種方法比較

方法 優點 缺點 適用場景
curl 簡單快速、應用廣泛 需安裝 curl 一般使用、腳本自動化
wget Ubuntu 預裝 語法較複雜 未安裝 curl 時
dig 使用 DNS 協定、不依賴 HTTP 需安裝 dnsutils 防火牆限制 HTTP 時
host 輕量、簡單 輸出需處理 基本查詢
nc 低階控制 複雜、需手動解析 進階除錯

實用腳本範例

自動監控 IP 變化

#!/bin/bash
# 監控外部 IP 變化並記錄

LOG_FILE="/var/log/external_ip.log"
CURRENT_IP=$(curl -s ifconfig.me)
LAST_IP=$(tail -1 "$LOG_FILE" 2>/dev/null | awk '{print $3}')

if [ "$CURRENT_IP" != "$LAST_IP" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') IP changed: $CURRENT_IP" >> "$LOG_FILE"
    # 可在此加入通知機制(email、Slack 等)
fi

多服務比對驗證

#!/bin/bash
# 使用多個服務查詢並比對結果

echo "查詢外部 IP 位址..."
IP1=$(curl -s ifconfig.me)
IP2=$(curl -s icanhazip.com)
IP3=$(curl -s https://api.ipify.org)

echo "ifconfig.me: $IP1"
echo "icanhazip.com: $IP2"
echo "ipify.org: $IP3"

# 檢查是否一致
if [ "$IP1" == "$IP2" ] && [ "$IP2" == "$IP3" ]; then
    echo "✓ 所有服務回傳相同 IP:$IP1"
else
    echo "⚠ 警告:不同服務回傳結果不一致"
fi

安裝必要工具

如果系統缺少某些工具,可使用以下指令安裝:

# 安裝 curl
sudo apt update
sudo apt install curl -y

# 安裝 dnsutils(包含 dig 和 host)
sudo apt install dnsutils -y

# 安裝 netcat
sudo apt install netcat -y

安全性考量

隱私風險

外部 IP 位址可能洩漏以下資訊:

  • 地理位置:大致的國家、城市位置
  • ISP 資訊:網路服務供應商名稱
  • 組織資訊:企業或學校網路

建議:

  • 不要在公開場合分享您的外部 IP
  • 如需隱私保護,考慮使用 VPN 或代理伺服器
  • 定期檢查防火牆規則,限制不必要的外部存取

第三方服務風險

使用外部服務查詢 IP 時要注意:

  • 查詢記錄可能被服務提供者保留
  • 部分服務可能不穩定或下線
  • 建議使用知名、可信賴的服務

常見問題

Q1: 為什麼我的 IP 位址會變動?

大多數家用網路使用動態 IP(DHCP 分配),ISP 會定期更換您的 IP 位址。企業或伺服器通常使用靜態 IP

Q2: 如何取得 IPv6 位址?

使用支援 IPv6 的服務:

curl ipv6.icanhazip.com
curl -6 ifconfig.me

Q3: 如何同時顯示內部和外部 IP?

# 內部 IP(區域網路)
hostname -I

# 外部 IP(公開網路)
curl ifconfig.me

# 合併顯示
echo "內部 IP: $(hostname -I)"
echo "外部 IP: $(curl -s ifconfig.me)"

Q4: 為什麼 curl 指令沒有回應?

可能的原因:

  • 網路連線問題:檢查 ping 8.8.8.8
  • 防火牆阻擋:檢查 iptables 或 ufw 規則
  • 未安裝 curl:執行 sudo apt install curl
  • 服務暫時無法使用:嘗試其他服務

Q5: 可以在腳本中自動化嗎?

可以。建議使用以下方式:

# 腳本中使用(加入錯誤處理)
EXTERNAL_IP=$(curl -s --max-time 5 ifconfig.me)

if [ -z "$EXTERNAL_IP" ]; then
    echo "錯誤:無法取得外部 IP"
    exit 1
fi

echo "外部 IP: $EXTERNAL_IP"

總結

本文介紹了 5 種在 Ubuntu 命令列查找外部 IP 位址的方法:

  1. curl 指令:最常用、最簡單(推薦)
  2. wget 指令:適合未安裝 curl 的系統
  3. dig 指令:使用 DNS 查詢、不依賴 HTTP
  4. host 指令:輕量級 DNS 查詢
  5. netcat:低階 TCP 連線查詢

建議使用:

  • 日常使用:curl ifconfig.me
  • 腳本自動化:curl -s https://api.ipify.org
  • 防火牆限制環境:dig +short myip.opendns.com @resolver1.opendns.com

無論選擇哪種方法,記得注意隱私安全,不要隨意公開您的外部 IP 位址。

相關文章

Leave a Comment