
Backend de nós Xboard: baseado no Xray-core v26.10.31, implementa limite de dispositivos/limitação de velocidade com um único patch, alinhado estritamente ao contrato do Xboard V2, com mitigação integrada para CVE-2026-98432
Backend de nós de última geração para o painel cedar2025/Xboard.
Adota do wyx2685/v2node a cobertura de protocolos modernos + forma de integração com o kernel, e do cedar2025/Xboard-Node a camada de operações (push/modo máquina/certificados/duplo kernel), com a linha de base do kernel fixada em Xray-core v26.10.31.
Documento: docs/ARCHITECTURE.md (arquitetura e registo de decisões) · docs/CONTRACT.md (contrato campo a campo com o painel, incluindo números de linha de evidência) · docs/PANEL-PATCH.md (patch do painel: por que motivo se altera, como instalar, como reverter) · docs/STATUS.md (implementado / não implementado / como verificar) · docs/PANEL-IMPROVEMENTS.md (lista de melhorias do painel a mais longo prazo)
| Dimensão | Xboard-Node (dev 2026-04) | v2node (2026-10) | Este projeto |
|---|---|---|---|
| Versão do kernel | fork congelado em v26.3.27 | v26.9.30 | v26.10.31 (com MPTCP desativado por padrão) |
| Número de dispositivos/limitação de velocidade | //go:linkname sequestra registro não exportado | copia todo o pacote dispatcher para o próprio módulo | patch único app/usergate (3 hunks) |
| Superfície de protocolos | vless/vmess/trojan/ss/hysteria2/tuic/anytls (xray+sing-box) | vless/vmess/trojan/ss/hysteria2/tuic/anytls, incluindo VLESS encryption / mldsa65Seed / xver | lado xray vless/vmess/trojan/ss2022 + REALITY totalmente endurecido; anytls/tuic/hysteria2 delegados ao sing-box (zero patches de protocolo) |
| Transporte | ws/grpc/httpupgrade/h2 (removido)/xhttp | tcp/ws/grpc/httpupgrade/xhttp | xhttp prioritário, h2/quic rejeitados em tempo de compilação |
| Push | push via handshake WS | apenas polling (ETag + msgpack) | push WS + fallback para polling |
| Certificados | certmagic + 21 provedores libdns | lego | certmagic + libdns (seguindo a abordagem do xbn) |
| Modo máquina | suportado (multinó/processo único) | processo único com múltiplos Nodes | suportado |
Conclusão principal: a verdadeira divergência entre os dois projetos não está nas funcionalidades, mas em "como se inserir no plano de dados do xray".
app/usergate + 3 hunks no xray vendorizado, a semântica do plano de dados fica a cargo do próprio dispatcher do xray, e o gate faz apenas duas funções puras: Admit/Limit.cmd/xboard-core/ # 入口(node 模式 / machine 模式 / standalone)
internal/config/ # YAML 配置 + 校验 + 热重载
internal/panel/ # 面板契约:/api/v2/server/*(含 V1 兼容)
internal/kernel/ # 内核抽象(xray / singbox 双实现)
internal/kernel/xray/ # 配置构建(安全默认在此集中收敛)+ 运行时热更新
internal/gate/ # 设备数 + 限速闸门(被 usergate 补丁调用)
internal/sysinfo/ # 面板 status 必填项(cpu/mem/swap/disk,零依赖)
internal/traffic/ # 每用户流量计数与上报
internal/metrics/ # Prometheus 指标 + 健康检查
internal/cert/ # ACME 证书管理(certmagic + libdns)
third_party/xray/ # vendored Xray-core + 补丁序列
panel-patch/ # 面板侧补丁(对 cedar2025/Xboard 的零迁移改动)
docs/ # 架构决策记录、面板改造清单
Dependências: Go 1.27+ (exigido pelo go.mod), git, GNU patch.
make vendor # clone Xray-core v26.10.31 到 third_party/xray
make patches # 打 patches/*.patch(幂等)
make build # -> bin/xboard-core
bash scripts/verify.sh # gofmt + vet + test + build + smoke + vendored 单测 + 补丁幂等
Máquinas sem make (por exemplo, git-bash no Windows) podem executar diretamente bash scripts/verify.sh, que é equivalente a make verify;
make vendor pode ser substituído por um único pipe tar, consulte a implementação no Makefile.
Atenção no Windows: se
%TEMP%não for gravável, o go reportarácreating work dir: ... Access is denied; antes da compilação, bastaexport TMP=D:/tmp TEMP=D:/tmp(scripts/verify.shsuporta a variávelGO_TMP).
O estado atual está em docs/STATUS.md: go build ./..., go test ./..., -smoke,
os testes unitários de app/usergate e app/dispatcher vendorizados já passaram.
SetMultipathTCP(false) (CVE-2026-98432), a menos que a configuração especifique explicitamente sockopt.tcpMptcp: true.debug.SetGCPercent, também é verificado se GODEBUG contém multipathtcp=0; se ausente, emite WARN e continua; install.sh grava isso por padrão.allowInsecure é rejeitado na camada de compilação e traduzido para pinnedPeerCertSha256 / verifyPeerCertByName.h2/http/h3/quic geram erro diretamente na camada de compilação (removidos upstream), sem degradação silenciosa para tcp.shortIds não vazio, dest obrigatório, maxTimeDiff padrão de 90s, opcionais mldsa65Seed/xver/limitFallback*.minClientVer; se o painel o enviar, registra WARN e o expõe em /status, evitando que clientes da família mihomo sofram fallback silencioso.