挖矿软件把一个套接字打开到一个地址,而关于隧道、路由和已入账工作的每个问题都挂在这个套接字上。这个套接字是通往矿池端点的出站客户端会话,而不是接受对等节点的监听器。下面的走查从矿池签发的四个值一路跟到矿池真正记账的那份份额,并且不打扰主机上的其他服务。每一步都给出可以比较的答案,而不是一种印象。

从矿池真正签发的端点开始

矿池给你构成整份合约的四个值:主机名或地址、端口、协议变体和账户字符串。要从矿池的仪表盘或欢迎信息里取,而不是从面向另一个矿池的教程里取。同一服务存在区域分片,因此从旧指南复制的 主机名仍可能连上,也仍可能记入一个你从未打算使用的账户。把四个值原样复制进矿工配置,因为重新键入的账户字符串会丢掉一个分隔符。

你要路由的这条流,就是 Bitcoin 开发者指南称为 Stratum 会话 的那条:一条持续的双向 TCP 连接,矿池在其中分发工作、矿工回传份额。它和全节点的对等连接或钱包的链同步不是同一条流,而把它们揉进同一个流量类别,正是大多数混乱开始的地方。只有第一条属于本策略。

在矿池提供 TLS 的地方,保留其文档要求的服务器验证。隧道只加密你到 VPN 服务器这一段,并到此为止;它不为另一端的应答者背书。若要让会话在被攻陷的出口下存活,两端各保留一道校验。

把隧道挂到进程上,而不是挂到整个家庭

有两个挂接点可行:把 VPN 客户端运行在矿工所用的网络命名空间内,或给该命名空间一个把流量带进隧道的网关。两种安排都能在矿池看到会话之前把它放上路径。常见失败是主机上有客户端、容器里的矿工自带网桥,而容器从不查询的那条主机路由。客户端窗口看着健康,矿池记录的却是你家的地址。

在划定任何范围之前,先检查隧道自身的传输。客户端必须经由底层网络到达它的服务器,所以一条截获所有报文的策略也会截获用来建立隧道的报文。于是隧道起不来,别的也出不去。用客户端的分流隧道功能选择什么进入隧道;手工改默认路由,正是底层网络消失的方式。

策略就位后,读取矿工所属命名空间里的套接字表。通往矿池端口的流应当落在隧道接口上,两条命令就能回答这个问题。下面的端口只是示例;换成矿池签发的那个。

sudo nsenter -t "$(pidof cgminer)" -n ss -tnp state established 'dport = :3333'
sudo nsenter -t "$(pidof cgminer)" -n ip route get 203.0.113.10

从矿工自己的上下文读取路由和解析器

路由和名称解析是按命名空间生效的,所以只要矿工在容器里,普通 shell 里跑的检查描述的就是另一台机器。先进命名空间,再问哪个接口会把报文送往矿池地址、哪个解析器会为它的主机名作答。主机的答案不会自动带过来,两者之间的落差是常见的错怪来源。

说清你拿到的接口:隧道意味着会话在预期路径上,而物理链路意味着某条规则比你预想的更早命中。先看前缀长度,再看度量,最后看策略规则,所以有多条默认条目的表不会复制报文,只会在竞争中落败。

解析器与路由是分开失败的。改写 /etc/resolv.conf 的隧道可能让命名空间指向一个只能从隧道内部到达的解析器,而这在任何 TCP 握手发生之前就失败了。在命名空间内解析矿池主机名,并与公布的地址比对。若查询超时或返回别的东西,先修解析再动路由。

把矿池客户端和节点监听器分开

端口 8333 是 Bitcoin Core 的对等端口,全节点在那里监听入站连接;矿池矿工从不需要它开着,打开它也不会修复任何出站故障。入站监听器和出站会话是方向相反、信任假设也相反的角色。矿工配置里没有任何东西会绑定该端口,所以端口关着解释不了它报告的任何错误。为节点可达性写下的建议,因此可能在一台本应只提交份额的主机上留下一个公网服务。

如果一台机器确实两件事都做,就把每个角色当作各有访问决策的独立服务。节点的监听器属于你施加于公网服务的策略之后,矿工的会话属于选择隧道的出站策略。记下主机扮演哪个角色,情况变化时移除另一角色的规则,因为残留的放行规则会比它的理由活得更久。

证明矿池收到了工作

风扇转得欢、算力在上涨,说明矿工在计算,而不是有东西到达了矿池。证据在客户端的提交计数器或矿池的仪表盘上:被接受的份额、被拒绝的份额,以及每次拒绝附带的原因。这些数字把三种从外面看完全相同的故障分开:没有会话、有会话但没有入账、以及不断重连的会话。改动任何配置之前先读它们。

用详细日志观察一次连接尝试,并记下最后一个成功的阶段。序列停住的那个阶段,比它周围的任何单条消息都更有用:

Last stage reachedWhat it rules outProbe to run next
Name lookup completedResolver and namespace reachabilityip route get for the returned address
TCP connect completedRoute and egress filteringss -tnp on the tunnel interface
Subscription returned a jobEndpoint or protocol mismatchAccepted against rejected counts

然后让客户端跑一个固定窗口,并从它的日志里数两种结果。每个计数器一条 grep 就够了,在同一窗口上比较就能把慢矿池和坏路径分开。把路径调整到客户端写日志的位置,因为两个计数并不依赖位置:

grep -c Accepted /var/log/miner.log
grep -c Rejected /var/log/miner.log

如果某条规则禁止在隧道断开时直连矿池,就把它表达为矿池端点上的显式阻断。悄悄从物理链路重试的客户端会继续挖、也继续违反那条规则,而它的状态显示不会提到这件事。故意断掉隧道、确认矿池端口完全不可达,以此测试规则。

相关文章