我们在全部六个节点部署的每一台服务器,无论是 VPS 还是独立服务器,都会分配一个 IPv4 地址,外加一个路由到服务器的 /64 IPv6 地址块。这个 /64 可不是拿来在功能清单上打勾凑数的:到达我们客户 Web 服务器的流量中,约有 45% 走的是 IPv6,没有 IPv6 的服务器,对近半个互联网来说访问起来都更慢。本文将讲清楚这个地址块是怎样交付的,为什么“整段路由”很重要,以及怎样真正用好 1800 多亿亿个地址。
整段路由,而非同链路
主机商向您交付 IPv6 有两种方式。偷懒的方式,是把您的地址和其他所有人的地址放在同一条链路上,靠邻居发现(NDP)去找到它们;只给一个地址时还能凑合,但一旦想让某个容器或虚拟机拥有自己的地址,就会立刻出问题。整段路由的方式,则是给服务器一条小小的点对点链路,再把整个 /64 路由过去。服务器内部的任何东西,无论是容器、虚拟机还是 WireGuard 对端,都可以从这个地址块里取一个地址并直接对外可达,既不需要任何代理,也不用借助 NDP 的种种取巧手段。
我们的镜像会在首次启动时配置好点对点地址和默认路由。地址块从第一秒起就归您使用;控制面板里没有任何需要手动开启的选项。
ip -6 addr show dev eth0 # the first address of your /64 is configured
ip -6 route show default # via the site's gateway, on eth0
cat /etc/netplan/*.yaml # Ubuntu: the block and gateway are here
一个服务一个地址
值得养成的习惯,恰好和 IPv4 时代相反。与其让所有服务共用一个地址、再各占一个端口,不如让每个服务独占一个地址,统一使用 443 端口。给网卡添加地址,不必吝啬:
ip -6 addr add 2001:db8:1:411::443:1/64 dev eth0 # web
ip -6 addr add 2001:db8:1:411::25:1/64 dev eth0 # mail
ip -6 addr add 2001:db8:1:411::5432:1/64 dev eth0 # database, firewalled to one client
在 netplan 中把它们配置为永久生效(写进 addresses: 列表),再让每个守护进程绑定各自的地址。地址块内任意地址的反向 DNS(rDNS),都可以在控制面板中该服务器的网络标签页里设置,这对邮件服务以及任何会记录主机名的服务都很重要。
容器与虚拟机
Docker 的 IPv6 支持默认是关闭的。请从您的地址块中划出一个子网来启用它;使用 /80 的话,每个容器都能拥有自己的全局地址,而且无需 NAT:
cat > /etc/docker/daemon.json <<'EOF'
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1:411:d0c::/80", "ip6tables": true }
EOF
systemctl restart docker
docker run --rm alpine ping6 -c1 ipv6.google.com
由于整个 /64 都路由给了服务器,发往这个 /80 的数据包会到达宿主机,再由内核转发给容器;无需再做其他配置。LXC、libvirt 虚拟机或 WireGuard 隧道网络也是同样的做法:从地址块里划出一小段,开启转发,搞定。
像 IPv4 一样配置防火墙
地址块中的每个地址都是全球可达的,这既是它的优点,也是防火墙规则必须保持对称的原因。使用 ufw 时,规则默认同时作用于两个协议族(IPV6=yes,位于 /etc/default/ufw);请用 ufw status 确认每条规则都有一条对应的 (v6) 规则。使用 nftables 时,请用 inet 表,这样一套规则就能同时覆盖两者。最典型的错误是:数据库绑定在 :: 上,而防火墙却只认识 IPv4。
DNS 与那 45%
请为每个主机名在 A 记录之外再加一条 AAAA 记录。现代客户端会优先尝试 IPv6(若失败,约 250 ms 后会启动回退竞速),移动网络尤其如此:它们本身就是原生 IPv6,IPv4 则藏在运营商 NAT 之后。有 AAAA 记录的站点,这些客户端可以直接访问;没有的话,就要绕道运营商的转换网关,既增加延迟,偶尔还会打断长连接。45% 这个数字来自我们客户全部服务器上的 nginx 日志;对于移动端流量占比高的站点,这个比例还会更高。
从外部测试
控制面板里的绿色对勾只说明地址已经配置好了,并不说明它可达。请从另一个网络中的机器上测试:
ping6 2001:db8:1:411::443:1
curl -6 -sI https://example.com | head -1
dig AAAA example.com +short
也可以使用位于 /network/looking-glass 的 Looking Glass,它可以从我们的每个节点出发,同时通过两个协议族执行 ping 和 traceroute。如果想做公开检测,常见的在线 IPv6 测试网站会告诉您,AAAA 记录、可达性和 TLS 证书三者是否一致。
不止一个 /64
/64 是能支持全部 IPv6 功能的最小地址块(SLAAC 恰好需要 64 位主机部分),对于一大批容器来说也绰绰有余。如果您运营的虚拟化宿主机或 VPN 集中器需要自行向下分发 /64,独立服务器可按需申请 /56;请提交工单说明用途,一天之内即可完成路由。我们不对地址空间收费;IPv6 的设计初衷就是地址充裕,给它定价就背离了这个初衷。
