Canary Workshop

Whatever is worth doing at all is worth doing well

自制 Tunnel Broker 服务

许多人都经常使用 Hurricane Electrics 提供的 Tunnel Broker 这项服务。我们可以通过其免费获得公网 IPv6 地址。但有时,这项免费服务并不是很适合我们的情况。比如本地通往 HE 的隧道服务器网络不佳,或者 HE 不提供我们需要的服务器位置。如果我们拥有 IPv6 地址块,则可以尝试自建 Tunnel Broker 服务。虽然维基百科上称 HE 的服务器部署方案是“Unknown”,从连接指令会发现其实就是 SIT 隧道而已,因此也是很好仿制的。这里我使用了/64 + /64 + /48大小的 IPv6 地址块尝试了模仿 HE 的隧道配置并取得了成功。

我使用了两台运行 Debian 的服务器进行测试。假定环境如下:

1
2
3
4
5
隧道使用的/64地址块:2001:db8:1234:5678::/64
服务器 A(隧道服务器)IPv4 地址:10.0.0.1,隧道内地址:2001:db8:1234:5678::1/64
服务器 B(客户端)IPv4 地址:10.0.0.2,隧道内地址:2001:db8:1234:5678::2/64
额外的/64地址块(即“Routed /64”):2001:db8:6666:2333::/64
额外的/48地址块(即“Routed /48”):2001:db8:2333::/48

这也是 HE 提供地址的方法。大多数情况下,如果只是想获得 IPv6 连接,使用隧道端地址即可,但我们亦可以分配更大的地址块供使用。

在服务器 A 中使用 root 权限执行以下指令:

1
2
3
4
5
6
7
8
9
10
11
#设置隧道
ip tunnel add own-ipv6 mode sit remote 10.0.0.2 local 10.0.0.1 ttl 255
ip link set own-ipv6 up
#隧道端地址
ip addr add 2001:db8:1234:5678::1/64 dev own-ipv6
#更大的地址块
ip route add 2001:db8:6666:2333::/64 dev own-ipv6
ip route add 2001:db8:2333::/48 dev own-ipv6
#打开 Linux 内核的 IPv6 转发功能
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -p

如果以上指令出现报错,请检查是否以 root 权限运行指令且内核模块是否齐全。这样服务端便配置完毕。

客户端的配置事实上可以照抄 HE 的配置示例,这里给出命令行配置的示例,在服务器 B 中使用 root 权限执行以下指令:

1
2
3
4
5
6
7
8
9
10
11
12
#加载 Linux 内核的 IPv6 模块
modprobe ipv6
#设置隧道
ip tunnel add own-ipv6 mode sit remote 10.0.0.1 local 10.0.0.2 ttl 255
ip link set own-ipv6 up
#隧道端地址
ip addr add 2001:db8:1234:5678::2/64 dev own-ipv6
ip route add ::/0 dev own-ipv6
ip -f inet6 addr
#至此服务器 B 已经获得了 IPv6 连接。如果想使用额外的地址块,请执行以下指令
#注意:这里的地址必须是服务端所路由过来的地址块内的地址
ip addr add 地址 dev own-ipv6

接下来可以使用 ping 或者 curl 之类的工具检验 IPv6 连通性。至此,完成了对 HE 的 IPv6 隧道的仿制。

一般来说,根据规范,每个“客户”应有一个独立的 /64 地址块。但在实际中我们有时没有那么多地址,因此如果只是为了获得连通性,小一些的地址块也是可能实现的。

当然自己宣告一大块地址是最吼的