网络与 IP

公网 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 也不等于端口对外可达,要从外部探测并在本机抓包确认。

作者 顶联产品团队发布于 6 分钟阅读

公网 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 这类检测站除了地址,还给出归属地、运营商和地址类型。使用时注意三点:

  1. 看地址本身,和命令行查到的对一下,不同就是浏览器走了代理或插件。
  2. 看运营商,机房服务器上查到的运营商应与分配单一致,不一致说明走了错误的出口或上游线路切换了。
  3. 归属地只能参考。它来自离线地址库,地址段迁移后可能几个月才更新;要确认地址的真实登记归属,用 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 一类工具),家里的设备主动连到服务器,由服务器把外部流量转发回来。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88