A-A+

VPS如何向母鸡广播小鸡内网IPv6邻居:使用NDPPD对母鸡宣告未被路由的IPv6网段

2023年06月20日 VPS评价 等您评论

前情提要

在开始之前,先要把v6的一些基本知识搞明白,免得之后混淆,毕竟v6和v4完全不同了。

首先我们要确定,母鸡/VPS厂商是不是把整个段都给你,还是只给你一个IP地址。
v6有点绕弯弯,IPv6 /64 和IPv6 PD/64是完全不同的两个东西。

我先拿家宽Op截个图:

上图中可以看到,路由器获取了三个和v6有关的东西,我们来看看。
IP属地日本OCN,NTT线路。

首先我们能看到,前缀(前四个冒号)是 2400:4053:3284:6200:

运营商根据规范,分发前缀必须比64位多(数字越小,给你的就越多,数字小个1,差距就是一个次方倍,/63包含两个/64,/62包含两个/63[四个/64],以此类推)

上游给的56位PD,即2400:4053:3284:6200::0 - 2400:4053:3284:62FF:FFFF:FFFF:FFFF:FFFF都是我的,这个是子路由。

绿色的地址

即92c结尾那个,是有状态分配,有状态IPv6采用DHCPv6分配,可以自定义后半段后缀,采取类似192.168.1.1,192.168.1.2这样分配方式,优点是好记。

黄色的地址

::4c61:74ff:fe75:6b69 结尾那个,我们可以看到和MAC地址很像,
实际上,这是没开【隐私保护】的无状态v6,它会根据MAC地址生成v6,具体就是MAC第二位的某个bit反转,在MAC中间位置插入 FFFE 。
MAC第二位是0,生成的v6后缀第二位就是2
MAC: 4E:61:74:75:6B:69 对应 ::4c61:74ff:fe75:6b69
MAC: 00:61:74:75:6B:69 对应 ::0261:74ff:fe75:6b69

0变成2,1变成3,2变成0,3变成1
4变成6,5变成7,6变成4,7变成5……

红色

是分发前缀(可路由),上游路由器会把2400:4053:3284:6201开头的全部交给这个路由器,你可以继续划分子网,子网仍然是公网IP。


可以看到,有状态给了/128,无状态和PD都是/64.
第一个128代表路由器就一个地址,第二个/64代表路由器在子网2400:4053:3284:6200里面,不代表你可以继续分配。
第三个/64才是分配给你,允许你随意分发(我叫做:可路由)的PD前缀。

至于有状态和无状态,为什么一个64一个128,这个我暂且蒙在古里。

NDP协议

回到VPS上,假如厂商给了你一段/64的IPv6,2001:db8:1101:0119::1/64,但是你不知道这是可路由的PD还是仅仅位于/64网段内。

我之前研究Zerotier分配公网IP时提到过,只不过现在发现是错的,HE隧道和运营商会帮你路由,即给你PD,不需要你做什么,只管分配就好。
但是如果给了“前缀”又没帮你路由,就只能自己宣告了。
如果VPS厂商给你分配的IPv6是::1结尾—— 2001:DB8:1101:0119::1/64 ,那有很高的可能性是这个段都给你,看是/112还是/64还是/多少。
如果你可以在面板上自定义 2001:db8:1101:0119:XXXX:XXXX:XXXX:XXXX 这种,那百分百是全部给你的,相当于一个没有被宣告路由的PD给你了。

那么我们如何宣告划分的网段?需要用到NDP协议。

转载自维基百科:

邻居发现协议(英语:Neighbor Discovery Protocol简称:NDP或ND)是TCP/IP协议栈的一部分,用于IPv6。它基于IPv6的ICMPv6的实现,负责在IPv6网络层上发现数据链路层中其他节点和相应的IP地址,并确定可用路由和维护关于可用路径和其他活动节点的信息可达性。

使用NDPPD对母鸡宣告未被路由的IPv6网段,并让VPS路由给下游设备

在你的路由器小鸡上,解锁路由限制,充当路由器,允许转发数据包,像路由器一样:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #这个是IPv4的,如果你v4也有一个段的公网IP,那也可以这么做,不需要NAT。当然那特别贵就是了。
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf

echo "net.ipv6.conf.all.accept_ra = "2" >> /etc/sysctl.conf #vps接受路由通告(RA),这个我不确定。
执行sysctl -p刷新配置,可能需要在 rc.local 里写上这句,有的系统一重启就重置了,需要手动再刷新一下。

安装ndppd:
apt update
apt install ndppd

然后 nano /etc/ndppd.conf编辑配置文件。这个文件默认不存在,nano顺便新建了,然后进入编辑器模式。
配置文件如下:

proxy eth0 {
router yes
timeout 500
autowire no
keepalive yes
retries 3
promiscuous no
ttl 30000
rule 2001:DB8:1101:0119::/64 {
static
}
}

在上述配置中,我们将ndppd配置为在eth0(公网)网卡上启用代理,并使用前缀 2001:DB8:1101:0119::/64 。通过将规则设置为"static",ndppd将自动广播该前缀的所有IPv6地址,使其可达。 #GPT是这么说的,实际上还是分配哪个广播哪个,不会广播整个前缀。

ttl 的值为 30000,这意味着路由和地址的存活时间为 30000 秒(约 8 小时)
router 设置为 yes 表示 网卡将作为路由器进行工作。

其他的我也不知道为什么这么写,网上的教程和GPT都这么给我的,能用就行

然后 service ndppd restart

然后有VPN客户端或者是Zerotier公网IP啥的接在VPS后方,并且手动分配一个公网v6例如 2001:DB8:1101:0119::2/64 的话(也可以自动,比如DHCPv6服务器和RA包含无状态SLAAC分配。安卓手机只支持SLAAC,这个协议要求前缀大于等于64位,/65~/128前缀都不行。安卓手机root后可以改配置打开有状态dhcpv6,具体请谷歌,谷歌商店有现成的软件。)
很快,客户端和VPS服务器就能通信了,然后服务器上由于邻居发现协议,就从公网网卡通告母鸡:

"母鸡网关 2001:DB8:1101:1::1你好,我是设备 2001:DB8:1101:0119::1,我的64位子网中2001:DB8:1101:0119::2有人使用了。没在面板上通知你,用NDP给你打电话的,帮我继续向外通告一声,目标是他的数据包别丢,转发给我。有效期三万秒,如果他一直用这个地址,我稍后还会通告你,保持联系!“

biang。挂机。

好了,有点笨,但好歹是能用了,不是吗?
如果母鸡很慷慨地给你提供了更大的前缀空间,却没给你全部路由,可能还得工单和客服聊一聊,buyvm的卢森堡给的/48前缀,但是没有路由,只好这样手动操作了。实际上,/64就有18446744073709551615个地址了,一秒钟换一个都能换585.84亿年不重复的。

帮到您的话请加鸡腿,希望v6早点普及,希望大家不要把她妖魔化。
v6让公网IP不再成为稀缺物品,作用很大,未来无量。

给我留言