记录一次通过tunnelbroker申请到的ipv6网段,建立6in4中转服务器,转发/48网段的过程。

前言

坐标上海,电信宽带,SDN网关改了桥接。(吐槽一下上海电信,到现在还没有公网ipv6)
一开始的目的是给家里内部接入公网ipv6,分配公网ipv6地址。因为没有端口限制方便在外网直接访问一些服务不用vpn接入家庭内网后才能通信。也想顺便解决一下某些仅ipv6网站的访问问题。但是直接使用6in4隧道接入tunnelbroker在国内有很大的干扰,基本无法正常使用。所以通过外网端口转发ipv6网段,成了最佳选择。当然在如何连到外网端口的问题上就仁者见仁智者见智了(我当前采用的是私有的技术进行链接,从而将外网机器加入家庭内网,分配独立网段,十分稳定)。


第一次尝试

成功部分,未完全达成标准,仅分配了64段,48段在第三次尝试

由于有我家的外网接入有多个外网端口,全在新加坡(CN2 GIA),通过测试选择了tunnelbroker的日本和香港的多个节点(每个tunnelbroker最多建立5个节点),神奇的是新加坡当地连接新加坡的tunnelbroker节点延迟居然比日本和香港高很多,个人表示无法理解。
在查阅各方资料后我选择了sskaje提供的隧道脚本

配置系统6in4隧道

我使用外网端口仅有ipv4地址,并不自带ipv6,采用Ubuntu 18.04系统,所以第一部是给这几台机器接上6in4获取到ipv6。

部署自己的6in4服务

git clone https://github.com/sskaje/6in4.git

然后修改配置文件

vi 6in4/etc/config.ini

这里需要注意,你需要去tunnelbroker,点击Assign /48生成48网段的ip地址填到下方。

; IPv6 network, must be ending with '::'
; * Required
IPV6_NETWORK=<你的48网段地址>::

; IPV6 CIDR, must be a multiple of 8.
; * Required
; If your IPV6_CIDR is smaller than /64, assigned blocks are /64; if smaller than /48, /48 is used.
; If IPV6_CIDR is greater than /64, assigned blocks are /(IPV6_CIDR + 16 [ + 8 ]), e.g.: 64->80, 72->96, 80->96
IPV6_CIDR=48

; Bind tunnel to device INTERFACE
; * Required
INTERFACE=<你的提供6in4服务的网卡名称>
; 比如我的是tun0,如果你没有建立隧道可能需要用eth0
; 但是我觉得,在公网转发6in4和直连tunnelbroker有区别吗?

; Local IPv4
; * Optional
; This is useful if your $INTERFACE has more than one IP.
; If BIND_IP is not set, script reads first IPv4 ip from $INTERFACE 
;BIND_IP=1.1.1.1

; MTU
; Default: 1480
;LINK_MTU=1480

修改系统转发

vi /etc/sysctl.conf

# 找到这行改成 1 开启ipv6转发,没有就添加一行
net.ipv6.conf.all.forwarding = 1

:x

sysctl -p

由于脚本采用sipcalc进行计算,所以需要安装sipcalc

apt-get install -y sipcalc

创建一个隧道 1是编号,可以创建多个,后面是对端地址,也就是接入6in4服务的地址,如果是公网你需要写你客户接入端的公网ip。

./6in4/bin/6to4 1 10.0.0.254

之后你会看到

Please set up tunnel on your machine with following parameters:
    Server IPv4 Address:        10.254.0.1
    Server IPv6 Address:        服务端的端对端ipv6
    Client IPv4 Address:        10.0.0.254
    Client IPv6 Address:        这里是对方的端对端ipv6 (需要)
    Routed /64:                 这里就是对方的路由 (需要)

If you don't have a static IP, set your local to 0.0.0.0 and invoke update api to update your endpoint

设置对端路由

有了上面的信息,就可以进行设置对端路由的6in4了。

简单设置一下lan的 ipv6分配长度 设置为64。 并设置分配提示如:1、2、3即可。

保存,并且重启lan接口。客户端dhcp renew6一下,已经拿到了公网ipv6,尝试通信成功。

问题出现

但是由于我家内部网络结构比较复杂,有多层交换,存在三个lan分别分给:服务器\智能家居\智能家居无线、有线无线用户接入、VPN接入。而作为接入端我采用的是koolshare的LEDE x86_64所以ipv6分配长度最大只有64,不能分更小的网段出去,导致只有一个lan能拿到ipv6,其他lan都无资源池。