返回博客

2026年10月30日

Pi 节点为什么必须要有公网 IP?以及为什么你查到的不一定是真的

入站可达是奖励的前提,而「可达」是被外部评价的,不是自己声明。很多人查到的公网 IP 在 NAT 下根本不是真实出口。

面向:想搭节点但卡在"没有公网 IP"这一步的人,以及配了公网 IP 却发现节点还是不可达的人。
结论先行:入站可达是奖励的前提,而"入站可达"这件事实在太容易被误判 ——
连客户端自己都得从外部探测才能确认。

一、为什么非要公网 IP

Pi 节点需要被其他节点和官方探测到,才能算"可达"。

官方的验证方式很直接:从外部探测你这个公网 IP 的 31400-31409 这一整段端口。 全通 = 可达,少一个 = 不完整。

这说明一件事:节点是被"从外面看"来评价的,不是自己说在跑就算数。

所以判断顺序永远是:

别人能不能连进来?(外部探测)
   ↓ 能
你的节点才算可达
   ↓
才谈得上奖励

自己机器上 curl localhost 通,只证明本地服务活着,不证明别人能连进来。

二、一个容易踩的坑:你查到的公网 IP 可能是错的

这是本篇最重要的部分。

很多教程教你用某些方式查本机公网 IP,然后填进去测试。但在 NAT 环境下,本机读到的地址经常不是真实的公网出口。

Pi 客户端自己就踩过这个坑。它的代码里有两种获取 IP 的方式:

| 方式 | 从哪来 | 可靠性 | |---|---|---| | 本地网卡读取 | 直接问操作系统 | NAT/多层虚拟化下不可靠 | | 服务端回传 | 后端从你的请求头里解析出真实出口 IP | 这才是真的 |

客户端的做法很说明问题:它用服务端回传的 IP 来判断 NAT 类型(double-NAT / CNAT), 而不是用本地读到的。因为它知道本地那个值不靠谱。

对你的实际意义:

  • 你要验证入站可达,必须用从外部看到的那个 IP
  • 如果你用本地查到的内网地址去测,测通了也是假的
  • 如果你的机器在多层 NAT 后面(云服务器套了 NAT、家里路由器又套一层),本地值基本没参考价值

最可靠的验证方式:从另一台完全独立的公网机器上,去探测你那台节点的公网 IP。 这跟官方的做法一致。

三、怎么正确验证入站可达

# 在另一台公网机器上执行,不是节点自己机器上
IP=你的节点公网IP
for p in $(seq 31400 31409); do
  timeout 3 nc -zv "$IP" "$p" >/dev/null 2>&1 && echo "$p 通" || echo "$p 不通 ★"
done

判定标准:10 个全通。

不通的时候,按这个顺序查(三层都要过):

  1. 路由器端口转发 —— 家用宽带最常见
  2. 主机防火墙 —— Windows 防火墙 / ufw / firewalld
  3. 云厂商安全组 —— 云服务器默认只放 22/80/443

任何一层拦了,从外面看就是"不通",而且你从节点内部完全看不出来。

四、没有公网 IP 怎么办

这是很多人卡住的地方。客观说几条路:

路 1:找运营商要公网 IP(家用宽带)

部分地区可以申请,但不保证。有些地区已经全面 NAT,要不到。

路 2:用云服务器

直接就有公网 IP,但要考虑带宽成本和流量费。跑节点持续占用带宽,费用要算清。

路 3:内网穿透 / 隧道

很多人在用,可行。但要注意两点:

  • 隧道工具本身的稳定性 —— 抖一下入站可达性就断了
  • 隧道的出口 IP 是否稳定 —— 频繁变化会影响可达性的持续认定

路 4:托管给别人跑

如果你只是想要节点的奖励,不想折腾这些,那就买托管服务。 我们做的就是这件事 —— 但这篇不是广告,上面三条路你自己评估,能解决就不用找任何人。

五、一个绕不开的硬约束(多节点必看)

如果你不是跑一台,而是想跑多台,这里有个现实:

一个公网 IP 只能让一台节点"可达"。

这不是配置问题,是 Pi 网络的认定方式 —— 它按公网 IP 认定节点。 所以你不可能在一个 IP 后面挂两台节点,都算"可达"。

这意味着多节点必须多公网 IP,而这笔成本是硬的:

  • 家用宽带:通常只能要 1 个
  • 云服务器:每个 IP 都是钱
  • 隧道:要给每个节点分配独立出口

很多人算多节点的账时漏了这一条,以为一台强机器挂十个节点就行, 实际卡在出口 IP 上。

六、常见误区澄清

"我有公网 IP 了,节点就应该有奖励"

不一定。公网 IP 是必要条件,不是充分条件。还要: 端口 10 个全通、节点真的在同步、昨天在线率不为零。

"我的节点能连出去,说明网络没问题"

出站和入站是两件事。能连出去(访问别人的服务)不代表别人能连进来(被探测到)。 绝大多数"配置看起来对但不可达"的情况,都是这个区别没分清。

"我本地 ping 自己公网 IP 通了"

本机 ping 自己的公网 IP,流量可能根本没出路由器 —— 走的是本地回环。 这种测试结果没有任何意义。

七、排查清单

1. 从另一台公网机器测 31400-31409
   ├─ 10 个全通 → 可达性 OK,问题在别处
   └─ 有不通 → 继续

2. 确认你测的 IP 是"外部看到的真实公网 IP"
   ├─ 用本地读到的值 → 可能测的是假地址,重新测
   └─ 从外部确认 → 继续

3. 三层依次查
   ├─ 路由器端口转发配了吗?
   ├─ 主机防火墙放行了吗?
   └─ 云安全组加规则了吗?

4. 多层 NAT 场景
   └─ 云上套 NAT / 家里套路由 → 要逐层打通,或换隧道方案

一句话总结:节点的"可达"是被外部评价的,不是自己声明。测的时候一定要站在外面看。

---