Skip to content

获取公网IP的N种方法:命令行、浏览器、API一次讲全

"我电脑的IP是多少?"——这个问题几乎每个程序员都被问过,自己也迟早要查一次。查公网 IP 看着简单,但真要讲清楚,里面门道不少:命令行怎么查、浏览器怎么查、程序里怎么拿、IPv4 和 IPv6 怎么分开查。今天一篇讲全,最后再给你一个能直接写进代码里的方案。

一、命令行:一条命令的事

在服务器上排查问题,最快的办法就是 curl 一个"回显 IP"的服务:

bash
# 查 IPv4
curl -4 https://ip9.com.cn/get

# 查 IPv6(如果你的网络有 IPv6 地址)
curl -6 https://ip9.com.cn/get

返回是一段 JSON,不光有 IP,还把归属地、运营商一起给了(ret=200 表示查询成功,结果在 data 里):

json
{"ret":200,"data":{"ip":"1.2.3.4","country":"中国","country_code":"CN","prov":"广东省","city":"深圳市","isp":"电信","lng":114.06,"lat":22.55},"qt":0.001}

如果只想看 IP 本身,可以配合 jq 取字段:

bash
curl -s https://ip9.com.cn/get | jq -r '.ip'

Windows 上没 curl 的话,PowerShell 也能干:

powershell
(Invoke-RestMethod "https://ip9.com.cn/get").ip

二、浏览器:零成本查 IP

不想开终端?直接在浏览器地址栏访问 https://ip9.com.cn/get 就能看到自己的公网 IP 和归属地,页面会把 JSON 渲染成表格,适合给不懂技术的同事看。也可以直接在搜索引擎里搜"IP",大多数搜索页顶部会直接显示你的公网 IP。

三、写进代码:程序里怎么拿用户 IP

服务器端要拿"当前请求方 IP",调接口时不带 ip 参数就行,接口会自动识别请求来源。Python 里这样写:

python
import requests

def get_my_ip():
    r = requests.get("https://ip9.com.cn/get", timeout=3)
    data = r.json()["data"]  # 结果在 data 里,ret=200 表示成功
    return data["ip"], data["prov"] + data["city"]

ip, addr = get_my_ip()
print(f"我的公网IP: {ip},归属地: {addr}")

Node.js 同样简单:

javascript
const res = await fetch("https://ip9.com.cn/get");
const json = await res.json();
const data = json.data; // ret === 200 表示查询成功
console.log(`我的公网IP: ${data.ip},归属地: ${data.prov}${data.city}`);

注意:这是"查自己"的用法。如果你要查别人的 IP(比如用户登录时的 IP),得把 IP 拼到参数上:https://ip9.com.cn/get?ip=8.8.8.8

四、常见坑:你拿到的可能不是真实 IP

程序里查 IP 之前,先确认你拿到的是不是真实公网 IP。网站前面挂了 Nginx 的话,REMOTE_ADDR 往往是 Nginx 的地址,真实 IP 在 X-Forwarded-For 头里:

nginx
# Nginx 里把真实 IP 传给上游
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

后端取的时候注意:X-Forwarded-For 是客户端可以伪造的,信任前要经过 Nginx 覆盖,或者只取最后一个由可信代理追加的地址。不然你查到的归属地可能是伪造的,风控场景尤其要小心。

总结

查公网 IP 的姿势很多:命令行 curl、浏览器直访、代码里调接口。日常排查用第一条命令就够,写进业务代码就用 API 方式。IP9 的接口免注册、免鉴权,免费版 60 次/分钟,查自己绰绰有余;需要查指定 IP 就拼 ?ip= 参数,IPv4/IPv6 都支持。把 https://ip9.com.cn/get 收藏起来,下次再有人问"怎么查公网IP",直接甩链接。