今天说个小细节,IPv6 网段的写法与 IPv4 有很大不同。详细解释 IPv6 网段的表示方法。
IPv6地址/前缀长度2001:db8:1234::/482001:db8:1234:: - 网络地址/48 - 前缀长度(类似IPv4的掩码)# 各种前缀长度的示例
2001:db8::/32 # 大型ISP分配
2001:db8:1234::/48 # 中型组织
2001:db8:1234:5678::/64 # 标准子网(最常见)
2001:db8:1234:5678:90ab::/96 # 较小子网
2001:db8:1234:5678:90ab:cdef::/128 # 单机地址# 私有地址空间
fc00::/7 # 唯一本地地址 (ULA)
fd00::/8 # 实际使用的ULA
# 链路本地地址
fe80::/10
# 多播地址
ff00::/8
# 环回地址
::1/128
# 未指定地址
::/128前缀长度 | 子网数量 | 每个子网地址数 | 用途 |
|---|---|---|---|
/32 | 1 | 79,228,162,514,264,337,593,543,950,336 | ISP级分配 |
/48 | 65,536 | 1,208,925,819,614,629,174,706,176 | 组织分配 |
/56 | 256 | 4,722,366,482,869,645,213,696 | 家庭/小企业 |
/64 | 1 | 18,446,744,073,709,551,616 | 标准子网 |
/127 | - | 2 | 点对点链路 |
/128 | - | 1 | 单机地址 |
# Cisco 路由器
interface GigabitEthernet0/0
ipv6 address 2001:db8:1234::1/64
ipv6 enable
# Linux 网络配置
ifconfig eth0 inet6 add 2001:db8:1234::1/64
# 使用 ip 命令
ip -6 addr add 2001:db8:1234::1/64 dev eth0# 允许整个 /64 网段访问
ip6tables -A INPUT -s 2001:db8:1234::/64 -j ACCEPT
# 拒绝特定网段
ip6tables -A INPUT -s 2001:db8:5678::/48 -j DROP# 添加IPv6路由
ip -6 route add 2001:db8:1234::/64 via 2001:db8::1 dev eth0
# 默认路由
ip -6 route add default via 2001:db8::1import ipaddress
# 计算网段信息
net = ipaddress.IPv6Network('2001:db8:1234::/64')
print(f"网段: {net}")
print(f"网络地址: {net.network_address}")
print(f"广播地址: {net.broadcast_address}")
print(f"可用地址数: {net.num_addresses}")
print(f"第一个可用地址: {net[1]}")
print(f"最后一个可用地址: {net[-2]}")网段: 2001:db8:1234::/64
网络地址: 2001:db8:1234::
广播地址: 2001:db8:1234::ffff:ffff:ffff:ffff
可用地址数: 18446744073709551616
第一个可用地址: 2001:db8:1234::1
最后一个可用地址: 2001:db8:1234::ffff:ffff:ffff:fffe# 使用 ipcalc 工具
ipcalc 2001:db8:1234::/64
# 使用 python 验证
python3 -c "import ipaddress; print(ipaddress.IPv6Network('2001:db8:1234::/64'))"import ipaddress
# 将 /48 划分为 /64 子网
parent_net = ipaddress.IPv6Network('2001:db8:1234::/48')
subnets = list(parent_net.subnets(new_prefix=64))
print(f"父网段: {parent_net}")
print(f"可划分出 {len(subnets)} 个 /64 子网")
print("前5个子网:")
for i, subnet in enumerate(subnets[:5]):
print(f" {i+1}. {subnet}")# 正确
2001:db8::/32
2001:db8:0:1234::/64
# 错误(压缩不当)
2001:db8:0000:1234::/64 # 不应有前导零
2001:db8::1234::/64 # 只能使用一次 ::# 有效的前缀长度
/32, /48, /56, /64, /127, /128
# 通常无效的前缀长度(虽然语法正确)
/12, /24, /60 # 不遵循nibble边界,可能有问题# 链路本地地址不能路由
fe80::/10 # 只能在本地链路使用
# 多播地址的特殊用途
ff00::/8 # 多播,不能用作单播地址
# 私有地址空间
fc00::/7 # 不能在公网路由# ISP分配
2001:db8:1234::/48
# 部门子网划分
2001:db8:1234:1000::/64 # 行政部门
2001:db8:1234:2000::/64 # 技术部门
2001:db8:1234:3000::/64 # 财务部门
2001:db8:1234:4000::/64 # 服务器网络
2001:db8:1234:5000::/64 # DMZ网络
2001:db8:1234:6000::/64 # 无线网络
2001:db8:1234:7000::/64 # 访客网络
# 点对点链路使用 /127
2001:db8:1234:ffff::/127 # 路由器间链路IPv6网段的核心写法规则:
IPv6地址/前缀长度/48(组织), /64(子网), /128(单机):: 表示fc00::/7(私有), fe80::/10(链路本地)记住最关键的一点:在大多数情况下,您会使用 /64 作为标准子网前缀长度,因为这是IPv6设计的最佳实践。