logo NodeSeekbeta

关于IPv6的常识科普,以及VPS通过ndppd向母鸡广播小鸡内网IPv6邻居的方法教程

本文已有新版本:

关于【非“全段路由”的IPv6子网】如何继续划分的研究笔记


声明:我也折腾了很久,可能没完全搞明白或者犯错,如果我有错误请指出来,鸡腿多多地有~

看到很多人抵触IPv6,正好我最近和坛友 AKEBI-NUKUI 私下里切磋了技术,也共同折腾几个小小鸡的v6,非常感谢他对我的支持,并送了我一台LXC小小鸡~

前情提要

在开始之前,先要把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是这么说的,实际上还是分配哪个广播哪个,不会广播整个前缀。

2023/07/16更新
如果需要广播整个前缀,则需要在服务器上执行一条命令:
ip -6 route add local 2001:DB8:1101:0119::/64 dev lo
这条命令是教服务器独吞这个段,在段内,尾巴随便换都能连上本机。

当然,前提是母鸡会把这个段都分配给你。
如果母鸡同时为你启用了routed prefix,那就不需要NDPPD了,直接开箱即用。

然后再启动NDPPD,仍然是设置为Static,这样间接实现routed prefix等效的效果。
不过NDP会过期,长时间没有连接的时候,首次PING会失败,这是因为IP报文触发后,通告母鸡需要一点时间。


继续:

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亿年不重复的。

后续更新:我也买了buyvm了,谁说的没有路由来着,误导我,这不好好的?

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


私货

已过时

#注释,可能需要开启的设置
网卡ra=2
ndp代理=1
eth0网卡ipv6掩码=128
网关不能是fe80

12345
  • ipv6也会被墙吗

  • @Just纱世里 #10 那看来/48就是一整段分配给小鸡用来路由的。我之前以为buy只给/64的段,发工单向客服要更多子网,客服回复说你已经有了一段/48了,我还纳闷我哪来这么大一段子网,以前都没发现Routed Subnets选项卡里还有个/48

  • 这段话好萌 ac10

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

  • niub ac08

  • 一头雾水,V6太麻烦了

  • 有点懵了,就说buyvm卢森堡。我在后台ipv6选项卡看到是/64的段,在Routed Subnets选项卡看到的是/48的段,而且前缀还不一样。所以/48的那段就相当于给我可以继续分发的,/64的那段是给机器自己用的吗

  • 最近在折腾家里路由器的ipv6 ddns
    这玩意搞得真的头大,开了有些网站打开真的好慢,后面干脆挂了拉到

  • 看的头脑发胀~

  • 顶!究极好贴

  • @Dogelee2 #6

    有些地方可能v6优化不好,其实路由器支持的话可以设置一下,丢掉IPv6的DNS解析记录,这样上网还是v4,但是需要v6点对点的情况下,比如PT还是可以联系的,除非是北邮人这种纯v6站点。

  • @James #5 发布于2023/6/17 10:29:22,编辑于2023/6/17 10:30:45
    有点懵了,就说buyvm卢森堡。我在后台ipv6选项卡看到是/64的段,在Routed Subnets选项卡看到的是/48的段,而且前缀还不一样。所以/48的那段就相当于给我可以继续分发的,/64的那段是给机器自己用的吗

    那就是一个段是母鸡和小鸡通信,一个段/48那个是给小鸡自由分发的。
    这其实也是v6的标准,运营商就会分配一个/64的v6和一个pd前缀。
    routed就是可路由,听起来像是母鸡已经知道把/48那个全部路由给小鸡了。
    我这边的话我再看看,因为我还没登陆过buyvm后台。

12345

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有15413位seeker

🎉欢迎新用户🎉