托尔的洋葱服务会被封端口、被封 IP,但把整台比特币节点的连接层搬到 I2P 上,是目前对封锁最有韧性的做法之一——代价是配置门槛比 Tor 高一档。比特币核心对 I2P 的支持由两个参数承担:-i2psam 指向本地路由器的 SAM 接口,-i2pacceptincoming 控制要不要接受来自 I2P 的入站连接。两个开关看起来平淡,实际牵出一整套与普通 IP 节点不同的连接生命周期:监听不靠本地端口、地址不靠 DNS 种子、可达性不靠 UPnP,而且它们和 -listen 之间存在一条会静默改写配置的联动。这篇把 I2P 接入的正确顺序、默认值事实、常见启动失败与验证方法讲清楚,顺便解释为什么”节点跑在 I2P 上”和”节点连了一个 I2P 对端”是两个规模完全不同的决定。
先把角色分清。I2P 是匿名网络,运行节点的那台机器上必须先跑着一个本地 I2P 路由器(路由器本身在 Java 或 i2pd 里实现)。比特币核心不与 I2P 直接对话,而是通过 SAM(一个本地协议接口)向路由器发指令:“帮我把这个地址当成一个可入站的站点”或”帮我连到这个站点”。源码里对 SAM 代理的默认地址就是本地 7656 端口,而路由器一侧的 SAM 桥默认并不开启——这是第一道最常见的坎:配置文件里写了 -i2psam=127.0.0.1:7656,节点却报”无法连接 SAM”,多数是路由器那边的 SAM 服务没启用,跟比特币核心无关。官方文档明确写着路由器需要先手工开启 SAM,这是接入清单的第一行,不是最后一行。
第二个关键区别是监听语义。普通 IP 节点的入站靠监听一个端口并做端口映射;I2P 的入站没有”本地监听端口”这个概念,可达性由路由器代管。参数文档在这点上写得直白:入站监听是通过 SAM 代理完成的,不是通过绑定本地地址与端口。因此 -i2pacceptincoming 的语义是”要不要通过 SAM 建立这个入站站点”,默认开启;一旦 SAM 接口配好,节点会自动拿到一个 I2P 站点地址,并在节点握手里把这个能力公告出去,外部节点就能经匿名路径连进来。
然后是那条必须知道的联动:源码里有一处 SoftSet 逻辑——当 -listen=0 时,-i2pacceptincoming 被自动压成 0,日志写明这条参数交互。逻辑与普通监听一致:既然你已经表明不打算接受任何外部连接,就不该再去 I2P 里注册一个公开站点白占资源。想只出勿进就顺从这条联动;想接受入站就必须保持监听开启,且不能同时把 -i2pacceptincoming=0 写死。与此配套的是一条硬错误:-onlynet=i2p 限制了出站网络,却没配 SAM 接口,节点直接拒绝启动,报错点名两个参数——软件宁可拒绝启动也不让节点跑成完全孤立。
关于 -i2psam 自身还有一条容易被忽略的事实:它一旦被赋值,源码里就把 NET_I2P 这个网络的代理整体设置好,不需要再单独写 -proxy;也就是说 I2P 的连接路径由 SAM 承担,其他网络仍走默认或各自的代理配置。想让节点”只走 I2P”,正确组合是 -i2psam=... 加 -onlynet=i2p;想让节点”主网可达也保留 I2P 入站”,保持 -i2psam=... 而不要收紧 -onlynet——混合拓扑的隐私收益更低,但兼容性最好,适合家庭节点第一次接入时的过渡阶段。
验证方法按顺序走三眼。第一眼看节点状态里的网络分项:I2P 是否有入站计数、是否报告了本机可达地址;没有地址说明 SAM 站点没建成。第二眼看日志里参数交互那几行,确认没有任何东西被联动改写——尤其确认 -i2pacceptincoming 没有被你自己的 -listen=0 静默关掉。第三眼做交叉确认:拿另一台节点查询这台节点的可达地址能否握手成功;这一步等价于”外部视角”,因为自家机器 ping 自家 SAM 端口成功只能证明本地代理活着,不能证明可达性公告生效。
最后把隐私账算明。I2P 与 Tor 各有一类暴露点,用错配置时反而更显眼:只把 Tor 当唯一通道、其他网络全都关掉,拓扑上很醒目;混合网络则可能把节点的真实网络地址通过其他渠道泄露。工程上的稳妥姿势是:接入期用混合模式验证功能,成熟期再收紧 -onlynet,把收紧动作放在站点建成并连续一段时间之后;任何一次拓扑收紧都当成一次独立变更对待,改完复查三眼,不要在同一个维护窗口里同时改代理、监听和网络限制——参数联动最擅长惩罚这种一次改三个开关的操作。风险提示:I2P 路由器、SAM 桥与比特币核心的版本兼容性都会变化,本文以 v31 源码与官方文档核对为准,请先在测试环境验证;连接拓扑收紧不当可能导致节点长期孤立,本文不构成投资建议。

发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。