拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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目录提供了一套基于 LinuxtcTraffic Control与iptables的 QoS 脚本它通过 HTB 队列规则限制发往 Zcash P2P 端口 8233 的出站 TCP 流量同时放行局域网内节点之间的同步流量。读完本文你将掌握该脚本的完整配置项含义、逐行实现原理并能在自己的 Linux 节点上直接部署与验证。一、脚本解决的问题为什么需要 QoSZcash 节点默认最多会与大量对等节点peer建立连接并持续交换数据。若节点部署在带宽受限的 VPS 或家庭网络中P2P 流量可能干扰其他服务。contrib/qos的设计目标是限制对外 P2P 出站带宽仅针对端口8233Zcash 主网 P2P 默认端口的 TCP 出站流量进行限速保留局域网内高速传输当目标地址落在本地网段IPv4 默认192.168.0.0/16、IPv6 默认fe80::/10时不做限速支持主节点 本地轻节点架构正如 README 所述用户可同时运行一个常驻的zcashd全节点以及另一个本地zcashd/图形客户端由本地节点从全节点拉取区块二者之间走局域网通道不受限速影响而对公网的整体出站流量则被压制在设定阈值内。脚本头部版权声明表明其源自 Bitcoin Core2017后被 Zcash 项目引入并适配是理解 Linux 流量整形与 Zcash 网络栈结合的极佳范例。二、端口 8233Zcash 主网 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 按标记分流两步协作iptables/ip6tables在mangle表的OUTPUT链中识别源或目的端口为8233且目标 IP 不在局域网内的 TCP 报文为其打上防火墙标记fwmarkIPv4 标记0x2IPv6 标记0x4tc在指定网卡上建立 HTBHierarchical Token Bucket分层令牌桶队列注册基于标记handle ... fw的分类过滤器标记为1的报文进入不限速类1:10标记为2的报文进入限速类1:11从而实现对 P2P 流量的精确整形。该方案不依赖端口以外的七层特征性能开销低且规则可随时清理、重新加载。四、配置项详解脚本顶部的变量即全部可调参数部署前务必按实际环境修改变量默认值含义与建议IFeth0需要限速的物理网卡名称用ip addr或ifconfig确认实际网卡如ens3、enp0s3LINKCEIL1gbit网卡链路带宽上限即 HTB 根类1:1的速率上限应不小于真实带宽LIMIT160kbit限速目标Zcash P2P 出站流量被压制的速率默认 160 kbit/s可按需调大如1mbit、5mbitLOCALNET_V4192.168.0.0/16豁免限速的 IPv4 局域网网段若为0.0.0.0/0则关闭 IPv4 豁免LOCALNET_V6fe80::/10豁免限速的 IPv6 局域网网段链路本地地址留空则跳过全部 IPv6 规则提示LIMIT单位遵循tc的速率语法支持kbit、mbit、kbps等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是根子类作为总带宽池rate与ceil均为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:11handle x fw表示按skb-mark分流IPv4 报文中标记0x1进 1:10、0x2进 1:11IPv6 同理注意脚本注释特别说明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 规则。六、部署步骤与验证方法部署确认网卡名并调整IF等变量以 root 权限执行脚本tc与 iptables 均需要 rootsudo bash contrib/qos/tc.sh脚本幂等性说明脚本开头会先删除旧根队列再重建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:11的rate与累计字节数应稳定在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 自带的应用层流量控制选项-maxuploadtargetn以 MiB/24h 为单位的出站流量软上限默认关闭DEFAULT_MAX_UPLOAD_TARGET 0见 src/net.h达到阈值后节点停止向对等节点提供历史区块早于一周的区块从而压低上传量。其配置在 src/init.cpp 中落地为CNode::SetMaxOutboundTarget(...)若带宽极为紧张可结合 doc/reduce-traffic.md 的建议-listen0减少入站连接、-maxconnectionsnum限制连接数、-blocksonly关闭交易中继。两者的区别在于-maxuploadtarget只影响是否继续服务历史区块不改变瞬时速率而tc脚本直接控制瞬间带宽占用。对长期在线且不能让 P2P 挤占带宽的部署场景推荐用contrib/qos限速 -maxuploadtarget限制每日上传总量的组合拳。八、注意事项与常见问题网卡与虚拟化环境云主机上eth0可能不存在务必先用ip addr确认容器或 NAT 环境下OUTPUT链行为可能不同需在目标主机实测。IPv6 优先级脚本注释明确警告 v4/v6 过滤器不能共用优先级修改时请保持 prio 1/2v4与 3/4v6的结构。测试网适配测试网节点端口为 18233需同步修改 iptables/ip6tables 中的端口号。LOCALNET_V6置空若不使用 IPv6将LOCALNET_V6即可跳过全部 IPv6 分支脚本已用if [ -n ${LOCALNET_V6} ]做保护。限速过低的影响LIMIT设置过小会导致区块同步缓慢、新节点连接体验差建议结合节点角色提供公共服务 vs 私有节点权衡。流量统计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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门