|
本帖最后由 天权璇玑 于 2023-8-26 21:06 编辑
sed -i 从“manual configuration”下面若干行追加的命令,显然有些冗长难懂,我把它的结果整理成易读格式:
[ol]depmod
modprobe ipv6
ip link set dev eth0 up
ip -6 addr add IPv6 地址/IPv6 掩码后缀 dev eth* 网卡名
ip -6 route add IPv6 网关 dev eth* 网卡名
ip -6 route add default via IPv6 网关 dev eth* 网卡名 onlink
echo 'nameserver 2001:4860:4860::8888' > /etc/resolv.conf
echo 'nameserver 2606:4700:4700::1111' >> /etc/resolv.conf[/ol]复制代码
“depmod”和“modprobe ipv6”负责开启 AlpineLinux 网络启动内核的 IPv6 模块及相关依赖,后面的命令就是对于 IPv6 版的添加本机 IPv6 地址、掩码、网关、设置 DNS ,区别无非就是从 ip 变成了 ip -6 ,对规则的或不规则的 IPv6 都生效,这里就不再赘述。
如果机器的 IPv6 是用 dhcp 配置的,通过读取原系统中的网络配置文件,判断出符合这一情况,那么传参到“hackIpv6Context”变量值,即需要软 hack 匹配的上下文关键词,就变成了“automatic configuration”,添加 IPv6 网络详情的步骤和静态情况下完全一致。
下面我们来看在 grub 引导菜单中,配置“ip=...”,这里对于 IPv6 静态或动态的处理就有了更多不同。
[ol][[ "$Network6Config" == "isStatic" ]] && Add_OPTION="ip=$fakeIpv4:::$fakeIpMask::$interface6:::" || Add_OPTION="ip=dhcp"[/ol]复制代码
显然,主条件是“Network6Config”(IPv6 的配置方法)是否为“isStatic”(静态),如果为是,则指定了以下方法,如果为否(即 IPv6 为动态配置),则指定“ip=dhcp”。
[ol]Add_OPTION="ip=$fakeIpv4:::$fakeIpMask::$interface6:::"[/ol]复制代码
“interface6”很好理解,就是负责处理 IPv6 网络连接的网卡名,细心的小伙伴们发现了,“fakeIpv4”和“fakeIpMask”和上面的代码形成了联动,即强制给 AlpineLinux 网络启动内核一个主 IPv4 为 172.25.255.72 ,IPv4 掩码为 255.255.255.0 的参数。
咱们明明是在配置 IPv6 网络的相关参数,为什么要给一个固定的,且“假的”(fake*) IPv4 地址和掩码呢?
答案很简单,因为直至目前的 AlpineLinux edge(3.18 版本),AlpineLinux 都无法原生支持从内核启动读取“ip=”参数,来获得并承认有效的 IPv6 参数配置格式。
之所以给一套假(fakeIpv4, fakeIpMask)的 IPv4 配置(主 IPv4 、IPv4 掩码),是为了确定让 AlpineLinux 的网络内核程序,以“静态”方式去启动网络服务配置网络,虽然这套假的 IPv4 配置,并不能真正地让网络安装内核按其参数去把网络配置好,但别忘了,刚才我们还有一套添加了真实 IPv6 参数,并让网络安装内核去访问 IPv6 网络的方案。
这套假的 IPv4 配置,作用仅限于让 AlpineLinux 以静态配置方式启动并配置网络服务,至于它是什么,无所谓,我选用“172.25.255.72”这个 IPv4 ,也是参考了全网并没有哪个具体环境,真的把它当做一个有效的 IPv4 去配置,而且它也属于互联网 IP 组织规范中,IPv4 内网地址的范围之内(172.16.0.0 - 172.31.255.255),任何人和组织都可以把它当做内网 IP 去配置,不会影响到任何在公网上服务的计算机。
为了尽量避免,因为设置了一个真实存在的公网 IPv4 ,而导致发生一些其他不可预知的后果,我便选择了这个 IPv4 地址,作为“骗过”AlpineLinux 并强制令其进行静态网络配置的临时 IP,力图把设置为该 IP 而引发的不良后果范围降低到最小。
可能还会有一些探索欲旺盛的朋友问,要让 AlpineLinux 网络启动内核以静态方式配置网络,不配置这套假的 IPv4 行不行?比如给:
[ol]ip=:::::$interface6:::[/ol]复制代码
就让其从 IPv6 网卡,启动静态的网络配置是否可行?
我当然不会没考虑过这一点,怎么可能先用反直觉的“fake IPv4”来“骗过” AlpineLinux ,但经过实际测试,发现用:
[ol]ip=:::::$interface6:::[/ol]复制代码
来配置,发现程序始终不能正确通过“Setting IP”步骤,所以才大费周章,用“假 IPv4”来应付这一难关。
所以,经过以上实验,我们得出了,要通过 ip -6 添加 IPv6 参数、内核启动时,指定假 IPv4 等一系列操作,让 AlpineLinux 网络安装内核能够顺利启动,并配置 IPv6 网络的结论,并且我们在正式为 AlpineLinux 或 Ubuntu 系统中,配置网络环境的时候,给出了适合的 IPv6 配置。
并且由于这套假的 IPv4 参数,仅限定于重启后在内存中加载的,AlpineLinux 网络内核在内存启动时的临时环境,而且由于在添加了 IPv6 相关参数并能够正常访问 IPv6 网络后,AlpineLinux 在执行后续与网络连接相关的命令时,如果发现已配置的 IPv4 部分工作不正常后,会切换到已正常运作的 IPv6 栈部分去进行访问。
再加上刷入到硬盘中的正式系统内,IPv6 部分是按规范进行配置的,所以这套假 IPv4 配置,在原生安装 AlpineLinux 或 dd Ubuntu Windows 后,重启后进行配置时的负面影响,就完全消失了,内存断电重启后数据完全消失,这是人人都知道的公理。
对于 IPv6 dhcp 动态配置下的情景,为什么内核启动参数又变成了“ip=dhcp”呢?
由于我本次测试中的各类环境,IPv6 动态环境仅限于 Vultr 的,Vultr 的 IPv6 only 机型,本质上是有一套完整的 IPv4 IPv6 内网 dhcp 路由 + 阉割了获得公网 IPv4 地址的方式实现的,所以本质上它还是有一套完整的本地 IPv4 dhcp 网络,只不过 IPv4 无法获得公网 IPv4 地址,所以内核启动时,要指定“ip=dhcp”来设置从 IPv4 dhcp 获取地址,手动添加 IPv6 各配置的方法,仍然通过软 hack 实现。
好奇的朋友们可能又会问:反正实现 IPv6 的访问,都是靠 ip -6 手动实现,为什么不将其归类到劫持 AlpineLinux init 文件的函数“configure_ip()”的静态配置方法,即“manual configuration”中。
反而要根据从原系统中读取到的动态配置,单独把它归类到劫持“automatic configuration”方法里呢?
这里面当然是有说道的,下面我们来假设(我试验过)的情形,即 Vultr 环境,服务器支持 IPv4 IPv6 双栈动态配置,且 IPv4 有完整的 dhcp 本地路由,无法获得公网 IP ,且 IPv6 栈支持 dhcp 连接到公网的情况。
通过 grub 内核启动时,指定:
[ol]ip=:::::$interface6:::”或“ip=$fakeIpv4:::$fakeIpMask::$interface6:::[/ol]复制代码
来配置,这里我放一张测试时遇到的截图。
显然,AlpineLinux 网络内核程序,返回了“Installing packages to root filesystem, ICMPv6 RA: ndisc_router_discovery failed to add default route”的错误,即母机 IPv4 配置命令,覆盖了我们指定的, AlpineLinux 网络安装程序的 IPv4 静态命令,并生成、覆盖了一套仅适用于该 IPv4 dhcp 环境下的配置参数,让我们在内核中指定的“糊弄” IPv4 部分徒劳无功:
如果你有志于探索和我 debugging 时一样的排坑之路,那么几乎 99% 的情形下,会被各种错误所击溃,为了造福于后人,我只能把我通过各种艰难险阻之路探索后的结果,忠实公布于众,然后把我为数不多迷雾图中的艰辛分享给你,希望你在至少参考了我无头苍蝇试错的路上,多多少少能避免重复出现我遇到的低级错误,或者能从我试错的路径之上,寻找到一条更接近康庄大道之路的导航规划。
你们也别笑我笨,因为我本非计算机科班出身,仅靠兴趣和毅力坚持到如今。
在内核启动中指定“ip=dhcp”后,由于机器本身 IPv4 网络部分的配置被上游 dhcp 服务器正确配置了,且 init 文件里指定了正确的 IPv6 网络参数,所以临时环境 AlpineLinux 中,IPv6 栈也是能顺利访问的,后期无论是安装 AlpineLinux 到系统,或是 dd Ubuntu 或 Windows ,后续过程自然也是一气呵成,不会有任何阻碍了。
百闻不如一见,打一万句嘴炮,不如久经考验的实测,下面直接放图吧,怀疑我是为了节目效果,故意 PS 的,请大大方方地,在本帖中点上一个“反对”即可,我没这个精力,也不需要去和这类声音对线。相信我的考据、结论的人,自然会保持一份信赖,用我的脚本实现他们需要的功能和目的,然后以真诚去印证我的承诺和结论。
实验机型 idc.wiki 虽然为纯 IPv6 机型,但由于内存仅为 512MB ,无法满足从内存中完整加载整个被配置好的 AlpineLinux 并写入硬盘的要求,故测试前提仅从 AlpineLinux 网络安装内核启动时的 IPv6 网络栈配置情况(注释了原脚本中,正式部署 AlpineLinux 的 chmod a+x $sysroot/etc/local.d/${AlpineInitFileName}; ln -s /etc/init.d/local $sysroot/etc/runlevels/default 部分),不涉及正式安装完整版 AlpineLinux 后从原生系统启动并查看其网络配置部分,但安装 Ubuntu 依然可以成功,且可以展示安装后的效果。
为保持变量结果统一,原系统均为各 VPS 自带的原系统 Debian 12 ,从其他自带模板,如 Debian 11-, AlmaLinux, RockyLinux, CentOS 等也经过测试,脚本均能正确地、自动读取出原系统中是 IPv6 动态或静态配置,然后指定 AlpineLinux 网络安装内核以适应的参数,在单栈 IPv6 网络下正确配置。 |
|