IPconf
返回教程列表
IP 基础 7 分钟阅读

用命令行查询公网 IP

用 curl、wget、PowerShell 和 JSON 接口确认互联网看到的公网 IP,并覆盖代理、脚本化和双栈场景。

本机 IP 不等于公网 IP

在家用或办公网络里,`ifconfig`、`ipconfig`、`ip addr` 显示的多半是 192.168.x.x 或 10.x.x.x 这种 RFC1918 私有地址。这种地址只在局域网内有意义,公网上的所有服务看到的是经过 NAT 转换后的另一个 IP,那才是你的路由器或运营商面对互联网的地址。

公网 IP 是网站日志里记录的、API 限流以它为单位的、IP 定位服务解析出来的那个值。当你排查"这个用户为什么被封"或"为什么定位错了",要关注的是公网 IP,不是本机地址。

纯文本 IP

最快的方法是直接请求根域名。服务端会根据 User-Agent 判断,浏览器返回 HTML 页面,curl/wget/PowerShell/Go/Python `requests` 等命令行客户端则只返回纯 IP 文本。没有 JSON 也没有 HTML,直接 echo 结果即可。

这种格式特别适合嵌入 shell 提示符、监控脚本或 CI 流水线——只要那一行 IP 就够了。

curl https://ipconf.cn
wget -qO- https://ipconf.cn
powershell -Command "Invoke-RestMethod https://ipconf.cn"

# 脚本里:
MY_IP=$(curl -s https://ipconf.cn)
echo "当前公网 IP: $MY_IP"

JSON 响应:地理位置与 ASN

需要国家、地区、城市、运营商、ASN 或时区时,换用 JSON 接口。响应是一个扁平对象,可以 `jq` 管道或任意语言解析。

还可以查询任意 IP,不限于当前调用方。在事件响应中很有用——日志里出现一个可疑 IP,一条命令就能查到归属和 ASN。

curl https://ipconf.cn/json
curl https://ipconf.cn/json/8.8.8.8

# 用 jq 只提取国家:
curl -s https://ipconf.cn/json | jq -r .country

# 中文地名加 lang=zh:
curl "https://ipconf.cn/json?lang=zh"

分别检查 IPv4 和 IPv6

双栈网络下,curl 会按系统偏好选择地址族,多数现代系统默认走 IPv6。要看清两边状态就显式强制。

两边结果不一致是常态:IPv4 通常多设备共享一个 NAT 地址,IPv6 一般每台设备一个唯一地址。很多 VPN 只代理 IPv4,IPv6 流量会绕过 VPN 直接出去——也就是常见的 IPv6 泄漏。

curl -4 https://ipconf.cn   # 强制 IPv4
curl -6 https://ipconf.cn   # 强制 IPv6

# 对比看:
echo "IPv4: $(curl -4 -s https://ipconf.cn)"
echo "IPv6: $(curl -6 -s https://ipconf.cn)"

代理、CDN 与企业出口

如果走 HTTP 代理或企业统一出口,外部看到的是代理的出口 IP,不是你的。设置 `HTTPS_PROXY` 看代理 IP,去掉再看直连 IP,可以对比两者。

在 Cloudflare 等 CDN 后面,源站看到的是 CDN 边缘节点的 IP。ipconf 接口尊重 `CF-Connecting-IP` 和 `X-Forwarded-For` 头,能识别真实调用方——验证源站日志里会写入哪个值时很方便。

# 设了代理:
HTTPS_PROXY=http://proxy.internal:8080 curl https://ipconf.cn

# 取消代理(直连):
unset HTTPS_PROXY
curl https://ipconf.cn

脚本化与监控

常见场景是检测公网 IP 变化——动态 DNS、安全告警、VPN 掉线监控都用得上。保存当前 IP、sleep、重检、有变化就告警。

请求频率要合理(几分钟一次没问题,每秒一次属于滥用)。多机部署时,本地按轮询间隔缓存即可,不要每台都对外打。

# bash:公网 IP 变化告警
LAST=""
while true; do
  NOW=$(curl -s https://ipconf.cn)
  if [ "$NOW" != "$LAST" ] && [ -n "$LAST" ]; then
    echo "IP 变化: $LAST -> $NOW" | mail -s "公网 IP 已变化" you@example.com
  fi
  LAST="$NOW"
  sleep 300
done