公网 IP 查询:curl 命令、在线检测与端口可达性验证
公网 IP 查询的原理是向外发一个请求,让对端告诉你它看到的来源地址:Linux 和 macOS 执行 curl -4 myip.ipip.net,Windows 用 curl.exe 或 nslookup myip.opendns.com resolver1.opendns.com,curl -6 查 IPv6。结果和网卡地址不同就是中间做了 NAT;能查到公网 IP 也不等于端口对外可达,要从外部探测并在本机抓包确认。
公网 IP 查询的方法是向外发一个请求,让对端把它看到的来源地址告诉你。Linux 和 macOS 上执行 curl -4 myip.ipip.net,Windows 上用 curl.exe 或 nslookup myip.opendns.com resolver1.opendns.com,返回的就是你此刻的出口公网 IPv4。查到的地址与 ip addr 或 ipconfig 看到的网卡地址不一样,说明你和互联网之间有 NAT,可能是家里的路由器、运营商的大 NAT、云平台的弹性 IP 或者一个代理。下面给出各系统的命令、在线检测站怎么用、两个地址不一致的原因,以及更重要的一步:怎么验证某个端口从外面真的能访问到。
示例里公网地址用文档专用的 203.0.113.0/24,服务器地址用 203.0.113.10。
一条命令查出口公网 IP
| 系统 | 命令 | 说明 |
|---|---|---|
| Linux / macOS | curl -4 myip.ipip.net |
国内站点,返回“当前 IP:… 来自于:…”,附带归属地和运营商 |
| Linux / macOS | curl -4 cip.cc |
国内站点,多行输出,含归属地、运营商 |
| Linux / macOS | curl -4 -s https://ifconfig.me |
只返回地址,不带多余文字,脚本里好用 |
| Linux / macOS | curl -4 -s http://checkip.amazonaws.com |
同上,只返回地址 |
| Linux / macOS | curl -6 -s https://api64.ipify.org 或 curl -6 -s https://ifconfig.co |
强制走 IPv6,查出口 IPv6 |
| 任意系统 | dig +short myip.opendns.com @resolver1.opendns.com |
走 DNS 协议,HTTP 被代理时仍能得到真实出口 |
| Windows cmd | curl.exe -4 myip.ipip.net |
Windows 10 1803 及以后自带 curl.exe |
| Windows cmd | nslookup myip.opendns.com resolver1.opendns.com |
不依赖 curl,看 Non-authoritative answer 下面的地址 |
| Windows PowerShell | (Invoke-WebRequest -Uri https://ifconfig.me/ip -UseBasicParsing).Content |
PowerShell 里 curl 是 Invoke-WebRequest 的别名,要用原生 curl 写 curl.exe |
几个用法细节:
- 加
-4或-6是为了确定答案。双栈机器上不加参数,curl 可能优先走 IPv6,返回一个很长的地址,让你误以为 IPv4 查询失败。 - 加
-s不显示进度;返回值末尾没有换行的站点,后面补; echo,脚本里好处理。 - 设置了
http_proxy或https_proxy环境变量时,curl 走代理,查到的是代理的出口。要查本机的真实出口,用curl --noproxy '*' …或者用上面的 DNS 方法。 - 境外站点在个别线路上可能连不上或很慢,换一个站点即可。同一台机器连查几个站点,结果应该一致;不一致说明有多条出口或某个站点被代理,继续往下看原因对照。
在线检测站怎么用、看什么
在搜索引擎里直接搜“IP”,结果页顶部通常会显示你的公网 IP;ip138、ip.cn、ipip.net 这类检测站除了地址,还给出归属地、运营商和地址类型。使用时注意三点:
- 看地址本身,和命令行查到的对一下,不同就是浏览器走了代理或插件。
- 看运营商,机房服务器上查到的运营商应与分配单一致,不一致说明走了错误的出口或上游线路切换了。
- 归属地只能参考。它来自离线地址库,地址段迁移后可能几个月才更新;要确认地址的真实登记归属,用
whois 203.0.113.10查注册机构数据库的 netname、descr 和 country。
部分检测站会标注“数据中心 IP”“代理 IP”,那是根据地址段用途库做的分类,机房地址被标为数据中心是正常的。有的站还提供“端口在线检测”,可以当作外部探测点用,但要知道它只能告诉你 TCP 连接能不能建立,判断不了背后是哪一层拦截,后文的抓包方法才能定位。
查到的 IP 和网卡 IP 不一样是怎么回事
| 场景 | 网卡上看到的 | 查到的公网 IP | 说明 |
|---|---|---|---|
| 家庭或办公宽带 | 192.168.x.x 等私网地址 | 路由器 WAN 口地址 | 路由器做 NAT,正常 |
| 运营商级 NAT(CGNAT) | 路由器 WAN 口是 100.64.0.0/10 或 10.x | 运营商共享出口 | 多个用户共用一个公网 IP,端口映射无效,没有真正的公网 IP |
| 云服务器 | 私网地址,如 10.x.x.x、172.16.x.x | 弹性公网 IP | 云平台在网卡外做一对一 NAT,网卡上看不到公网地址,这是正常设计 |
| 机房 NAT 型服务器 | 私网地址 | 机房共享出口 | 没有独立公网 IP,做服务需要机房做端口映射 |
| 机房独立公网 IP 的服务器 | 公网地址 | 与网卡一致 | 不一致时查代理设置和策略路由 |
| 挂了代理或 VPN | 任意 | 代理的出口 | 浏览器代理、系统代理、http_proxy 变量分别检查 |
| 多出口或多 IP | 多个地址 | 由路由和源地址选择决定 | 用 --interface 指定源地址测试 |
| 没加 -4 | — | 返回了 IPv6 | 双栈下 curl 优先 IPv6,加 -4 重查 |
判断网卡上的地址是不是公网地址,看它落在哪个范围:
| 范围 | 含义 |
|---|---|
| 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 | RFC 1918 私网地址,不会在公网路由 |
| 100.64.0.0/10 | RFC 6598 运营商级 NAT 共享地址,出现在路由器 WAN 口就说明上游还有 NAT |
| 169.254.0.0/16 | 链路本地地址,没拿到 DHCP 地址时系统自动配的 |
| 127.0.0.0/8 | 环回 |
| 192.0.2.0/24、198.51.100.0/24、203.0.113.0/24 | 文档示例地址,只出现在教程里 |
| 224.0.0.0/4、240.0.0.0/4 | 组播与保留地址,不会配在网卡上当单播地址用 |
| 其余 | 一般就是公网地址 |
云服务器要特别说一下:网卡上是私网地址、查出来是公网地址,这不是故障。弹性公网 IP 由平台做一对一 NAT 映射到实例的私网地址上,入站流量同样会被映射回来,端口能不能访问取决于安全组,而不是网卡上有没有公网地址。
怎么验证端口对外可达
能查到公网 IP,只说明出站没问题。入站要分四层验证,一层一层来:
第一层:服务在监听,而且监听的不是 127.0.0.1。
# Linux:Local Address 列应为 0.0.0.0:80、[::]:80 或 203.0.113.10:80
ss -tlnp | grep ':80 '
:: Windows
netstat -ano | findstr :80
只监听在 127.0.0.1:80 的服务,本机 curl localhost 能通,外面永远到不了,这是最常见的误判。
第二层:本机防火墙放行。
sudo iptables -L INPUT -n --line-numbers # iptables
sudo nft list ruleset # nftables
sudo firewall-cmd --list-all # firewalld
sudo ufw status # ufw
Windows 在“高级安全 Windows Defender 防火墙”的入站规则里确认该端口已放行,或者临时关闭防火墙做一次对比测试。
第三层:从外部探测。 在另一台公网机器上执行,没有的话用手机关掉 Wi-Fi 走流量访问,或者用在线端口检测站:
nc -zv -w 3 203.0.113.10 80
nmap -Pn -p 22,80,443 203.0.113.10
Test-NetConnection 203.0.113.10 -Port 80
nmap 的三种结果含义不同:open 是包到了且有服务应答;closed 是包到了但没服务监听,收到了 RST,说明网络路径是通的,问题在第一层;filtered 是包被丢弃,问题在防火墙或上游。
第四层:在服务器上抓包,定位是哪一层拦的。 外部探测的同时在服务器上抓目标端口的 SYN 包:
sudo tcpdump -ni eth0 'tcp port 80 and tcp[tcpflags] & tcp-syn != 0'
| 抓包结果 | 结论 |
|---|---|
| 抓到 SYN,也看到本机回了 SYN/ACK,但外部仍不通 | 回包被拦,检查出站规则、策略路由或双网卡的回程路径 |
| 抓到 SYN,本机没有回应 | 本机防火墙丢弃,或服务没监听该地址 |
| 抓不到 SYN | 包没到服务器:云平台安全组、机房防火墙、运营商屏蔽(家庭宽带的 80、443、8080、25 常被屏蔽,以运营商为准)、或者前面有 CGNAT |
UDP 端口没有握手,nc -u -zv 的结果不可靠,要用应用层方法验证,例如 DNS 服务用 dig @203.0.113.10 example.com。
多 IP 与多出口服务器:指定源地址测试
一台服务器配了多个公网 IP,或者有两条上联,就要分别验证每个地址的出站路径:
# 指定源地址或网卡发请求,返回值应等于指定的地址
curl -4 -s --interface 203.0.113.11 https://ifconfig.me; echo
curl -4 -s --interface eth1 https://ifconfig.me; echo
# 看内核默认会用哪个源地址去访问某个目标
ip route get 1.1.1.1
ip route get 输出里的 src 字段就是默认出口地址。多 IP 服务器上常见的问题是:所有 IP 都配在网卡上,但出站一律用主 IP,第二个 IP 只能被动接收,这是源地址选择的默认行为,需要为每个 IP 单独做策略路由才能让它的回包从对应的出口走。
动态公网 IP:定时检测与变更通知
家庭宽带和部分企业宽带的公网 IP 会在重新拨号后变化。用 cron 每 5 分钟查一次,变了就记录并触发 DDNS 更新或通知:
#!/bin/bash
# /usr/local/bin/pubip-watch.sh
last=$(cat /var/tmp/pubip 2>/dev/null)
now=$(curl -4 -s --max-time 10 https://ifconfig.me/ip)
if [ -n "$now" ] && [ "$now" != "$last" ]; then
echo "$now" > /var/tmp/pubip
logger -t pubip "public ip changed: ${last:-none} -> $now"
# 在这里调用 DDNS 更新接口或发送通知
fi
# crontab -e
*/5 * * * * /usr/local/bin/pubip-watch.sh
--max-time 10 防止网络不通时脚本挂住;-n "$now" 的判断保证查询失败时不会把空值写进文件。查询站点换成任何一个只返回地址的都行,长期跑的脚本不要指望单一站点永远在线,可以写成失败时换下一个。
机房里公网 IP 的登记与校验
对 IDC 服务商和托管客户来说,公网 IP 查询有一个固定场景:服务器上架或换 IP 之后,确认分配单上的地址真的配上了、真的能用。核对顺序是:网卡上的地址、掩码、网关与分配单一致;ping 网关通;curl -4 返回的地址等于网卡地址;从外部 nc 能探到业务端口。前三条都对、第四条不通,常见原因是交换机端口的 VLAN 不对,或者机房在交换机上做了 IP 与 MAC 的绑定、源地址校验,而客户换了网卡或改了 IP,新来源的包在端口上就被丢掉了,这时要联系机房更新绑定,而不是在服务器上反复改防火墙。
绑定本身是机房防止 IP 被盗用的手段:Toplink DCIM 的交换机管理在接入端口上下发 ARP 绑定和源地址校验,只放行源 IP 属于该端口的流量;IP 地址管理登记每个公网地址分给了哪台服务器,客户工单里报“公网 IP 不通”时,先查地址归属和端口绑定记录,多数问题在登录服务器之前就能定位。
常见问题
怎么查一个域名或别人服务器的公网 IP?
用 DNS 解析:nslookup example.com,或 dig +short example.com,返回的 A 记录就是它对外公布的地址;ping 域名也能顺带看到解析结果。注意用了 CDN 或云防护的域名,查到的是就近的 CDN 节点地址,不是源站,而且不同地区解析结果不同。
为什么浏览器查到的公网 IP 和 curl 查到的不一样?
两者走的出口不同。浏览器可能配置了代理或开着浏览器内的加速插件,curl 默认读取 http_proxy 环境变量,也可能一个走了 IPv6、一个走了 IPv4。用 curl -4 和 curl -6 分别查,再核对代理设置。
没有公网 IP,怎么从外面访问家里的设备?
三条路:向运营商申请开通公网 IPv4;用 IPv6,国内宽带多数已经下发公网 IPv6 前缀,在路由器的 IPv6 防火墙里放行目标设备即可,访问方也要有 IPv6;或者租一台有公网 IP 的服务器做内网穿透(frp 一类工具),家里的设备主动连到服务器,由服务器把外部流量转发回来。