FieryWing 的技术博客

IP 地址、NAT 与 IPv6 小科普

2025-12-27

IP 地址是设备在网络中的“门牌号”。每次折腾家里的路由器、做端口映射、配置服务器防火墙,几乎都绕不开它。这篇文章把 IPv4 与 IPv6、公网与内网、子网掩码与 CIDR、NAT 与 CGNAT 这些概念按我自己的理解整理一遍,并附上常用的查看与排查命令。文中的示例地址都使用文档专用的保留地址,不对应任何真实设备。

IPv4 与 IPv6

IPv4 地址写成四段十进制数,每段 8 位,范围 0 到 255,例如 203.0.113.25。32 位意味着理论上限是 2 的 32 次方,也就是 4294967296 个地址,而且其中还有不少被保留作特殊用途,所以早就不够用了。缓解的办法有三条路:划分更精细的地址块(CIDR)、让多个设备共享地址(NAT),以及最终的解决方案——换成 IPv6。

IPv4 的特殊地址

公网 IP 与内网 IP

以下地址段是私有地址,只能在局域网使用:

注意中间那一段是 172.16.0.0 到 172.31.255.255,而不是整个 172 开头;192.168.0.0/16 则是家用路由器最常见的默认网段。这些私有地址在公网上不会被路由,所以不同家庭、不同公司的内网可以重复使用同样的地址而互不冲突。另外还有 100.64.0.0/10,它是专门分配给运营商级 NAT 使用的共享地址空间,下文会提到。

一个常见的坑是:公司 VPN 与家里的内网网段相同,比如两边都是 192.168.1.0/24,连上 VPN 之后路由冲突,某一边就访问不到了。所以自己规划内网时,不妨避开最常见的 192.168.0.x 和 192.168.1.x,选个不那么“热门”的网段。

子网掩码与 CIDR

每个 IP 地址在逻辑上分成网络部分和主机部分,子网掩码(或前缀长度)说明从哪里切开。同一个网络内的设备可以直接通信,不同网络之间则要经过路由器(网关)转发。判断两个地址是否在同一个子网,就是看它们和掩码做按位与之后的结果是否一样。

CIDR 写法

192.168.1.0/24 表示前 24 位是网络号,后 8 位是主机号,共 256 个地址。其中第一个地址(192.168.1.0)是网络地址,最后一个(192.168.1.255)是广播地址,一般不分配给设备,所以可用主机地址是 254 个。

通用公式是:前缀长度为 n,则地址总数是 2 的 (32-n) 次方。常用的对照如下:

CIDR子网掩码地址总数可用主机数(常规情况)
/32255.255.255.2551单个主机
/30255.255.255.25242
/24255.255.255.0256254
/16255.255.0.06553665534
/8255.0.0.01677721616777214

再来一个不是整八位的例子:203.0.113.64/26。/26 意味着主机位有 6 位,一共 64 个地址,范围是 203.0.113.64 到 203.0.113.127,网络地址是 .64,广播地址是 .127,可用主机 62 个。以 /24 为单位的网络按 /26 切分,可以得到 4 个子网,起点分别是 .0、.64、.128、.192。这种“块大小”的算法比背二进制快得多:块大小等于 256 减去掩码在该段的值,/26 的掩码最后一段是 192,块大小是 64。

另外,/32 常用于表示单个主机,防火墙规则里写 203.0.113.10/32 就是只匹配这一个地址;而 0.0.0.0/0 表示所有地址。写防火墙规则时多留意这类细节,我在 防火墙那篇里也提到过。

NAT:多个设备共用一个公网 IP

家里的路由器通过 NAT 把内网设备的请求转换成它自己的公网 IP 对外访问。这也是为什么外面的人默认访问不到你家里的设备。运营商还可能做多层 NAT(CGNAT),此时家宽不再有真正的公网 IP。

具体怎么做的?以最常见的 NAPT(端口地址转换)为例:内网设备 192.168.1.20 用源端口 51000 访问外部服务器,路由器在转发时把源地址改成自己的公网地址、源端口改成一个新的端口(比如 40001),并在一张转换表里记下“内网 192.168.1.20:51000 对应外网 40001”。服务器的回包发到路由器的 40001 端口,路由器查表后再改回内网地址交还给设备。可以把路由器想象成公司前台:对外只有一个总机号码,内部员工打电话出去时,前台记下是谁打的,外面回电话进来时再转接给对应的人。

这也解释了 NAT 的副作用:外部主动发起的连接,路由器查不到转换条目,就不知道该转给谁,只能丢弃。想让外部访问内网服务,就需要做端口映射(端口转发),手工添加一条“公网某端口对应内网某地址某端口”的静态规则;或者使用内网穿透、反向代理等方式。需要说明的是,NAT 带来的“默认不可达”只是副作用,它并不等同于防火墙,真正的访问控制仍然需要防火墙规则来做。

CGNAT 与“没有公网 IP”

如果运营商在你的路由器之上又做了一层 NAT,你路由器 WAN 口拿到的地址就不是真正的公网地址。判断方法:登录路由器查看 WAN 口地址,如果落在 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 或 100.64.0.0/10 范围内,基本可以确定处于 CGNAT 之后;也可以对比路由器显示的 WAN 地址与 curl ifconfig.me 得到的地址是否一致,不一致就说明中间还有 NAT。这时在自家路由器上做端口映射是没有用的,因为外部的流量根本到不了你的路由器。可以向运营商申请公网地址,或者借助有公网地址的服务器做中转,也可以优先使用 IPv6,因为 IPv6 不需要靠 NAT 来“凑地址”。

IPv6 基础

IPv6 地址是 128 位,写成 8 组、每组 4 位十六进制数,用冒号分隔,例如 2001:0db8:0000:0000:0000:0000:0000:0001。书写时有两条简化规则:每组前导的 0 可以省略;连续的全零组可以用 :: 替代,但一个地址里只能用一次。所以上面这个地址可以写成 2001:db8::1。2001:db8::/32 是专门留给文档示例的前缀。

IPv6 通常给一个用户分配 /64 或更大的前缀(常见的家宽是 /56 或 /60 之类,具体看运营商),一个 /64 子网就有 2 的 64 次方个地址,足够任何局域网使用,所以不再需要为节省地址而精打细算。设备通过 SLAAC(无状态地址自动配置)或 DHCPv6 获得地址,路由器通过邻居发现协议(NDP)发布前缀信息。ARP 在 IPv6 里被 NDP 取代。

很多家庭网络是双栈的,也就是 IPv4 和 IPv6 同时可用。在 IPv6 下设备大多拥有全球可达的地址,这意味着理论上外部可以直接访问你的设备,所以路由器的 IPv6 防火墙务必保持开启,只放行你明确需要的端口。另一个坑是:给 IPv6 地址写网址时要加方括号,例如 http://[2001:db8::1]:8080/,否则冒号会和端口混淆。

查看自己的地址

ip addr
curl ifconfig.me

ip addr 显示本机各网卡的地址,其中 inet 开头的是 IPv4,inet6 开头的是 IPv6;curl ifconfig.me 则是向外部服务询问“你看到的我是谁”,得到的是出口的公网地址(如果在 NAT 之后,就是 NAT 设备的地址)。再补充几个常用命令:

ip -4 addr show
ip -6 addr show
ip route
ip neigh
ping -c 4 203.0.113.1
ping -6 -c 4 2001:db8::1
traceroute -n 203.0.113.1
curl -4 ifconfig.me
curl -6 ifconfig.me

ip route 查看路由表,其中的 default via 一行就是默认网关;ip neigh 查看邻居表,即 IPv4 的 ARP 表和 IPv6 的邻居缓存;curl -4 与 curl -6 可以分别测试 IPv4 与 IPv6 的出口地址,如果 -6 超时,说明你的网络没有可用的 IPv6 出口。Windows 上对应的命令是 ipconfig。

常见问题与排查

总结

IPv4 只有 32 位,地址早已耗尽,靠 CIDR、私有地址与 NAT 续命;10/8、172.16/12、192.168/16 是三个私有网段,100.64.0.0/10 则是运营商级 NAT 使用的共享空间;CIDR 的核心是“前缀长度决定网络大小”,记住地址总数等于 2 的 (32-n) 次方就能心算大部分情况;NAT 让多个设备共用一个公网地址,但也让外部难以主动访问,CGNAT 更是让家宽失去了公网 IP;IPv6 用 128 位彻底解决了地址不足,同时也要求我们认真对待防火墙。弄懂这些,再去看路由、VPN、端口映射等问题,思路会清晰很多。