ToolAct工具行动

子网计算器

在浏览器中本地计算 IPv4/IPv6 的网络地址、广播地址、子网掩码、主机范围和 CIDR。

网络地址192.168.1.0 复制
广播地址192.168.1.255 复制
子网掩码255.255.255.0 (/24) 复制
通配符掩码0.0.0.255 复制
首个主机192.168.1.1 复制
末个主机192.168.1.254 复制
可用主机数254 复制
IP 类别私有C 类 复制
二进制表示网络位主机位
11000000.10101000.00000001.01100100
拆分为更小的子网
拆分到/
192.168.1.0/26
192.168.1.64/26
192.168.1.128/26
192.168.1.192/26

什么是子网计算器?

子网计算器是一个工具,输入 IP 地址搭配 CIDR 前缀或子网掩码,即可推导出网络的结构性属性:网络地址、广播地址、可用主机范围、主机总数,以及网络位和主机位之间的二进制边界。无论是规划 VLSM 地址分配、编写防火墙规则、排查「为什么这两台主机无法通信」,还是配置路由表,网络工程师、系统管理员和开发者都会用到它。计算原理是对掩码进行按位与/或运算——理论上很简单,实际操作中却容易出错,尤其是在 IPv4 和 IPv6 之间切换时,二者地址长度分别为 32 位和 128 位。本工具完全在浏览器中运行,使用 BigInt 运算,因此可以无精度损失地处理完整的 IPv6 范围(/0 到 /128),且粘贴的地址绝不会发送到任何服务器。

使用方法

使用步骤

  1. 通过顶部的开关选择 IPv4 或 IPv6。
  2. 在输入框中输入 IP 地址,例如 10.0.0.42 或 2001:db8::1。
  3. 通过数字输入或滑块调整前缀长度,结果会即时更新。
  4. 点击任意结果方块,即可将该值复制到剪贴板。
  5. 对于 IPv4,可选择设置更长的目标前缀,将网络拆分为更小的子网。

常见误区

  • /31 网络并非有缺陷——RFC 3021 明确允许将其用于点对点链路,两端地址都可用。
  • /32 表示单个主机(主机路由),并非空网络;IPv6 的 /128 同理。
  • IPv6 中不存在「广播地址」概念,对应字段显示的是前缀范围内的最后一个地址,在范围检查中起到相同作用。
  • 通配符掩码(用于 Cisco ACL)就是子网掩码的按位取反——255.255.255.0 对应的通配符是 0.0.0.255。

使用场景

在多部门间规划 VLSM 地址分配假设公司拥有一个 /20 网段如 10.10.0.0/20(4094 个可用主机),你需要根据每个部门的实际人数划分子网:500 人的办公区分配 /23(510 个主机),50 人的小组分配 /26(62 个主机),4 路由器中转段使用 /29(6 个主机)。把每个候选前缀输入计算器,网络/广播边界会精确告诉你下一个子网应当从哪里开始才能不重叠。在纸上做这件事时,相邻 /26 与 /27 的边界总会出现差一错误;这里的二进制可视化让网络位边界一目了然。
编写需要通配符掩码的 Cisco/Juniper ACLCisco 的 access-list 语法接受的是通配符掩码,而不是子网掩码。「permit ip 10.50.0.0 0.0.255.255」匹配的是 10.50.0.0/16,但通配符写错就会匹配到网络的另一半,留下安全漏洞。计算器会同时显示任意前缀对应的通配符和子网掩码,可以直接复制到 ACL 规则中。EIGRP 和 OSPF 的 network 语句也使用同样的通配符,反转掩码的故障表现是隐性的——协议会直接无法建立邻居关系。
排查「这两台主机无法互通」类工单当用户反馈 192.168.0.10 和 192.168.1.20 在同一以太网中无法稳定互通时,第一件要排查的事就是两端的掩码是否一致。如果主机 A 是 192.168.0.10/24,主机 B 是 192.168.1.20/23,二者对「谁在本网段」的判断就会出现分歧:A 认为自己的网络是 192.168.0.0/24(只有 0.x 在本地),所以 A 会把发往 B 的帧交给默认网关;而 B 认为自己的网络是 192.168.0.0/23(同时覆盖 0.x 和 1.x),所以 B 会直接在链路上 ARP A。流量呈现不对称——B → A 成功,A → B 却要绕道路由器,可能被静默丢弃或重定向——计算器会把两个不同的网络标识并排展示出来,几秒钟内就能看出这处配置错误。
从 IPv4 迁移到 IPv6 双栈选择 IPv6 前缀大小一开始会让人感觉反直觉:一个 /64 拥有 18,446,744,073,709,551,616 个地址,恰好等于整个 IPv4 地址空间的平方(2^64 = (2^32)²)。惯例是给每个叶子网络分配 /64(这样 SLAAC 才能工作),给一个站点分配 /56 或 /48,给 ISP 分配 /32。计算器的 IPv6 模式会确认网络位/主机位边界以及那个惊人的主机数,帮助新手工程师内化一件事:IPv6 的子网划分以路由聚合优先,而不是节省地址。
配置云上 VPC 和安全组规则AWS VPC、Google Cloud VPC 和 Azure VNet 都需要为子网、路由表和安全组规则填写 CIDR 块。CIDR 配置错误——本意是 10.0.0.0/24 却写成了 10.0.0.0/16——会暴露出比预期多 256 倍的 IP 空间,往往直接面向公网。在把它粘贴进 Terraform 或控制台之前,计算器会精确给出主机范围和总数;二进制视图也能直观告诉你 /20 是否真的对齐在 /20 边界上(从已有网络复制粘贴时这是很常见的失误)。

技术原理

IPv4 地址是 32 位,IPv6 是 128 位。CIDR 记法(RFC 4632,2006 年 8 月)在地址后附加一个前缀长度 /n,声明最左侧 n 位是网络标识,剩余位是主机标识。子网掩码就是一个比特模式:n 个连续的 1 后面跟 32−n(或 128−n)个 0——以 /24 为例就是 11111111.11111111.11111111.00000000,点分十进制写作 255.255.255.0。CIDR 取代了 RFC 791 时代的分类编址(0.0.0.0–127.255.255.255 属于 A 类,隐含 /8,其中 0.0.0.0/8 保留作「本网络」、127.0.0.0/8 保留作回环;128.0.0.0–191.255.255.255 属于 B 类,/16;192.0.0.0–223.255.255.255 属于 C 类,/24),分类编址对地址的浪费是灾难性的:一家 1000 人规模的公司分到一个 B 类,得到 65534 个主机,而实际只需要 1000 个,IPv4 空间就这样被碎片化了。CIDR 允许任意前缀长度,由此实现了 VLSM(变长子网掩码,最早在 1985 年的 RFC 950 中正式定义)和路由聚合(「超网」)。 核心运算都是按位运算:网络 = 地址 AND 掩码;广播 = 网络 OR (NOT 掩码) = 网络 OR 通配符。以 192.168.1.100/24 为例,地址 0xC0A80164 与 0xFFFFFF00 按位与得到 0xC0A80100(192.168.1.0),与 0x000000FF 按位或得到 0xC0A801FF(192.168.1.255)。IPv4 的可用主机数是 2^(32−n) − 2(减去网络地址和广播地址);这个 −2 在 /31 时消失(RFC 3021 把它收回用于点对点链路,两端都可用),在 /32 时也消失(单个主机路由)。IPv6 没有广播地址——多播和任播取代了它——因此「最后一个地址」只是前缀范围的上界。JavaScript 原生的按位运算符是 32 位有符号的,对 IPv4 的 0xFFFFFFFF 会溢出(变成 −1),更无法表示 IPv6;本计算器全程使用 BigInt,确保两个版本的正确性完全一致。 IPv4 的私有地址空间在 RFC 1918 中定义:10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。IPv6 使用 RFC 4193 中定义的唯一本地地址 fc00::/7,以及 SLAAC 和链路内通信使用的链路本地地址 fe80::/10。计算器会标记这些地址,避免你把私有网段误发到公共 BGP。本工具能避免的常见错误包括:(1)192.168.1.100/255.255.255.0 与 /24 写法的混淆——计算器接受前缀形式并展示对应的点分掩码;(2)/30 与 /29 主机数计算错误(2 vs 6);(3)把 /24 拆成 8 个 /27 时算错第 4 个子网的起始位置(应该是 192.168.1.96,而不是 192.168.1.97);(4)在 Cisco ACL 语法中混淆通配符 0.0.0.255 与掩码 255.255.255.0。带网络位高亮的二进制可视化,是内化这条边界、让上述错误自然消失的最快方式。

  • RFC 4632(2006 年 8 月)定义了 CIDR——无类域间路由——取代了 RFC 791 的 A/B/C 分类方案。/n 记法声明网络前缀长度,其余位为主机部分。CIDR 实现了 VLSM(最早由 1985 年的 RFC 950 定义)和路由聚合,二者对 IPv4 地址节省和现代 BGP 表都至关重要。
  • 网络地址 = IP AND 掩码;广播地址 = 网络 OR 通配符(其中通配符 = NOT 掩码)。以 /24 为例:掩码 0xFFFFFF00,通配符 0x000000FF。可用主机 = 2^(32−n) − 2,例外是 /31(RFC 3021,点对点链路两端均可用)和 /32(单个主机路由)。
  • IPv6(128 位)没有广播——由多播(ff00::/8)和任播取代。约定的最小前缀是 /64(用于 SLAAC,每个子网拥有 1.8×10^19 个地址);每个站点 /56 或 /48;每个 ISP /32。IPv6 地址空间以路由聚合优先,而非节省地址。
  • 除 RFC 1918 之外的保留地址段:127.0.0.0/8 是回环,169.254.0.0/16 是 IPv4 链路本地(自动 IP / APIPA),224.0.0.0/4 是多播,240.0.0.0/4 保留作实验用途。IPv6 也保留了 fe80::/10 用于链路本地 SLAAC、ff00::/8 用于多播、::1/128 用于回环。计算器会区分私有和公共范围,让你一眼看出输入的地址是否可在公共互联网上路由。
  • JavaScript 的按位运算符是 32 位有符号:(0xFFFFFFFF & 0xFFFFFF00) 返回的是 −256,而不是 0xFFFFFF00。本计算器全程使用 BigInt,可无精度损失地处理完整的 IPv4 范围和 128 位 IPv6。同一套代码同时计算两个版本,仅掩码宽度不同。
  • Cisco/Juniper 常见陷阱:ACL 语法接受的是通配符掩码(0.0.0.255),不是子网掩码(255.255.255.0)。EIGRP 和 OSPF 的 network 语句同样使用通配符。反转掩码会匹配到与目标网络互补的范围——在路由协议中是隐性的(不会建立邻居关系),在 ACL 中则可能被利用(错误流量被放行)。
  • VLSM 示例:把一个 /24 等分为 4 个子网就是 4 × /26(每个 64 个地址),每个子网可用主机 62。相邻 /26 的起始偏移是 0、64、128、192——而不是 0、63、127、191。计算器的拆分工具会直接生成这些边界,省去你心算的过程。

示例

标准 /24(最常见的局域网)

输入:     192.168.1.100/24

网络:     192.168.1.0
广播:     192.168.1.255
掩码:     255.255.255.0
通配符:   0.0.0.255
主机:     192.168.1.1 - 192.168.1.254  (254 个可用)
类别:     C 类,私有(RFC 1918)

二进制:   11000000.10101000.00000001.01100100
          (网络位 = 左 24;主机位 = 右 8)

点对点 /31(RFC 3021)

输入:     10.0.0.1/31

网络:     10.0.0.0
广播:     10.0.0.1
掩码:     255.255.255.254
主机:     10.0.0.0 - 10.0.0.1  (2 个可用,链路两端)

RFC 3021 之前,/31 因为 2 - 2 = 0 被认为「不可用」。
现代路由器允许在点对点链路上使用两个地址,
这能在中转链路上节省一半的地址空间。

VLSM 拆分:/24 拆为四个 /26

输入:     192.168.1.0/24,拆分到 /26

子网 1:   192.168.1.0/26    主机 .1   - .62
子网 2:   192.168.1.64/26   主机 .65  - .126
子网 3:   192.168.1.128/26  主机 .129 - .190
子网 4:   192.168.1.192/26  主机 .193 - .254

注意边界:0、64、128、192——每个 /26 占 64 个地址
(62 个可用)。常见错误是把子网 2 起始位置写成 .63
(子网 1 的广播 +1)——但 .63 本身就是广播地址,
下一个子网应当从 .64 开始。

IPv6 /64(标准叶子网络)

输入:     2001:db8:1234:5678::1/64

网络:     2001:db8:1234:5678::
末址:     2001:db8:1234:5678:ffff:ffff:ffff:ffff
掩码:     ffff:ffff:ffff:ffff::
主机:     18,446,744,073,709,551,616  (2^64)

单个 /64 拥有的地址数比 IPv4 全部地址的平方还要多。
SLAAC 要求 /64,因为低 64 位用于编码接口标识符
(EUI-64 或 RFC 7217 定义的随机标识)。

常见问题

为什么 /24 的可用主机是 254 而不是 256?

/24 子网共有 2^8 = 256 个地址,但其中有两个被保留:网络地址(192.168.1.0)在路由表中标识子网本身,广播地址(192.168.1.255)用于发送给子网内所有主机的报文。两者都不能作为主机 IP,因此剩下 254 个可分配地址。/1 到 /30 之间所有 IPv4 前缀都遵循同样的「减 2」规则。例外情况:/31 有 2 个可用地址(RFC 3021,点对点),/32 有 1 个(单主机路由)。

子网掩码和通配符掩码有什么区别?

子网掩码在网络位上是 1,主机位上是 0——/24 对应 255.255.255.0。通配符掩码就是它的按位取反——/24 对应 0.0.0.255。Cisco IOS 的 access-list、EIGRP 和 OSPF 都使用通配符,因为最初的 ACL 实现采用了「不关心」模型(通配符中为 1 的位表示「这一位不必匹配」)。其他厂商以及现代 Cisco 大多数语法也接受子网掩码形式,但你接手的遗留配置往往仍使用通配符。

IPv6 有广播地址吗?

没有。IPv6 刻意去掉了广播,改用多播(ff00::/8)和任播。「全节点」范围是 ff02::1,行为类似 IPv4 的链路本地广播,但只能到达加入了对应多播组的节点。所以在 IPv6 模式下,计算器把这一值标记为「末尾地址」而非「广播地址」;你也不能像在 IPv4 中向 255.255.255.255 发包那样向它发包——协议层面没有任何机制能把它送达每一台主机。

按旧公式 /31 「无可用主机」,那它为什么有用?

2000 年前的教材会写 /31 有 2^1 − 2 = 0 个可用主机,因此无效。RFC 3021(2000 年 12 月)重新规范了 /31 用于点对点链路:链路上正好两个端点,无需独立的广播——链路本身就定义了广播范围。现代路由器(IOS 12.2+、Junos、FRR、Linux)全都支持 /31。在中转链路上用 /31 替代 /30,可以把核心网络基础设施消耗的地址数减半,在拥有数千条链路的大型网络中累积起来非常可观。

为什么我的 IPv6 子网看起来都是 /64?

按惯例,分配给叶子网络的最小 IPv6 单元就是 /64。低 64 位预留给接口标识符——SLAAC(RFC 4862)从 MAC 地址生成这部分(EUI-64),或基于网络前缀和每主机密钥生成稳定哈希(RFC 7217),又或采用短期随机值(RFC 4941 隐私扩展)。在点对点链路上使用 /126 或 /127 用于静态配置技术上可行,但会破坏 SLAAC 和很多自动化特性。建议每个承载终端的子网都使用 /64;/127 仅在你完全可控的路由器之间链路上使用。

本工具会把我的 IP 地址发送到服务器吗?

不会。所有计算都在浏览器中使用 JavaScript BigInt 运算完成。地址、前缀和计算结果都不会传输到任何后端。你可以打开浏览器 DevTools 的网络面板验证——计算过程中没有任何对外请求。这与 ToolAct 所有浏览器端工具的隐私承诺一致。

/24 和 255.255.255.0 有什么区别?

功能上没有区别——它们是同一个掩码的两种写法。/24(CIDR 记法,RFC 4632)数的是前导 1 的个数;255.255.255.0(点分十进制掩码)是把这些位写成四个八位组的数值。绝大多数现代操作系统和路由器配置都接受任一种形式。计算器会同时显示两种写法,方便你按目标系统的要求复制粘贴。

为什么本计算器会拒绝 010.0.0.1 这类输入?

带前导 0 的数字段(010、04、0001)会被拒绝,因为同一个字符串在不同的 IP 解析器里会被解读成不同的值——glibc 的 inet_aton 历史上把带前导 0 的数字段当作八进制(010 = 8),而现代 Python(3.9.5+)和 JavaScript 运行时则一律按十进制处理(010 = 10)。这种跨技术栈的解读差异已经造成过真实的 SSRF 绕过漏洞(CVE-2021-29921 及同类问题):某个服务在白名单检查时把 010.0.0.1 当作 8.0.0.1,但下游库实际连到了 10.0.0.1。为避免本计算器的输出暗示某种特定解读方式,任何带前导 0 的数字段一律拒绝——粘贴前请先去掉前导 0(010 → 10)。