动态 IP 的闪电节点:externalhosts 的周期解析、通告链条与验证方法 图 1
动态 IP 的闪电节点:externalhosts 的周期解析、通告链条与验证方法 · 图 1

动态 IP 也能挂在网上:LND externalhosts 的周期解析与通告链条

家用宽带的公网 IP 隔三差五会变,闪电节点却要求网络里的其他人持续找到你。常规解法是”域名指向动态 IP(DDNS)+ 节点用固定地址对外宣告”。LND 为这个场景提供了原生支持:externalhosts——给它一个主机名,它自己周期解析并按结果对外通告。这个参数看起来只是一行配置,实际上串起了 DNS 解析、地址选择和节点公告广播三件事。本文按 LND v0.19.0-beta 源码核对。

参数承诺与默认端口

帮助文本原话:添加一个应当被周期解析、用于对外通告 IP 的 hostname:port;端口不写就用默认的 9735。对比之下 externalip 是手工钉死一个 ip:port 加进宣告列表,IP 一变你就得改配置重启;externalhosts 则把”查最新地址”这一步交给节点自己。两者填的都是”别人该从哪找到我”,区别在地址是死的还是活的。

解析器链条:一个默认五分钟心跳的后台协程

服务端启动路径里会创建一个 host announcer(主机通告器),源码用 defaultHostSampleInterval 常量作为刷新节拍——在 config.go 中定义为五分钟。它的工作循环是:按间隔逐个解析配置里的每个主机名(走系统解析器),把得到的 IP 地址与端口组装成候选通告地址,再与当前已通告的地址比对,出现变化时触发地址更新,最终通过节点公告(node announcement)把新地址广播给通道对端与网络泛洪范围。这条链解释了为什么 DDNS 记录改完不需要重启 lnd:最长等一个采样周期,新 IP 就会进入宣告。

与其他通告方式的关系

LND 决定”宣告什么地址”是有优先级叙事的:externalip 显式列表最优先;没有显式地址时,可尝试 UPnP/NAT-PMP 的自动穿透(nat 开关)。源码配置校验明确规定:NAT 支持与 externalhosts 互斥,同时设置直接报 “NAT support and externalhosts are mutually exclusive, only one should be selected”。逻辑上这很合理——一个说”问我路由器要地址”,一个说”问 DNS 要地址”,同时给两种答案等于让节点自己打架。端口默认值也值得注意:不写端口时它用 9735,哪怕你的监听端口是别的数字——DDNS 场景下记得把真实端口写全。

部署核对清单

第一,域名先由 DDNS 服务维护好,dig 能查到当前公网 IP 才轮到 lnd 用。第二,listen 监听端口、externalhosts 里写的端口、路由器端口转发三者必须指向同一处;宣告对了、转发放错了,对端照样连不进来。第三,验证要看两头:getinfo 的 addresses 字段应出现解析结果;更硬的证据是对端视角——让远端节点执行 getnodeinfo 看你广播的 addresses 是否随 IP 变更而更新。第四,IP 变更后旧连接不会自动迁移,对端要重新发起连接,短时间流量下滑属正常。第五,家庭运营商给的是 CGNAT 内网地址时,解析出来的 IP 根本不是公网可达点,这套机制救不了——先确认公网 IP 的真实性,再谈宣告。

与邻居视角的对照实验

判断”宣告是否生效”最可靠的观测点不在本机,而在网络另一端。挑一个与你通道无关的远端节点,请它执行节点信息查询并查看你的 addresses 列表:这里出现的就是全网泛洪后别人尝试连你的地址集合。把 getinfo(本机自述)与远端 getnodeinfo(网络记忆)两相对照,可以区分三类问题:本机宣告错(两个都不对)、广播未到(本机对、远端空或旧)、远端缓存滞后(稍后再查即可)。DDNS 切换IP 后,旧地址在别的节点视角里还会存活一段时间——节点公告更新有传播与缓存周期,立刻测试连不通不代表配置失败,隔十几分钟复测更接近真实收敛时间。若你的域名解析走的是内网 DNS,公网对端解析同一个域名拿到的可能是完全不同的结果,这种”内外分裂”场景下 externalhosts 只对和你用同一套解析的节点友好,值得在选 DDNS 服务商时提前想清楚。

风险提示:对外宣告的地址构成节点的可达面,暴露的监听端口应配合防火墙与最小化服务;本文为机制说明,不构成投资建议。