news 2026/9/17 11:25:01

Zcash 节点带宽限速实战:基于 tc 与 iptables 的 QoS 流量整形脚本解析(contrib/qos)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zcash 节点带宽限速实战:基于 tc 与 iptables 的 QoS 流量整形脚本解析(contrib/qos)

Zcash 节点带宽限速实战:基于 tc 与 iptables 的 QoS 流量整形脚本解析(contrib/qos)

【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash

导读

Zcash 全节点(zcashd)长期在线运行时,会持续向外提供区块与交易数据,这在有限带宽或按量计费的网络环境下可能挤占正常业务流量。contrib/qos目录提供了一套基于 Linuxtc(Traffic Control)与iptables的 QoS 脚本:它通过 HTB 队列规则限制发往 Zcash P2P 端口 8233 的出站 TCP 流量,同时放行局域网内节点之间的同步流量。读完本文,你将掌握该脚本的完整配置项含义、逐行实现原理,并能在自己的 Linux 节点上直接部署与验证。

一、脚本解决的问题:为什么需要 QoS

Zcash 节点默认最多会与大量对等节点(peer)建立连接并持续交换数据。若节点部署在带宽受限的 VPS 或家庭网络中,P2P 流量可能干扰其他服务。contrib/qos的设计目标是:

  • 限制对外 P2P 出站带宽:仅针对端口8233(Zcash 主网 P2P 默认端口)的 TCP 出站流量进行限速;
  • 保留局域网内高速传输:当目标地址落在本地网段(IPv4 默认192.168.0.0/16、IPv6 默认fe80::/10)时不做限速;
  • 支持"主节点 + 本地轻节点"架构:正如 README 所述,用户可同时运行一个常驻的zcashd全节点,以及另一个本地zcashd/图形客户端,由本地节点从全节点拉取区块,二者之间走局域网通道不受限速影响,而对公网的整体出站流量则被压制在设定阈值内。

脚本头部版权声明表明其源自 Bitcoin Core(2017),后被 Zcash 项目引入并适配,是理解 Linux 流量整形与 Zcash 网络栈结合的极佳范例。

二、端口 8233:Zcash 主网 P2P 端口的源码佐证

脚本限速的端口号8233并非随意取值,它与 Zcash 主网链参数一一对应。在 src/chainparams.cpp 中,主网参数显式声明:

nDefaultPort = 8233;

而同一文件中测试网(testnet)的默认端口则是18233(见 src/chainparams.cpp)。在 RPC 示例中也能看到该端口的常规用法,例如 src/rpc/net.cpp 中addnode的示例为"192.168.0.6:8233"

由此可以推断:若你的节点运行在测试网而非主网,需要把脚本中的端口8233相应改为18233,否则限速规则不会命中任何 P2P 流量。

三、脚本整体工作流程

contrib/qos/tc.sh的限速原理是"iptables 打标记 + tc 按标记分流"两步协作:

  1. iptables/ip6tablesmangle表的OUTPUT链中,识别源或目的端口为8233且目标 IP 不在局域网内的 TCP 报文,为其打上防火墙标记(fwmark):IPv4 标记0x2,IPv6 标记0x4
  2. tc在指定网卡上建立 HTB(Hierarchical Token Bucket,分层令牌桶)队列,注册基于标记(handle ... fw)的分类过滤器:标记为1的报文进入"不限速"类(1:10),标记为2的报文进入"限速"类(1:11),从而实现对 P2P 流量的精确整形。

该方案不依赖端口以外的七层特征,性能开销低,且规则可随时清理、重新加载。

四、配置项详解

脚本顶部的变量即全部可调参数,部署前务必按实际环境修改:

变量默认值含义与建议
IFeth0需要限速的物理网卡名称,用ip addrifconfig确认实际网卡(如ens3enp0s3
LINKCEIL1gbit网卡链路带宽上限,即 HTB 根类(1:1)的速率上限,应不小于真实带宽
LIMIT160kbit限速目标:Zcash P2P 出站流量被压制的速率,默认 160 kbit/s,可按需调大(如1mbit5mbit
LOCALNET_V4192.168.0.0/16豁免限速的 IPv4 局域网网段,若为0.0.0.0/0则关闭 IPv4 豁免
LOCALNET_V6fe80::/10豁免限速的 IPv6 局域网网段(链路本地地址),留空则跳过全部 IPv6 规则

提示:LIMIT单位遵循tc的速率语法,支持kbitmbitkbps等;LINKCEIL需大于等于LIMIT,否则限速类永远无法获得令牌。

五、tc.sh 逐段解析

1. 清理旧规则并建立 HTB 根队列

tc qdisc del dev ${IF} root tc qdisc add dev ${IF} root handle 1: htb default 10

先删除网卡上可能存在的旧根队列,再新建 HTB 根队列,handle 1:是根句柄,default 10表示未命中任何过滤器时,报文默认进入类1:10(即不限速类)。

2. 创建父类与两个子类

tc class add dev ${IF} parent 1: classid 1:1 htb rate ${LINKCEIL} ceil ${LINKCEIL} tc class add dev ${IF} parent 1:1 classid 1:10 htb rate ${LINKCEIL} ceil ${LINKCEIL} prio 0 tc class add dev ${IF} parent 1:1 classid 1:11 htb rate ${LIMIT} ceil ${LIMIT} prio 1
  • 1:1是根子类,作为总带宽池(rateceil均为LINKCEIL);
  • 1:10不限速(上限同样是链路带宽),prio 0优先级最高,承载被标记为1的局域网流量;
  • 1:11限速为LIMITprio 1优先级较低,承载被标记为2的公网 P2P 流量。

3. 注册基于防火墙标记的过滤器

tc filter add dev ${IF} parent 1: protocol ip prio 1 handle 1 fw classid 1:10 tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11 tc filter add dev ${IF} parent 1: protocol ipv6 prio 3 handle 1 fw classid 1:10 tc filter add dev ${IF} parent 1: protocol ipv6 prio 4 handle 2 fw classid 1:11

handle <x> fw表示按skb->mark分流:IPv4 报文中标记0x1进 1:10、0x2进 1:11;IPv6 同理(注意脚本注释特别说明:v6 的优先级不能与 v4 相同,因此使用 prio 3/4)。这也是为什么 iptables 侧要打0x2/0x4标记——0x4对应的正是 ip6tables 场景。

4. iptables 打标记规则

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8233 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8233 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 ip6tables -t mangle -A OUTPUT -p tcp -m tcp --dport 8233 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4 ip6tables -t mangle -A OUTPUT -p tcp -m tcp --sport 8233 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4
  • 每条规则都同时覆盖--dport 8233(节点作为服务端被连接)与--sport 8233(节点主动外连),保证双向出站流量都被覆盖;
  • ! -d ${LOCALNET_V4}是取反匹配:目标不在局域网内才打标记,因此本地节点间的同步流量不受影响;
  • 规则追加在OUTPUT链(-A),对本地进程发出的报文生效,不干扰入站流量。

脚本中还保留了一段被注释掉的"批量删除 iptables 旧规则"逻辑,说明作者曾考虑过重复执行时规则叠加的问题——如果你反复运行脚本,建议在运行前手动清理mangle表中上一次的 OUTPUT 规则。

六、部署步骤与验证方法

部署

  1. 确认网卡名并调整IF等变量;
  2. 以 root 权限执行脚本(tc与 iptables 均需要 root):
sudo bash contrib/qos/tc.sh
  1. 脚本幂等性说明:脚本开头会先删除旧根队列再重建,tc部分可重复执行;但 iptables 规则使用-A追加,重复执行会累积重复规则。

验证

# 查看队列与各类的实时统计 tc -s qdisc show dev eth0 tc -s class show dev eth0 # 查看 mangle 表标记规则 iptables -t mangle -L OUTPUT -n -v ip6tables -t mangle -L OUTPUT -n -v

tc -s class输出中,类1:11rate与累计字节数应稳定在LIMIT附近增长,而1:10基本不受限制;iptables -L中对应规则的计数(pkts/bytes)持续增长,说明 P2P 报文正在被正确打标分流。

清理

tc qdisc del dev eth0 root iptables -t mangle -D OUTPUT 1 # 按需逐条删除,或 flush 前先确认 iptables -t mangle -F OUTPUT # 谨慎使用:会清空 OUTPUT 链全部 mangle 规则

七、与应用层限速方案的对比与组合

contrib/qos属于内核网络栈层的硬限速,无论节点进程内部行为如何,出站流量都会被强制整形。与之互补的是 Zcash 自带的应用层流量控制选项:

  • -maxuploadtarget=<n>:以 MiB/24h 为单位的出站流量软上限,默认关闭(DEFAULT_MAX_UPLOAD_TARGET = 0,见 src/net.h);达到阈值后节点停止向对等节点提供"历史区块"(早于一周的区块),从而压低上传量。其配置在 src/init.cpp 中落地为CNode::SetMaxOutboundTarget(...)
  • 若带宽极为紧张,可结合 doc/reduce-traffic.md 的建议:-listen=0减少入站连接、-maxconnections=<num>限制连接数、-blocksonly关闭交易中继。

两者的区别在于:-maxuploadtarget只影响"是否继续服务历史区块",不改变瞬时速率;而tc脚本直接控制瞬间带宽占用。对"长期在线且不能让 P2P 挤占带宽"的部署场景,推荐用contrib/qos限速 +-maxuploadtarget限制每日上传总量的组合拳。

八、注意事项与常见问题

  1. 网卡与虚拟化环境:云主机上eth0可能不存在,务必先用ip addr确认;容器或 NAT 环境下OUTPUT链行为可能不同,需在目标主机实测。
  2. IPv6 优先级:脚本注释明确警告 v4/v6 过滤器不能共用优先级,修改时请保持 prio 1/2(v4)与 3/4(v6)的结构。
  3. 测试网适配:测试网节点端口为 18233,需同步修改 iptables/ip6tables 中的端口号。
  4. LOCALNET_V6置空:若不使用 IPv6,将LOCALNET_V6=""即可跳过全部 IPv6 分支(脚本已用if [ -n "${LOCALNET_V6}" ]做保护)。
  5. 限速过低的影响LIMIT设置过小会导致区块同步缓慢、新节点连接体验差;建议结合节点角色(提供公共服务 vs 私有节点)权衡。
  6. 流量统计tc的限速只统计本机发出并被整形队列处理的报文,配合iptables -L -n -v的字节计数可以交叉验证实际效果。

结语

contrib/qos/tc.sh用不到 60 行脚本,完整演示了 Linux 下"iptables 打标 + HTB 分级限速"这一经典 QoS 套路在 Zcash 节点运维中的落地:既能保护公网带宽,又不影响局域网内节点间的快速同步。无论你是想直接部署这套脚本,还是希望理解 Linux 流量整形与 Zcash 网络栈(src/chainparams.cpp 中定义端口、src/init.cpp 中落地带宽参数)的协同方式,它都是一份小而精的参考实现。

【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 11:22:07

PMSM无感启动全速域控制:破解0-50rpm观测盲区

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 11:18:46

斑马优化算法结合Otsu实现高效多阈值图像分割

## 1. 项目背景与核心价值在医学影像分析、遥感图像处理等领域&#xff0c;多阈值图像分割一直是关键预处理步骤。传统Otsu方法在处理复杂图像时&#xff0c;常因阈值数量增加导致计算量指数级增长。这个项目将斑马优化算法(ZOA)与Ostu方法结合&#xff0c;实现了高效的多阈值分…

作者头像 李华
网站建设 2026/9/17 11:18:05

从元数据到数据血缘:DataHub 架构设计与核心工作原理全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 11:17:52

MATLAB中LSTM-Transformer混合模型时间序列预测实战

简介&#xff1a;本资源是一份面向MATLAB深度学习开发者的时间序列预测实战指南&#xff0c;聚焦LSTM与Transformer编码器融合建模&#xff0c;解决多变量时序中长期依赖捕获难、跨维度关联建模弱等核心问题&#xff0c;适用于金融趋势预判、气象数据推演及工业设备状态预测等场…

作者头像 李华