自用IPv6网络走起

前言

2019年11月27日,通过欧洲网络协调中心(RIPE NCC)的邮件确认,全球所有43亿个IPv4地址已全部分配完毕。事实上,IPv4地址的数量是非常有限的,算起来全球60多亿人每个人平均不到1个。由于IP地址是由国际上的几大网络协调中心统一进行分配,必须由单位向所在区域的网络协调中心提出申请,并每年缴纳一定的费用。这笔费用对于单位来说算不了什么,对于个人来说就比较高。因此,在每个国家基本上是由国家网络中心进行国内的IP地址分配,分配的单位一般是政府、国家机构、高校、基础通信服务商、数据中心或企业等。我们通常家用的宽带主要是由中国移动、中国联通、中国电信三大基础通信服务商提供的。近年来也有由广播电视提供的家用宽带。在学校、国家科技机构单位,一般使用的是教育网、教育科技网,也有很多学校采用的基础通信服务商提供的商用网络。不管是学校,还是家里,基础通信服务商为了节约IP地址的使用,在进行基础通信网络搭建的时候,大部分采用了内部局域网共享一个公网IP地址代理上网的方式。现有家用使用的宽带网络基本上无法获取到公网IPv4地址,只能获得一个以100开头的通信专用的局域网地址。

随着中国IPv6的不断部署推进,家用宽带大部分也拥有了IPv6地址。相比IPv4地址来说,IPv6地址的数量则非常庞大,全世界人口人均分配几十个都绰绰有余。因此,IPv6地址在使用上比IPv4地址就显得非常大度。通常来说,基础通信服务商会直接分配给每一个家用账户一个/64段的IPv6地址段。

个人所知中国移动宽带只有在使用了中国移动的专用路由器光纤接入后会分配IPv6地址。

由于考虑到分配的IPv6地址直接就是公网IP地址,如果知道设备的IPv6地址,即可通过IPv6网络直接进入设备,这对于一般没有安全意识的家用用户来说不是一件好事,所以基础通信服务商一般会在两三天内重新分配IPv6地址段,以此确保家用用户不可能长时间拥有同一个IPv6地址。

IPv6地址的DHCP几乎没有强制性,通常来说如果知道网络段号,可以自定义IPv6地址的后面位数。 比如被分配到的IPv6段是”2409:470:88:80::/64”,则用户可以设置自己的IPv6地址静态为”2409:470:88:80::8/64”。 这样一来安全性会变得更低。

但对于喜欢“搞事情”的小伙伴来说,这就有很大的限制了。如果有内网的服务器想要暴露在公网,或者想要使用IPv6进行管理,就需要有静态公网可达的地址来提供服务。想要实现这一目标,有很多方法来实现。

这里,就来尝试使用方法三来实现管理和对外服务。

实践

环境

申请IPv6网段

目前,全球范围内除了由基础通信服务商、数据中心、高校等拥有一大批可用的IPv6网段外,基本上无法个人进行申请。唯一可用的无限制IPv6网段申请就是He.net提供的6to4 IPv6隧道服务。可访问网站进行注册登录,登录后在左上方的User Functions里选择Create Regular Tunnel,然后在You are viewing from这个位置会显示出你访问时所用的公网IP地址。此处的IPv4 Endpoint填的是ECS服务器的公网IPv4地址,至于以下的Tunnel Server应该选择哪个需要在ECS服务器上ping各个服务器来确定延迟,选取延迟最低的一个位置。

此处需要注意的,由于He.net的全球网络与阿里云的全球网络之间的路由不是直接到达的,往往会绕很大一圈,所以建议不要选择香港的Tunnel Server,体验下来Fremont,CA,US的Tunnel Server效果较好。

vgy.me vgy.me

选择好Tunnel Server之后,点击最下方的Create Tunnel按钮即可获得一个::/64的IPv6网段。以下为创建完成后获得Tunnel详情。实际上,He.net是支持申请::/48的IPv6网段的,只需要点击以下图片的Assign/48按钮即可。

vgy.me vgy.me

如上所示,现在获得了2001:470:811d::/48网段。

配置ECS服务器的IPv6

由于ECS服务器是由Ubuntu 16.04升级的18.04,网络配置仍使用networking进行管理,配置比较简单。编辑/etc/network/interfaces文件,添加如下内容。

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
    address 2001:470:811d::80
    netmask 64
    endpoint 72.52.104.74
    local ECS_INTERNAL_IP
    ttl 255
    gateway 2001:470:811d::1

此处需要注意的是,local地址一定要填写ECS服务器的内网IP,直接填写公网IP会无法认证。如果使用的公网服务器使用ifconfig能够直接看到公网IP,那么一定要填成公网IP。只要保持与本地的IP一致即可。

修改网卡配置文件完成后,执行sudo service networking restart来启用IPv6隧道。至此,公网ECS服务器就拥有了IPv6地址。

配置zerotier

zerotier是一款先进的SDN(软件定义网络)软件,通过发现路由来找到两台机器之间的通路。显然,如果两台机器在不同的内部局域网当中,由zerotier中心服务节点发现的路由通路就会非常漫长,尤其是客户端访问到zerotier中心服务节点的路由通路可能千差万别,造成zerotier本身理解建立两个客户端之间最短通路的方法也会变得无效。由此,zerotier开放了moon功能,任何一台zerotier客户端都可以成为moon节点。moon节点可以作为辅助甚至是缩短路由通路的发现者,在国内的不同基础通信服务商的网路中就格外有用。此处就尝试将ECS服务器加入zerotier,成为moon节点不在此赘述。

安装zerotier

zerotier的安装比较简单,Mac操作系统、Windows操作系统可以直接访问zerotier官网获取安装包。Linux操作系统上则只需要使用官方提供的一键脚本即可,如下所示。

curl -s https://install.zerotier.com | sudo bash

安装完成后,使用sudo zerotier-cli info命令获取10位的唯一设备识别码,如1f23c0dd99

配置zerotier网络

访问zerotier web配置面板,注册一个zerotier账户并登录。由于zerotier的免费套餐允许100台设备同时连入到zerotier网络中,所以可以放心大胆使用。登录后选择Networks创建一个新的网络,并进入开始配置。网络默认是隐秘网络,需要通过验证后才可以加入,这样也比较安全。此处创建完成后会获得一个网络ID,在ECS服务器上执行以下命令申请加入到该zerotier网络。

sudo zerotier-cli join 159924d6308e1d7e

以下的配置主要是配置zerotier网络的路由和IPv6地址分配。网络创建完成后本身会自动创建一个10.147.17.0/24的局域网IPv4网段,并添加默认路由。由于刚才已经在ECS服务器上申请加入了,现在需要在Memebers里勾选最前面的Auth选项。过几秒后,ECS服务器会被自动分配在设定好的IPv4网段中的一个地址,这里也可以自定义某一个段内地址。

vgy.me vgy.me vgy.me

接下来需要做的就是配置zerotier可用的IPv6网段及相关路由。开启zerotier IPv6,并添加可用网段2001:470:811d::/48到可分配地址池中,如下图所示。

vgy.me vgy.me

如下图所示,读取zerotier根据RFC4193文档分配给ECS服务器的局域网IPv6地址。此处为fd15:9924:d630:8e1d:7e99:9333:8a13:b4bb。

vgy.me

接下来添加两条IPv6的路由到zerotier的默认路由中。一条是设置ECS服务器为zerotier网络中的网关,如下图所示。

vgy.me

另一条是添加公网IPv6网段的默认路由,如下图所示。

vgy.me vgy.me

完成以上步骤可以看到如下图所示的ECS服务器也被分配到了一个可用的公网IPv6地址。 vgy.me

为了让zerotier可以在ECS服务器上成功创建公网IPv6地址以及添加默认路由,需要在ECS服务器上做如下设置。设置成功后会看到网卡上出现上图中分配的公网IPv6地址。所有zerotier初次连入都需要进行此步骤。

sudo zerotier-cli set 159924d6308e1d7e allowGlobal=true
sudo zerotier-cli set 159924d6308e1d7e allowDefault=1

配置IPv6广播

经过以上步骤,IPv6网络的基本框架已经搭建好了,现在任何一台通过该zerotier网络认证的客户端都会获得一个可用的公网IPv6地址,它们彼此之间可以通信。但是现在为止除ECS服务器外,其他客户端依然无法访问外部IPv6地址及被其他IPv6地址访问。这是因为zerotier申明的公网IPv6地址未进行正常的IPv6广播,不能被其他的IPv6地址知道。

配置NDPPD广播

在ECS服务器上安装ndppd软件以支持IPv6地址广播,安装后的/etc/ndppd.conf配置文件内容如下。eth0修改为ECS服务器的默认网卡,rule修改为对应IPv6地址网段。

sudo apt install -y ndppd
route-ttl 30000

address-ttl 30000

proxy eth0 {
	router yes
	timeout 500
	autowire no
	keepalive yes
	retries 3
	ttl 30000
	rule 2001:470:811d::/48 {
		auto
		autovia no
	}
}
#安装完成后
#使用以下命令重启ndppd服务。
sudo systemctl restart ndppd

配置其他客户端

Linux客户端

仿照上述步骤安装zerotier并加入到zeoriter网络中。

curl -s https://install.zerotier.com | sudo bash
sudo zerotier-cli join 159924d6308e1d7e
sudo zerotier-cli set 159924d6308e1d7e allowGlobal=true
sudo zerotier-cli set 159924d6308e1d7e allowDefault=1

Mac客户端

下载安装包后加入到zerotier网络中,并在界面上允许Global和Default,再勾选connected。正常情况下能够获取到公网IPv6地址并添加好IPv6路由。如果发生能够ping通包括ECS服务器的zerotier网卡在内的该段公网IPv6地址,但无法访问其他IPv6地址。那么需要手动添加一条全局IPv6路由,命令如下。此处设置的网关是ECS服务器的zerotier网卡的根据RFC4193文档生成的局域网IPv6地址。

sudo route add -inet6 -prefixlen 0 default fd15:9924:d630:8e1d:7e99:9333:8a13:b4bb

测试及问题解决

执行完上述步骤可以看到获取到了一个公网IPv6地址,尝试是否与外界相通。

ping6 -c 10 ip.sb
ping6 -c 2001:470:811d::80

如果发现网络不通,就将zerotier web控制面板上节点使用的公网IPv6段换成一个::/64段就可以了,比如2001:470:811d:8::/64。

结语

根据实践部分的各个步骤,我们可以搭建一个自主可控的公网IPv6网络来进行管理和对外服务。由于公网IPv6网络会被全世界IPv6地址访问到,每一台连入的客户端的安全都需要提前保证,如果存在弱密码或者无密码服务,就很容易被攻破。当然,zerotier web控制面板是允许自定义IPv6地址的,可以根据自己的喜好将所有连入网络的地址进行更改。

由于He.net的Tunnel Server不在国内,所获取到的IPv6地址在访问国内的IPv6地址时延迟会比较高,毕竟需要绕一个大圈。但是对于zerotier网络内的客户端之间来说,通信的延迟应该还是比较低的,完全取决于原本到ECS服务器的延迟。ECS服务器在这里也起到了一个路由转发、地址广播的交换机作用。

欢迎走进IPv6的世界!