资讯详情

Weave Net 网络中的 IP 地址、路由与子网:从 CIDR 记法到路由表与源码级解析

📅 2026/10/9 2:38:02 | 华诺云谱 👁 阅读
Weave Net 网络中的 IP 地址、路由与子网:从 CIDR 记法到路由表与源码级解析
网络云原生【免费下载链接】weaveSimple, resilient multi-host containers networking and more.项目地址https://gitcode.com/gh_mirrors/weave4/weave点击查看免费下载Weave Net 在多个主机之间搭建了一个私有容器网络容器获得的 IP 地址与公网隔离因此无需担心与外部地址冲突。本文围绕 Weave Net 的 IP 编址模型展开先厘清 IP、网络、路由三个基础概念再解读 Weave Net 使用的 CIDR 记法然后逐行分析一个真实容器内的路由表并深入其底层实现地址类型定义、默认分配范围、重叠检测与 IPAM 机制最后给出手动指定容器 IP 的三种实战方式。读完本文你将能够读懂 Weave Net 容器内的任何一条路由能判断--ipalloc-range是否与宿主机路由冲突并能按需为容器分配固定 IP。IP 基础概念地址、网络与路由在深入 Weave Net 之前先统一几个术语这也是官方文档定义的基础概念IPInternet Protocol互联网协议全球数十亿联网设备之间通信的基本协议是网络通信的基础。IP 地址绝大多数场景下指用点分隔的四个数字例如192.168.48.12。每个数字占一个字节8 位取值范围是 0255因此一个 IPv4 地址恰好是 32 位。网络Network一组彼此知道如何通信的 IP 地址的集合。网络地址是 IP 地址的某个前缀例如192.168.48。为了标明地址中哪一部分属于网络前缀会在地址后追加一个斜杠和前缀位数例如/24表示前 24 位即前三个字节构成网络部分。路由Route一条关于发往别处的流量该如何处理的指令——它指定一个网络以及与该网络通信的途径。每一台使用 IP 的设备都维护着一张路由表对于任何目的地址设备都会查表找到匹配的路由并按表中指示的方向把数据发送出去。从源码角度看Weave Net 将上述模型落到了非常直接的实现上net/address/address.go 中用type Address uint32将整个 IPv4 地址表示为一个 32 位整数第 10 行并提供了Range地址区间采用[Start, End)半开区间、CIDR地址 前缀长度、Add/Subtract/Length等算术辅助类型与方法。ParseCIDR第 117-126 行在解析时明确拒绝非 IPv4 地址并返回Non-IPv4 address not supported说明 Weave Net 的地址核心模型以 IPv4 为准CIDR.HostRange()第 154-157 行则按 RFC 1122 剔除子网的第一个和最后一个地址网络地址与广播地址只返回可分配给容器的主机范围。Weave Net 中的 IP 地址记法看懂 CIDR 前缀Weave Net 使用标准的 CIDR无类域间路由记法书写地址与子网。以10.4.2.6/8为例网络前缀是前 8 位即10把这个网络完整写出来就是10.0.0.0/8——它覆盖了从10.0.0.0到10.255.255.255的全部地址。最常见的三种前缀长度是8、16、24分别对应前 1、2、3 个字节为网络部分但完全没有理由限制只能用这三种长度你完全可以使用/9或/26这样的非字节对齐前缀。例如地址6.250.3.1/9属于6.128.0.0/9网络——因为前 9 位为000001100十进制前两段是 6.128而6.250的前 9 位恰好落在这个范围内。这类地址换算互联网上有大量 CIDR 计算器可辅助验证在 Weave Net 中有非常直接的工程意义--ipalloc-range等参数全部以 CIDR 记法书写例如--ipalloc-range 10.2.0.0/16表示分配所有以10.2开头的地址地址区间与 CIDR 之间的相互转换是 IPAM 的核心操作。在 net/address/address.go 中Range.CIDRs()第 77-108 行把一个任意连续地址区间拆解成一组 CIDR 对齐的连续子网掩码逐位右移探测找出能覆盖区间且不过长的最小掩码CIDR.Range()第 151-153 行则把 CIDR 还原为区间。只有当区间大小恰为 2 的幂且起始地址对齐时AsCIDRString第 27-36 行才能无损表达为单个 CIDR否则就会拆成多个。阅读一个真实容器的路由表下面是一张附着到 Weave 网络上的容器内的真实路由表ip route show输出摘自官方文档# ip route show default via 172.17.42.1 dev eth0 10.2.2.0/24 dev ethwe proto kernel scope link src 10.2.2.1 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.170这个容器有两个网络接口eth0Docker 分配给它、用于连接 Docker 默认桥接网络的接口所在网络是172.17.0.0/16ethweWeave Net 为它添加的接口所在网络是10.2.2.0/24。路由表如何决定流量的去向对于目的地址落在172.17.0.0/16或10.2.2.0/24内的数据包内核会直接沿着对应接口发送这两条都是proto kernel scope link的直连路由容器启动时内核根据接口地址自动生成。对于不匹配任何规则的其他地址default via 172.17.42.1 dev eth0这条默认路由会把流量交给172.17.42.1即宿主机的 Docker 桥由宿主机继续转发。具体到两个典型场景本容器想与地址为10.2.2.9的另一容器通信查表命中10.2.2.0/24 dev ethwe数据包从ethwe发出之后 Weave Net 负责把流量路由到对端主机上的目标容器本容器想访问外部服务器74.125.133.128查表无匹配走默认路由经eth0交由宿主机处理。ethwe 这个名字并非随意为之它定义在 net/veth.go 第 109 行VethName ethwe // name inside container namespace——即容器命名空间内 veth 对一端固定命名为ethwe。而宿主侧的网桥结构net/bridge.go 第 27-30 行注释展示了完整拓扑(container-veth)- weave -(vethwe-bridge)--(vethwe-pcap)即容器内的ethwe连接到宿主机上名为weave的 Linux 网桥再由vethwe-pcap或 fastdp 场景下的vethwe-datapath把报文送入 Weave 的数据通道实现跨主机的二三层转发。默认分配范围与主机路由冲突检测Weave Net 默认把10.32.0.0/12作为自动分配 IP 的地址范围——这是一个 12 位前缀的子网覆盖从10.32.0.0到10.47.255.255的所有地址。该默认值直接写死在 weave 启动脚本中第 1154-1155 行if [ -z $IPRANGE_SPECIFIED ] ; then IPRANGE10.32.0.0/12。由于10.32.0.0/12属于私有地址段如果宿主机自身恰好也在使用重叠的私有路由例如整体占用10.0.0.0/8两者就会冲突内核面对10.32.5.6这样的地址时将无法确定它属于 Weave 的10.32.0.0/12还是宿主网络的10.0.0.0/8。此时weave launch会给出类似下面的错误Network 10.32.0.0/12 overlaps with existing route 10.0.0.0/8 on host. ERROR: Default --ipalloc-range 10.32.0.0/12 overlaps with existing route on host. You must pick another range and set it on all hosts.这个报错机制与底层实现一一对应net/route.go 中的CheckNetworkFree第 13-20 行遍历宿主全部 IPv4 路由netlink.RouteList只要route.Dst与目标子网存在重叠就返回错误错误文案与上面第一条输出完全一致overlaps第 23-25 行通过某一网络的起始点是否落在另一网络内来判断重叠weave 脚本在启动时调用check_overlap做同样的检查若默认范围冲突则直接exit 1报错若用户显式指定的范围冲突则只输出 WARNING第 1161-1165 行因为这是用户明知故犯的选择。处理方式有两种若确信该地址段未被实际使用可在所有主机上显式传--ipalloc-range强制使用该范围即使与现有路由重叠更稳妥的做法是换一个不冲突的私有地址段例如172.30.0.0/16。无论选哪种--ipalloc-range必须在所有主机上保持一致否则各主机会认为彼此管理着不同的地址空间。相关完整讨论见 在特定范围内分配 IP 地址。地址空间背后的 IPAM 机制理解了范围之后值得再往下一层看看 Weave Net 如何在这些范围内自动分配地址。机制概述详见 docs/ipam.md 与 自动 IP 地址管理环RingCRDTWeave Net 把整个分配范围视作一个环用令牌token标记每个范围段的起始地址令牌归属某个 peer并携带版本号每个 peer 只能修改自己拥有的令牌整个环结构始终通过 Gossip 机制整体传播合并时同一地址的令牌取版本号更高者。每个 peer 在自己拥有的范围段内可以自由分配用完后再向其他 peer 按权重随机要空间。Paxos 初始化全新集群的环初始状态通过一次性的 basic Paxos 共识建立——参与者在共识值上达成一致即初始参与分配的各 peer各自均分地址空间共识完成后才初始化环。这也是weave launch时--ipalloc-init consensus参数的原理来源多数派 floor(n/2) 1。数据持久化地址空间在各 peer 间的划分、以及本机容器已获分配的具体地址会持久化到名为weavedb的数据卷容器内的 BoltDB 文件中weave 启动脚本第 1186-1191 行会先创建该数据卷容器peer 重启后立即可用。HTTP 分配接口每个 peer 上的分配器allocator暴露 HTTP 接口供容器基础设施调用实现在 ipam/http.goPOST /ip/{id}分配默认子网内的地址、POST /ip/{id}/{ip}/{prefixlen}在指定子网内分配、GET /ip/{id}查询、DELETE /ip/{id}释放weave rmpeer、weave prime分别对应DELETE /peer/{peer}与GET /ring见 weave 脚本第 1535-1545 行。IPAM 默认把分配集中在10.32.0.0/12但通过--ipalloc-range可换成任意 CIDR 范围例如host1$ weave launch --ipalloc-range 10.2.0.0/16这里/16的含义与本文前述的 CIDR 记法完全一致分配器只会给出前 16 位为10.2的容器地址。范围在集群所有主机上共享并按各 peer 的实际需求动态切分即使某组 peer 因网络分区与其余部分隔离也能继续在自己已有的范围内工作恢复连通后不会产生冲突。手动指定容器 IP 地址自动分配保证了全网络唯一但你完全可以绕过它为特定容器指定 IP。先说明如何查看自动分配结果weave ps会列出容器及其分配的地址格式为容器 ID、MAC、CIDR 地址例如host1$ weave ps a1 a7aee7233393 7a:44:d3:11:10:70 10.32.0.2/12容器退出后 Weave Net 会自动回收其地址供后续复用。手动指定 IP 的方式取决于容器如何接入 Weave Net详见 手动指定容器的 IP 地址使用 CNI 时调用方需指定支持静态 IP 的 IPAM 插件如 containernetworking 的 static 分配器截至文档撰写时 Kubernetes 尚无直接指定静态 IP 的简单途径。使用 Weave Net Docker 插件时直接用 Docker 的--ip标志例如docker run --networkmynetwork --ip172.18.0.22 ...。使用 Weave Net Docker 代理时通过WEAVE_CIDR环境变量显式给出 CIDR 记法的地址与子网。例如在$HOST1上启动host1$ docker run -e WEAVE_CIDR10.2.1.1/24 -ti weaveworks/ubuntu root7ca0f6ecf59f:/#在$HOST2上启动host2$ docker run -e WEAVE_CIDR10.2.1.2/24 -ti weaveworks/ubuntu root04c4831fafd3:/#然后验证双向连通root7ca0f6ecf59f:/# ping -c 1 -q 10.2.1.2 PING 10.2.1.2 (10.2.1.2): 48 data bytes --- 10.2.1.2 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max/stddev 1.048/1.048/1.048/0.000 ms root04c4831fafd3:/# ping -c 1 -q 10.2.1.1 PING 10.2.1.1 (10.2.1.1): 48 data bytes --- 10.2.1.1 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max/stddev 1.034/1.034/1.034/0.000 ms需要强调的约束手动指定的地址与掩码虽然可以任意设置但必须避开宿主机正在使用的 IP 范围、外部服务可能访问的地址段且容器之间的地址必须全局唯一——如果恰好选中了自动分配器已分配的地址会收到警告提示。常见问题与排错weave launch报默认范围重叠宿主机存在与10.32.0.0/12重叠的路由按本文第 4 节的两种方式处理显式指定或改选其他私有段。多子网/多租户需要把分配范围拆成多个子网时配合--ipalloc-range与--ipalloc-default-subnet使用相关说明见 多子网自动分配应用隔离场景见 应用隔离。peer 初始化与扩容--ipalloc-init seed、--ipalloc-init consensus、--ipalloc-init observer三种策略的选择与多数派计算见 自动 IP 地址管理。查看当前地址占用weave status会报告本 peer 拥有的地址范围与容器分配情况排错细节见 IPAM 故障排查。延伸阅读自动 IP 地址管理 —— 初始化策略、quorum 与weave prime、weave rmpeer的完整说明在特定范围内分配 IP 地址 ——--ipalloc-range与重叠检测手动指定容器的 IP 地址 —— CNI / 插件 / 代理三种方式多子网自动分配 —— 多 CIDR 场景docs/ipam.md —— 环 CRDT、Paxos 初始化、peer 退出与rmpeer的底层设计源码net/address/address.go地址/区间/CIDR 类型、net/route.go重叠检测、net/veth.goethwe命名、ipam/http.go分配 HTTP 接口、weave启动参数与默认范围赞分享网络云原生【免费下载链接】weaveSimple, resilient multi-host containers networking and more.项目地址https://gitcode.com/gh_mirrors/weave4/weave点击查看免费下载相关推荐如何高效管理Illusion游戏ModKKManager新手必备使用指南如何高效管理Illusion游戏ModKKManager新手必备使用指南 如果你是Illusion游戏如Koikatsu、HoneySelect的忠实玩家操作系统云原生虚拟化网络CS-Notes 计算机网络网络层深度精讲IP 编址、ARP/ICMP 与路由器转发路由协议全解析CS Notes 计算机网络网络层深度精讲IP 编址、ARP/ICMP 与路由器转发路由协议全解析 本文是对本知识库 计算机网络 网络层 篇章的完整展开。网络知识库文档教程Scapy 网络栈完全指南自持接口列表、路由表与地址解析实战Scapy 网络栈完全指南自持接口列表、路由表与地址解析实战 导读 Scapy 并不是简单地调用操作系统内核来发包它维护着一套 完全独立于 OS 的网络栈网络网络安全上一篇gogcli 实战用 gog classroom courses 命令行管理 Google Classroom 课程全生命周期下一篇Querybook 集成 StarRocks用 SQLAlchemy 查询引擎实现内外部数据的查询与可视化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑