游客发表
IPFS 的搭建私有网络其实不是“搭”出来的,是网络“关”出来的。默认情况下,搭建你的网络节点一旦跑起来,就会自动连上全球的搭建 DHT 网络,跟几百万个陌生节点打招呼。网络私有网络要做的搭建第一件事,就是网络把这个门关上,只让认识的搭建人进来。
我去年帮一个做医疗影像的网络团队搭过一套,他们要求数据不出内网。搭建整个折腾下来,网络核心就三样东西:一个共享密钥、搭建一份 bootstrap 节点列表、网络外加每个节点配置里把公网相关开关全掐掉。搭建
IPFS 用一个叫 swarm.key 的文件来区分网络。这东西本质是一串 base64 编码的随机字节,长度固定。生成方式很简单:
go install github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen@latest ipfs-swarm-key-gen > swarm.key 拿到这个文件后,把它放到每个节点的 ~/.ipfs/ 目录下。节点启动时会读它,如果密钥对不上,握手直接失败。没有这个文件,节点就默认加入公共网络。所以这一步不能漏,漏了等于白搭。
光有密钥还不够。IPFS 默认会去连公共的 bootstrap 节点,还会通过 mDNS 在局域网里乱喊。得改配置:
ipfs config --json Bootstrap '[]' ipfs config --json Discovery.MDNS.Enabled false ipfs config --json Swarm.AddrFilters '["/ip4/0.0.0.0/ipcidr/0", "/ip6/::/ipcidr/0"]' 第一行清空公共引导节点。第二行关掉局域网自动发现——这个在私有网络里反而容易造成混乱。第三行是地址过滤器,把公网 IP 段全挡掉。注意这个过滤器写法有点反直觉,它是“拒绝列表”模式,写进去的 CIDR 都会被拒绝连接。
我第一次配的时候忘了关 MDNS,结果两个节点在同一个交换机下自动发现了对方,但因为没有正确的 swarm.key,反复握手失败,日志里刷了一屏错误。关掉之后就清净了。
公网引导节点没了,节点之间怎么找到对方?答案是手动加 bootstrap 或者用 ipfs swarm connect。生产环境一般选一台稳定的机器做引导节点,把它的 multiaddr 写进其他节点的配置里:
ipfs bootstrap add /ip4/192.168.1.10/tcp/4001/p2p/12D3KooW... 那个 12D3KooW... 是节点的 Peer ID,用 ipfs id 能查到。私有网络里所有节点必须用同一个 swarm.key,但 Peer ID 各自独立。这点跟某些区块链网络不一样,别搞混了。
版本要统一。IPFS 的协议一直在变,0.14 和 0.18 之间的 swarm 握手协议就有差异。我建议所有节点锁同一个版本,用 Docker 镜像固定 tag 最省事。
NAT 环境要小心。如果节点分布在不同的子网,中间有防火墙,那 Swarm.AddrFilters 里写的 CIDR 要把内网段排除掉,否则连内网地址都被挡了。我一般写成只拒绝公网段,比如 /ip4/0.0.0.0/ipcidr/0 然后单独放行 10.0.0.0/8 和 192.168.0.0/16。但 IPFS 的过滤器不支持“白名单”语义,只能反过来想:把不想连的段写进去。所以实际配置里我干脆不写 AddrFilters,靠 swarm.key 和 bootstrap 列表来控制,更简单。
还有一点,私有网络里 DHT 是关不掉的——它仍然会跑,只是范围限制在已连接的节点之间。如果你节点少(比如三五个),DHT 的开销可以忽略。节点多了之后,可以考虑用 Routing.Type 改成 dhtclient 减少查询流量。
整套配下来,一个最小可用的私有网络大概需要:一台引导节点 + N 个普通节点,共享同一个 swarm.key,Bootstrap 列表里只写引导节点的地址,MDNS 关掉。跑起来之后 ipfs swarm peers 能看到预期的邻居数量,就说明成了。
友情链接