LND 的 REST 端口不是复制品:restlisten、回退规则与 CORS、TLS、WebSocket 的四个旋钮
很多节点教程把 LND 的 REST 接口一句”再起个 8080 端口”带过。实际上 REST 是 gRPC 服务前面的一层转换代理:它监听的地址、要不要 TLS、浏览器能不能跨来源调用、WebSocket 长连接怎么保活,各有一根独立的旋钮,默认值之间还有隐式的回退关系。本文按 LND v0.19.0-beta 源码逐项核对。
默认监听 localhost:8080,且跟着 RPC 走
配置结构里 defaultRESTPort = 8080;启动校验时如果用户没有给出任何 restlisten,配置会补上 localhost:8080——默认只绑回环,外部机器访问不到是设计而非故障。更隐蔽的一条在 REST 代理启动逻辑里:源码注释写明”用第一个 RPC 监听器作为 REST 代理的目标”,也就是说 REST 并不自己实现业务,它把 HTTP 请求翻译成对本机 gRPC 的调用。RPC 监听器没起来,REST 无从谈起;norest 则是整层关闭的总开关。
restlisten 改的是入口,不是出口
restlisten 帮助文本:为 REST 连接添加监听的接口/端口/套接字。想局域网访问就写 0.0.0.0:8080,想换端口写具体地址。但要清醒:入口开放后,鉴权仍然依赖 macaroon 令牌经头部带过来,暴露面从 gRPC 的 10009 扩展到 HTTP 的 8080,等于多了一个可被扫描的端口。生产上常见的做法是不直接暴露 REST,而是放在反向代理后面加 HTTPS,再按需限来源。
restcors:浏览器能不能调,由白名单决定
restcors 的帮助文本:添加允许跨源访问的 ip:port 或主机名,要允许所有来源就写 *。Web 钱包或管理面板从别的域名调你节点的 REST 接口时,浏览器会先做跨源检查,不在白名单里的来源直接被浏览器拦下——这时节点日志可能毫无异常,错误只在浏览器控制台,这是新手最容易误判的一环。* 的语义是”任何网站都可以向这个节点发起跨源请求”,令牌仍在请求头里,但攻击面变大;能列具体来源就不要用通配。
no-rest-tls 与 WebSocket 的两根保活线
no-rest-tls 关闭 REST 连接的 TLS。注意默认路径下 REST 复用节点 TLS 证书,去掉加密意味着令牌与响应在网络上裸奔,只有确认链路由本机回环或已加密隧道承载时才合理。订阅类接口(如订阅付款、订阅路由事件)走 WebSocket 长连接,两根参数控制其生死:ws-ping-interval 是服务端发 ping 的间隔,设 0 表示服务端不再主动发 ping;ws-pong-wait 是等待 pong 的时限,超时连接被判为不活跃直接关闭。经过 NAT 或云负载均衡的部署里,中间的闲置超时往往比默认更短,ping 间隔调小、pong 等待调宽是常见对策——但两端数值要自洽:服务端 ping 间隔必须明显小于 pong 等待,否则正常的往返延迟都可能把连接判死。
一次到位的核对清单
改完配置依次确认:lsof 或 ss 看 8080 实际绑在哪张网卡;用浏览器从目标来源发一次跨源请求验证 CORS;确认 macaroon 权限面与暴露范围匹配;长连接订阅挂几小时看是否被 ping/pong 参数配置踢断。REST 层的每一次放宽,本质都是在可用性账本上记一笔、在攻击面账本上记一笔。
一个典型的端到端配置样例
目标是”局域网里另一台机器上的网页面板能订阅付款事件”。需要的最小集合:restlisten 绑到局域网可达地址、restcors 加面板所在来源、面板持有一个只读或带订阅权限的 macaroon。如果面板走 HTTPS 而 REST 是明文,浏览器会因混合内容策略直接拦截,这时要么给 REST 前置一层 TLS 反代、要么把面板也放成 HTTP。若只是本机脚本调用,保持默认 localhost:8080、不配 CORS、不开 no-rest-tls 即可——CORS 是浏览器概念,本机 curl 不受它约束,很多文档把这条搞混,导致给纯脚本用户也套上 *,白丢一层防护。把”谁在调用、从哪个来源、经过什么网络”三个问题回答清楚,四个旋钮该不该动一目了然;反过来,任何”全开图省事”的组合,都应该被理解成一次明确的攻击面扩张决策,而不是配置模板的默认值。
风险提示:对外开放接口前先确认鉴权与传输加密仍然成立;本文为机制说明,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。