Linux一键重装完善网络适配,IPv6优化,丰富安装状态显示

查看 53|回复 5
作者:天权璇玑   
   
项目地址,欢迎 star,github 主页或私信反馈:
https://github.com/leitbogioro/Tools
论坛主贴:
https://hostloc.com/forum.php?mod=viewthread&tid=1159839
更新内容:
支持 IPv6 单栈机;对 IPv4 IPv6 商家原系统模板中网管错误的掩码问题做修正(仅静态配置);丰富了重装前组件检测、网络详情(包括显示系统网卡名、网络配置文件目录、双栈机/IPv4 单栈/IPv6 单栈显示、IPv4 配置详情、IPv6 配置详情)、用户访问 IP 所属时区、SSH 端口号、安装硬盘、目标系统下载详情(包括系统名、分发版本、架构、下载源)显示;部分 OVH 机器,即使 IPv4 是 DHCP,IPv6 是静态,脚本也能自动识别,但 IPv4 DHCP 下新系统没网,建议加上 --network "static" 参数,强制让双网静态配置网络。

前几天收到一个用 akile.io 台湾单栈 IPv6 坛友的反馈,他的机器用脚本无法重装 Debian,网络详情如下,数值已隐私化处理:
[ol]auto eth0
iface eth0 inet6 static
  address 2603:c020:8:a19b::ffff:e6da
  gateway 2603:c020:8:a19b::ffff
  netmask 128
  dns-nameservers 2001:4860:4860::8888[/ol]复制代码
初步发现问题是脚本没针对单栈 IPv6 静态配置写入正确的网络配置自动应答文件造成的,但 Debian 的 preseed 不认“128”这种简写后缀,必须要转写成 IPv6 格式才有效,这就是几天前 网址 帖子里提到的内容,我弄了一个把 IPv6 后缀转写成完整 IPv6 地址的功能,然后写入 preseed,但即使按这样写入,Debian 安装程序依然报 Untouchable Gateway,即找不到有效网关。
我把这个问题反馈到了 akile 的官方 tg 群,他家技术自己也做了实验,然后跟我说,掩码改成 64 就行了,我试了一下,果然行了。
后来我查了一下 IPv6 的资料,掩码的作用简单讲就是指定机器寻找 IP 段的范围,数值越大,范围越窄,IPv6 掩码范围从 1 到 128,所以 1 范围最大,128 位范围最窄,仅包含机器主 IP 一个,本机 IP 2603:c020:8:a19b::ffff:e6da 和 2603:c020:8:a19b::ffff 虽然有共同的网段,但它们并不是一个 IP,所以 Debian 安装程序在获得掩码 128 的值以后,认为网络中仅包含 IPv6 一个地址,而不会承认这个网关,导致找不到网关。所以我一开始的解决办法是看 IPv6 静态配置中掩码一旦超过 96,就会有找不到临近网关的风险,于是在新系统网络配置文件中把掩码设置成 64,以扩大范围。
解决 IPv6 的问题,给我之前一直相当头疼的一个 IPv4 问题带来很大启发,许多商家,比如 godaddy,hetzner,以及一个坛友给我测的另一个单栈 IPv4 台湾机器,arkecx.com 家的,其主 IPv4 地址是公网 IP,但网关是一个内网的,类似这样:
[ol]auto eth0
  iface eth0 inet static
    address 190.168.23.175
    netmask 255.255.255.240
    dns-nameservers 8.8.8.8 8.8.4.4
    up ip -4 route add default via 169.254.0.1 dev eth0 onlink[/ol]复制代码
静态配置下,按系统网络配置原样给 Debian preseed 里写,Debian 安装程序还是会报 Untouchable Gateway,有解决 IPv6 配置的经验,我们就可以明显发现,掩码 255.255.255.240 规定机器只能寻找临近的 15 个 IPv4,显然网关 169.254.0.1 和本机 IPv4 190.168.23.175 相差了远远不止 15 个 IP,所以我们可以用比对两者 A B C D 类不同之处,来尝试给出最合适的掩码。
通过 IP 计算器得出,当且只有 IPv4 掩码给 1 时,即 IP 范围从 128.0.0.0 - 255.255.255.255,本机 IP 和网关 IP 才正好能被包含在这个范围中。如果 A 类相同,B 类不同,掩码可以给 8,同理,掩码还有给 16 和 24 这两档,直接看代码吧。

IPv6 的情况远比 IPv4 复杂的多,因为它存在简写,这就意味着我们必须要把 IPv6 地址和 IPv6 网关扩充为完全体,包括中间一堆 0 的全写,确保它是一个含 32 个 16 进制数,7 个冒号的格式,才能做完全地比较。
所以我先弄了一套把 IPv6 缩写转换成全写的代码:

简单来讲共需要分 2 步实现,第一步是把缺少的冒号补上,然后在每个冒号前补 0 ,形成比如 2620:119:35::c4 到 2620:119:35:0:0:0:0:c4 这样的转换,第二步才是遍历里面的每一个区块,不足 4 位的,在前面补 0 ,形成完整的 IPv6 地址:2620:119:35:0:0:0:0:c4 2620:0119:0035:0000:0000:0000:0000:00c4 。
经过以上处理,本机 IPv6 地址和 IPv6 网关才能按每个区块逐一比较,然后根据不同档位,给不同的掩码,IPv6 的容量大,掩码档位也要比 IPv4 的 1 8 16 24 要多,共 1 16 32 64 80 96 112 128 8 个档。
另外,我测试甲骨文机器的时候,发现一个问题,就是它的 IPv6 DHCP 下,网关是一个本地 IPv6 地址,跟本机 IPv6 完全不同,如果掩码给 1 而非 DHCP 指配的 128 位,IPv6 网络就无法使用,我查了下资料,原因是 IPv6 DHCP 配置下,网卡自己的 IPv6 地址就是一种鉴定身份,和上游通信的手段,此时指定本机 IPv6 段唯一,即掩码为 128 即可。如果有人指定 --network "static" 参数,非要用静态方式配置 IPv6 的话。再加上修正 IPv4 错误掩码并按区块不同分档的思路,我也给 IPv6 的掩码设置了区分档位,代码如下:



按以上案例,主 IPv6 地址 2603:c020:8:a19b::ffff:e6da 转成完整格式就是:2603:c020:0008:a19b:0000:0000:ffff:e6da,网关 IPv6 地址 2603:c020:8:a19b::ffff 转成完整格式是:2603:c020:0008:a19b:0000:0000:0000:ffff,按代码给出的策略对比,两者前 6 个区块都是相同的,掩码设置成 96 就行了,不用 64 范围那么大。精细匹配,按量控制,未来碰到更多不确定环境时,适用的范围更大。
综上所述:
不专业的网管是真的害人,还得我给他们擦 pp,修正他们的错误。IPv6 太几把复杂了,我求求以后别再弄个 IPv8 了,不然没法活。
另外一个更新就是把脚本安装时搜集到的各种信息打印出来,让使用者心里有个数,当然跟以上这几个重量级比,这个活并不算什么。

掩码, 网关, 地址

wwrroopp123   
技术贴,学习
aru   
推荐增加一个 --dry-run 参数,不修改grub,只是打印出来,可以方便调试
腾讯云6折购   
泰库辣

HOH   
你把这当你的公告板了是吧
zxxx   
更新很频繁啊
您需要登录后才可以回帖 登录 | 立即注册

返回顶部