Canary Workshop

ここから始めよう 世界を見にゆこう

自制 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 地址块。但在实际中我们有时没有那么多地址,因此如果只是为了获得连通性,小一些的地址块也是可能实现的。

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