尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Dogecoin 节点带宽限速指南:使用 contrib/qos 脚本(tc + iptables)为 22556 端口设置 QoS

Dogecoin 节点带宽限速指南:使用 contrib/qos 脚本(tc + iptables)为 22556 端口设置 QoS Dogecoin 节点带宽限速指南使用 contrib/qos 脚本tc iptables为 22556 端口设置 QoS【免费下载链接】dogecoinvery currency项目地址: https://gitcode.com/gh_mirrors/do/dogecoin本文以 Dogecoin 仓库中 contrib/qos/README.md 及配套脚本 contrib/qos/tc.sh 为主体系统讲解如何在 Linux 上通过tcTraffic Control与iptables/ip6tables为 Dogecoin 节点流量设置出口带宽限制QoS。读完本文你将掌握脚本中每个配置项的含义与调优方法、HTB 队列 fwmark 标记的完整数据链路并理解常驻全节点 本地轻节点这一典型拓扑的部署思路以及它与-maxuploadtarget参数之间的区别与互补关系。一、脚本定位为什么需要 QoS 限速Dogecoin 是一个点对点网络。运行中的dogecoind节点会持续与全网其他节点同步区块、转发交易其出站带宽消耗可能长期占满上行链路挤压同一台机器或同一局域网内其他业务例如另一个本地钱包节点的可用带宽。contrib/qos/README.md 明确给出了该脚本的设计意图限制发往 Dogecoin 网络的出站带宽具体表现为仅限制出站 TCP 流量中源端口或目的端口为22556的连接当目的 IP 位于局域网内时不做限速本地互联不占用公网上行带宽也无需限速从而支持这样的拓扑一台7×24 常驻的dogecoind全节点持续与公网同步、存储区块而本地的另一台dogecoind/dogecoin-qt实例只与该常驻节点建立连接并从它那里获取区块数据本地流量不受限速影响。端口 22556 正是 Dogecoin 主网的默认 P2P 端口定义于 src/chainparams.cpp 的nDefaultPort 22556;仓库中的内置种子节点地址 src/chainparamsseeds.h 也全部使用该端口。脚本针对 22556 做过滤实质就是只限 Dogecoin P2P 流量不限其他业务。二、脚本全景配置变量与逐行原理脚本本身是纯 bash顶部集中定义了所有可调参数无需修改内核参数或编译任何代码即可直接使用。先看完整的配置段#network interface on which to limit traffic IFeth0 #limit of the network interface in question LINKCEIL1gbit #limit outbound Bitcoin protocol traffic to this rate LIMIT160kbit #defines the IPv4 address space for which you wish to disable rate limiting LOCALNET_V4192.168.0.0/16 #defines the IPv6 address space for which you wish to disable rate limiting LOCALNET_V6fe80::/10变量默认值含义与调优建议IFeth0执行限速的网络接口。必须改为实际出站接口可用ip route或ip addr确认如ens3、enp0s3等。LINKCEIL1gbit链路速率上限tc术语中的 ceil即该接口的物理上行带宽。应设置为运营商实际提供的上行带宽例如100mbit、30mbit。LIMIT160kbit分配给 Dogecoin P2P 流量的目标限速值。这是 QoS 的核心参数可按需放宽如1mbit但建议至少保证节点能完成区块同步。LOCALNET_V4192.168.0.0/16不做限速的 IPv4 网段通常为内网段。可按实际局域网改成10.0.0.0/8或172.16.0.0/12。LOCALNET_V6fe80::/10不做限速的 IPv6 链路本地网段。若无 IPv6 环境可置空LOCALNET_V6脚本会跳过 IPv6 相关规则。2.1 第一步清理旧规则tc qdisc del dev ${IF} root先删除网卡上已存在的根队列规则保证脚本可重复执行而不产生叠加冲突。若原本没有规则tc会报错可忽略或改为2/dev/null。2.2 第二步建立 HTB 根队列与两个子类#add root class tc qdisc add dev ${IF} root handle 1: htb default 10 #add parent class tc class add dev ${IF} parent 1: classid 1:1 htb rate ${LINKCEIL} ceil ${LINKCEIL} #add our two classes. one unlimited, another limited 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这里使用了 Linux 经典的HTBHierarchical Token Bucket分层令牌桶调度器层次结构为1:根队列default 10表示未被任何过滤器匹配的包默认进入1:10类即默认不限速1:1父类速率与上限都是LINKCEIL作为总带宽池1:10子类速率 LINKCEIL即不限速类用于本地流量与其他业务1:11子类速率 上限 LIMIT即限速类专门容纳 Dogecoin P2P 流量。两个子类分别设置prio 0与prio 1不限速类优先级更高保证限速流不会抢占正常业务。2.3 第三步注册 fw 过滤器把标记映射到类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 if [ ! -z ${LOCALNET_V6} ] ; then # v6 cannot have the same priority value as v4 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 fifwfirewall过滤器的作用是根据数据包上携带的防火墙标记fwmark将其送入对应的类。规则为handle 1fwmark 为0x1IPv4 场景下由--set-mark 0x1产生见下文→ 送入1:10不限速类handle 2fwmark 为0x2→ 送入1:11限速类。IPv6 必须使用与 IPv4不同的 prio 值因此脚本对protocol ipv6使用prio 3/prio 4这是脚本中一处容易被忽略的细节。2.4 第四步用 iptables 给 Dogecoin 流量打标记iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22556 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 22556 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 if [ ! -z ${LOCALNET_V6} ] ; then ip6tables -t mangle -A OUTPUT -p tcp -m tcp --dport 22556 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4 ip6tables -t mangle -A OUTPUT -p tcp -m tcp --sport 22556 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4 fi这组规则是整个方案的核心匹配逻辑发生在mangle表的OUTPUT链本机发出的包-p tcp -m tcp --dport 22556出站 TCP 包的目的端口为 22556向其他节点发起连接本机为客户端-p tcp -m tcp --sport 22556出站 TCP 包的源端口为 22556其他节点连入本机本机为服务端! -d ${LOCALNET_V4}目的 IP不在局域网网段内——这正是 README 所说的不限制 LAN 流量的实现方式-j MARK --set-mark 0x2命中则打上 fwmark0x2IPv6 场景使用0x4随后被上一步的handle 2过滤器捕获并送入1:11限速类。把匹配条件翻译成一句大白话就是凡是本机与公网 Dogecoin 节点之间的 22556 端口 TCP 流量统一限速到LIMIT本机与局域网内节点之间的流量不打标、不限速。2.5 被注释掉的清理逻辑脚本中部有一段被注释掉的循环#delete any existing rules #disable for now #ret0 #while [ $ret -eq 0 ]; do # iptables -t mangle -D OUTPUT 1 # ret$? #done其本意是删除OUTPUT链上已存在的 mangle 规则以避免重复但当前版本刻意停用#disable for now意味着重复执行脚本时iptables -A可能追加重复规则。实际使用时建议在脚本执行前手动清空相关规则如iptables -t mangle -F OUTPUT需谨慎会清掉所有 OUTPUT mangle 规则或按需自行恢复这段逻辑。三、完整数据链路从发包到限速的四个环节综合上面的分析一个命中限速的出站数据包依次经历iptables -t mangle OUTPUT按端口 22556 非局域网目的 IP 匹配打上 fwmark0x2IPv6 为0x4tc filter ... fw handle 2识别该标记将包分类到1:11HTB 子类1:11类以LIMIT默认160kbit为速率与上限进行令牌桶整形包以不超过LIMIT的速率从IF接口发出未打标的包走default 10进入1:10类不受任何限制。正是iptables 负责识别业务端口/网段tc 负责整形速率的分工让脚本在保持匹配规则灵活的同时把带宽控制完全交给内核的 HTB 调度器完成。四、典型应用场景常驻全节点 本地轻节点README 描述的目标拓扑非常明确常驻节点一台始终在线的dogecoind全节点持续连接公网、同步并保存完整区块链本地节点同一局域网内的另一台dogecoind或dogecoin-qt实例通过-connect常驻节点IP等参数只与常驻节点相连从它那里拉取区块。在这种架构下本地节点间的数据传输属于LOCALNET_V4/LOCALNET_V6网段内通信不被打标、不受限速而常驻节点与公网之间的大流量同步则被严格限制在LIMIT之内避免挤占上行带宽。这比让常驻节点无节制地占满带宽更适合带宽紧张的家庭宽带或 VPS 场景。五、与 -maxuploadtarget 的对比两种限速思路除了网络层的tc限速Dogecoin 节点本身还内置了应用层的出站流量控制参数-maxuploadtarget定义-maxuploadtargetn表示每 24 小时出站流量上限单位 MiB0表示不限默认见 src/init.cpp 与 src/net.h 中的DEFAULT_MAX_UPLOAD_TARGET 0实现节点在 src/net.cpp 读取并保存该限额发送数据时按周期累加字节数并在超限时暂停发送nMaxOutboundTotalBytesSentInCycle相关逻辑。两者对比维度contrib/qos 脚本tc iptables-maxuploadtarget作用层内核网络栈HTB 整形节点应用层发送调度粒度按端口22556 网段匹配节点整体出站流量限制形式实时速率kbit/mbit 每秒24 小时累计配额MiB适用场景约束瞬时带宽占用、保护上行链路约束每日流量总额、控制流量费用是否改代码不需要不需要启动参数即可两者互补而非互斥追求带宽不被打满用tc脚本追求每日流量不超套餐用-maxuploadtarget也可以同时启用。需要说明的是tc脚本限速的是速率并不保证流量总额因此两者在语义上不可互相替代。六、使用方法与注意事项6.1 运行前检查确认tc、iptables、ip6tables已安装且当前用户有 root 权限脚本直接操作内核队列与防火墙表确认IF与实际出站网卡一致ip -brief addr查看确认LINKCEIL不超过真实上行带宽LIMIT不低于节点正常同步所需速率过低的限速会让区块同步明显变慢。6.2 执行sudo bash contrib/qos/tc.sh执行后可用以下命令验证tc qdisc show dev eth0 # 查看根队列 tc class show dev eth0 # 查看 1:10 / 1:11 两个类及速率 iptables -t mangle -L OUTPUT -n -v # 查看 22556 端口打标规则与命中计数iptables -v输出中的计数器能直观反映规则是否命中——若命中数持续增长而 Dogecoin 节点正在同步说明限速已生效。6.3 撤销限速tc qdisc del dev eth0 root iptables -t mangle -D OUTPUT 规则序号 # 逐条删除 22556 打标规则仓库为只读镜像本文仅介绍查看、配置与运行方式如需持久化可将脚本接入 systemd 或开机自启此处不再展开。6.4 注意事项脚本针对主网端口 22556若运行测试网节点需相应调整端口测试网默认端口不同否则规则不会命中IPv6 与 IPv4 的 prio 必须错开脚本已处理自定义扩展规则时务必沿用这一约定重复执行会追加 iptables 规则脚本中清理逻辑默认被注释重复执行前建议先清理旧规则避免规则叠加该脚本源自 Bitcoin CoreDogecoin 仓库在 doc/release-notes/bitcoin/release-notes-0.9.0.md 的发布说明中记录了引入Linux 脚本 contrib/qos/tc.sh 以限制出站带宽的变更属于经过长期验证的成熟方案。七、小结contrib/qos/tc.sh用约 60 行 bash 完整实现了一套基于HTB 队列 fwmark 标记的 Dogecoin 出口限速方案iptables精确识别 22556 端口的公网 P2P 流量并打标tc将其导入限速类整形同时通过LOCALNET_V4/V6放行局域网流量从而支撑常驻全节点 本地轻节点的高效拓扑。对带宽有限的上行链路而言它是比应用层-maxuploadtarget更直接、更细粒度的网络层补充手段两者配合使用可以获得瞬时带宽 每日总额的双重控制效果。【免费下载链接】dogecoinvery currency项目地址: https://gitcode.com/gh_mirrors/do/dogecoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表