IPv6 详解:地址、配置与安全要点

Chen Xi
Chen Xi

IPv6 是 IPv4 的后继互联网协议,使用 128 位地址。它缓解地址不足,也重新设计了邻居发现、自动配置和组播等机制,但并不会自动解决所有网络安全问题。

本文于 2026-07-29 依据 IPv6 标准和 Python 当前文档复核。

1. 地址表示方法

IPv6 地址由八组十六进制数构成,例如:

1
2001:0db8:0000:0000:0000:ff00:0042:8329

每组的前导零可以省略;一段连续的全零组可以用一次 :: 压缩:

1
2001:db8::ff00:42:8329

前缀长度写在斜杠后,如 2001:db8:1234:5678::/642001:db8::/32 保留给文档示例,不应作为公网地址部署。

2. 常见地址类型

  • Global Unicast:通常来自 2000::/3,可用于全球单播路由。
  • Link-localfe80::/10,只在本链路有效,接口通常会自动配置。
  • Unique Localfc00::/7,用于站点内部通信,不在公网路由。
  • Multicastff00::/8,IPv6 不使用 IPv4 式广播。
  • Loopback::1
  • Unspecified::,表示尚未指定的地址。

同一设备可以同时拥有多个 IPv6 地址。链路本地地址在命令或 URL 中有时还需要接口作用域标识。

3. 自动配置与 DNS

主机可通过路由器通告(RA)获得网络前缀,并使用 SLAAC 自动配置地址;网络也可能结合 DHCPv6 下发额外配置。域名的 IPv6 地址记录类型是 AAAA

部署公网服务时,应同时确认:

  • 上游网络已正确路由分配的前缀;
  • DNS AAAA 记录指向实际可达地址;
  • 防火墙对 IPv6 有明确规则;
  • 监控、日志和负载均衡器均支持 IPv6;
  • 双栈环境分别测试 IPv4 和 IPv6。

4. Python 中处理 IPv6

标准库 ipaddress 可以验证、归一化和计算地址:

1
2
3
4
5
6
7
8
import ipaddress

address = ipaddress.ip_address("2001:db8::42")
network = ipaddress.ip_network("2001:db8::/64")

print(address.compressed)
print(address in network)
print(network.num_addresses)

为文档测试网段生成随机主机地址:

1
2
3
4
5
6
7
import ipaddress
import secrets

network = ipaddress.IPv6Network("2001:db8::/64")
host_id = secrets.randbits(64)
address = ipaddress.IPv6Address(int(network.network_address) + host_id)
print(address)

这只生成语法有效的文档示例地址,不代表地址已分配或能够公网路由。实际网络必须使用运营商或组织合法分配的前缀。

监听 IPv6 套接字的简单示例:

1
2
3
4
5
6
7
8
import socket

with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as server:
server.bind(("::1", 8080))
server.listen()
connection, peer = server.accept()
with connection:
connection.sendall(b"hello over IPv6\n")

示例只绑定回环地址,适合本机测试。绑定 :: 会扩大监听范围,需要同步配置认证和防火墙。

5. 安全认知

IPv6 标准支持 IPsec,但“使用 IPv6 就会自动加密”是误解。是否加密取决于应用协议、隧道或具体 IPsec 策略。没有 NAT 也不等于没有防护:公网主机仍应采用默认拒绝的有状态防火墙,并允许必要的 ICMPv6,因为邻居发现、路径 MTU 探测等功能依赖它。

还应防范伪造路由器通告、邻居发现滥用、错误隧道和未纳入资产管理的临时地址。安全策略、扫描和日志必须同时覆盖 IPv4 与 IPv6。

参考资料