因为搬迁,需要重建内网,遇到了一些问题。以前因为北京联通提供公网IP,所以从外部访问内网不是问题。但是南方小城的电信并不提供公网IP,不仅如此,同城两个宽带也是不能互通的,这是我始料未及的。

虽然从外部访问,我可以使用公网服务器进行中转,但是两个内网我想使用直连。一开始我选择了tinc,因为它能自动打孔。发现不行之后,我手动测试了一下,发现两个ipv4网络根本就是不通的,不管是内网ip还是公网ip。也就是说,同城两个宽带只能通过NAT访问外网,之间是没有直通路由的。

如果ipv4网络不同,那么ipv6呢?直接ping天翼网关是不通的,这可能跟防火墙有关。同理,要访问网关之后的设备,也被网关防火墙所限制。下一步自然就是获取天翼网关的超级密码了,为此我还把网关给不小心重置了,不得不请师傅来处理。最后,也没有获得超级密码。

另外,在天翼网关的后面了,我还接了一个路由器,内网设备接在这个路由器上。之前使用北京联通的时候,是修改了光猫为桥接模式,获得DHCPV6 Delegated Prefix的。现在因为不能桥接不能自己拨号,只能使用RA Replay和NDP proxy了。因为只有/64前缀,只能使用SLAAC进行配置。另,因为路由器的OpenWrt版本较低,设置ipv6 relay颇费了一番周折,后面使用了新版本的ohcpd就好了。

搞定了ipv6地址分配的问题,就还是防火墙的问题了。如果有超级密码,上去修改一下就可以允许外部访问通过了。但这真的是个好主意么?以前在ipv4时代,NAT间接的承担了防火墙的功能,阻止未经允许的外部访问。进入ipv6时代之后,没有了NAT,理论上是万物可以直接互联了,但是却带来了安全隐患,所以默认的防火墙规则是阻止一切。

难道非得要超级密码么?在ipv4时代,人们使用NAT穿透来规避防火墙规则进入内网。使用类似的打孔原理,我们也可以穿越ipv6防火墙。即内外两台设备同时互访,里应外合就可以打开防火墙。

在ipv6情况下,因为不存在nat,ip和端口是固定的,所以配置是很简单的,直接写对端的ip和端口即可。用nc简单测试一下,两端同时执行

"nc -p 1234 对端IPv6地址 1234"

结果是,ipv6网络居然是通的。所以,我是可以在不修改天翼网关的情况下进行同城直连的!

剩下的问题就是,天翼网关在重启之后,分配的ipv6前缀会改变。我们需要DDNS,这个跟ipv4是一样的。

最后选择了使用wireguard作为隧道,wgsd作为DDNS服务器。提一句,wgsd-client不能运行在openwrt上,这时可以使用wireguard-watchdog脚本,并在dnsmasq添加以上DDNS服务器专门解析_wireguard._udp.example.com域名。另外,wireguard需要persistent keep alive,wgsd节点的allowed ips则可以不写。

这个方案同样适用于ipv4,甚至可以实现nat穿透,但不一定会成功。但是,对于ipv6,则一定会成功。这也是ipv6存在的意义吧。

最后购买了一台ipv6-only的vps作为DDNS服务器,然后发现github居然不支持ipv6访问!