论坛主贴:
https://91ai.net/thread-1159839-1-1.html
github:
https://github.com/leitbogioro/Tools
图库为 sm.ms,国内用户需挂梯子全局才能查看。
最近更新内容:
整理并美化 kickstart 中配置各红帽(Redhat)、软呢帽(Fedora)源格式;优化红帽 9+ 、软呢帽多 IPv6 配置策略,以“addr-gen-mode=eui64 nmethod=auto”为关键词,匹配未被初始化的 IPv6 部分,然后再进行改为静态、写入多条 IPv6 操作,避免双栈机 IPv4 栈为动态配置时,仅以“method=auto”为关键词更改 IPv6 配置方法时,把 IPv4 配置部分搞错乱;指定 -windows '版本号' ,以 AlpineLinux 为中介 dd 来自秋水逸冰制作的 Windows 镜像源时,会在目标系统内嵌入一个“SetupComplete.bat”,仅在用户首次桌面后运行,它会自动进行配置静态 IPv4、把 dd 镜像 15GB 分区扩展成系统所在分区全盘容量;对于不规则 IPv4 网络 dd 的 Windows ,如果掩码范围过窄,会导致 wmic nicconfig 命令无法刷入主 IPv4 ,掩码,所以 24 以上的掩码后缀,统一改为 24; 为 Windows 刷入静态 IPv4 配置的步骤为:1. 先刷入主 IPv4 ,掩码;2. 将主 IPv4 当做网关刷入;3. 将真实网关刷入,替换掉第 2 步部分,第 1 2 步目的是为了形成一个受 Windows 网络服务承认的配置,避免刷入失败;如果查询到 ssh 服务中,访客通过内网 IP 访问机器,说明大部分情况下,该机器和访客处于同一个物理区域,此时查询内网 IP 归属地做时区是无意义的,因为统一都是美国纽约。所以一旦发现这种情况,会将本机通过 dns 从公网返回的 IP 归属地做时区;把判断 IPv4 或 IPv6 是否为内网地址封装成了函数,方便各处调用;彻底优化 IPv4 栈和 IPv6 分别属于系统中的哪张网卡的判断,因为一旦以某个栈重启后安装并配置网络时,如果对应栈的网卡并非物理连接到系统中的第一个,会造成配置失败;AlpineLinux 对多网卡的处理规则,和 Debian 系,红帽软呢帽系正好相反,它会优先配置按物理顺序连接到系统中的最后一张,所以如果系统中有多网卡,且只有一个网卡负责与公联通信,重装 AlpineLinux 时会采用静态配置;对应 AlpineLinux Ubuntu 的自动应答文件中的网卡名也不再写死成“eth0”(因为有些环境下 eth1 负责连接外网,eth0 作用不明),而是会在原系统检测,得出正确结果,在再安装时替换掉相关网络配置文件部分;判断 IPv4 IPv6 栈分别所属哪张网卡的基本原理,是先列举中系统中所有网卡,然后把它们分别和 ip route show default ip -6 route show default 的结果相比对,一旦发现某张网卡在其中,就会把它当做分别对应 IPv4 IPv6 栈的网卡;在此基础上,我把记录所有网卡名的数据,存储在数组里,这样可以通过检索对应网络栈中网卡在系统中的顺位(index),反推出如果安装新系统,网卡名需要重定向时,究竟该对应 eth 后的哪个数字,虽然写死“eth0”可以应付绝大部分情况,但仍然会在某些“eth1”负责连接外网的机器上配置失败; 基于 AlpineLinux 对多网卡处理的特性,多网卡环境下,只能采取静态配置,即使原环境是动态配置,这样才能在 ip= 中添加需要配置的网卡名,避免 AlpineLinux 将 eth1 当做主网卡配置而非 eth0;由于在中介系统 AlpineLinux 中 dd Ubuntu 时,AlpineLinux 系统还未被完整展开,仅需加载一些下载工具、需要挂载目标硬盘的组件即可,所以 512MB 内存环境就可以完成 dd 需求,所以 dd 安装 Ubuntu 的内存要求降低为 512MB;如果仅安装 AlpineLinux ,内存要求维持至少 1GB 不变;通过极限微操,软 hack AlpineLinux 内核 init 文件,使之支持单 IPv6 栈环境,动态 dhcp 或静态 static 配置 AlpineLinux 临时环境和安装 AlpineLinux,一箭三雕;由于以上问题解决,纯 IPv6 栈通过 dd 安装 Ubuntu Windows 也不在话下;配置 AlpineLinux 安装时,添加 dhcpcd 组件,使之支持单栈 IPv6 下 dhcp 配置方法;为 AlpineLinux 优化并添加对应 IPv4 IPv6 动静态共 8 种不同组合的网络配置文件,使之能更好地适应更多不同复杂的网络环境;对于为单栈 IPv6 动态环境的目标系统 AlpineLinux ,网络配置中仅配置 IPv6 动态,不配置 IPv4 动态,否则系统中显示的 IPv6 地址会错乱,也无法 ssh 连接;优化 Ubuntu 自动应答文件 Cloud init 配置文件中配置 netplan 部分,对于 IPv6 dhcp ,添加 accept-ra: true ,使之能够更好地适配 IPv6 dhcp 网络;我已在 2023 年 5 月份时,就对 AlpineLinux 开发团队提了在 IPv6 下,支持 AlpineLinux 网络启动的 issues: https://gitlab.alpinelinux.org/alpine/aports/-/issues/15034,官方也给了建设性的回复,乐观估计等 AlpineLinux 3.19 版本发布的时候,该问题可能会得到妥善解决,详情参见:ipv6 support for udhcpc scripts + pxe ,欢迎有志之士也向 AlpineLinux 官方提出合理的、建设性的,有关功能支持、bug 修复等有关的需求。
今天详细讲解的内容,主要是让 AlpineLinux 彻底支持不同情况下的单栈 IPv6 环境。
众所周知,AlpineLinux 官方是不支持单栈 IPv6 环境下,从网络内核启动,成功配置网络的,官方 PXE 启动 文档也自 2021 年后,就很久没有再更新了,里面仅提及配置 IPv4 部分,乏善可陈。
但自从上篇文章 略施巧计,飞跃 Hetzner 重装 AlpineLinux Ubuntu Windows 险阻 中,我们找到了一个绝妙的方法,通过劫持 init 文件中 configure_ip() 函数静态网络配置注释和判断式下,添加 ip route 命令,强制让不规则 IPv4 添加到临时环境,以实现成功配置网络。
正所谓只要招数管用,一次用是用,十次用也是用,屡试不爽,就看能把它巧妙地运用于哪个地方,大方向对了,中间的一些小困难都是能克服的。
中间排坑的地方就不说明了,直接讲解代码吧:
以下是修改 init 文件前,脚本中对应单栈 IPv6 时的处理方法,elif 前面还有一个对应单栈 IPv4 和双栈的判断式,涉及软 hack IPv4 的,之前文章里讲过,就不贴了:
[ol]elif [[ "$IPStackType" == "IPv6Stack" ]]; then
if [[ "$Network6Config" == "isStatic" ]]; then
fakeIpv4="172.25.255.72"
fakeIpMask="255.255.255.0"
hackIpv6Context="manual configuration"
elif [[ "$Network6Config" == "isDHCP" ]]; then
hackIpv6Context="automatic configuration"
fi
sed -i '/'"$hackIpv6Context"'/a\\t\tdepmod\n\t\tmodprobe ipv6\n\t\tip link set dev '$interface6' up\n\t\tip -6 addr add '$ip6Addr'/'$actualIp6Prefix' dev '$interface6'\n\t\tip -6 route add '$ip6Gate' dev '$interface6'\n\t\tip -6 route add default via '$ip6Gate' dev '$interface6' onlink\n\t\techo '\''nameserver '$ip6DNS1''\'' > /etc/resolv.conf\n\t\techo '\''nameserver '$ip6DNS2''\'' >> /etc/resolv.conf' /tmp/boot/init
fi[/ol]复制代码
然后是写入 grub 引导 menuentry 菜单时的处理事项:
[ol]elif [[ "$IPStackType" == "IPv6Stack" ]]; then
[[ "$Network6Config" == "isStatic" ]] && Add_OPTION="ip=$fakeIpv4:::$fakeIpMask::$interface6:::" || Add_OPTION="ip=dhcp"
fi
BOOT_OPTION="alpine_repo=$LinuxMirror/$DIST/main/ modloop=$ModLoopUrl $Add_OPTION"[/ol]复制代码
好奇怪哦,再看一眼,配置 IPv6 静态的话,我们明明是要写入 IPv6 的相关参数,为什么要给内核启动,静态配置网络参数时,添加“172.25.255.72”、“255.255.255.0”两个写死的,毫不相关的 IPv4 参数呢?下面我连带软 hack IPv6 动态静态的原理,一起好好解释一下吧:
首先我们来看一下,对于处理静态 IPv6 网络(包括公网 IPv6 + fe80::1 内网网关)的方法:
显然,对于这种情况,我们需要劫持并定位的,对应 init 中 configure_ip() 函数中的上下文,根据传参到“hackIpv6Context”变量值,即需要软 hack 匹配的上下文关键词,为“manual configuration”,显然是在其以下,用类似于手动添加 IPv4 各配置的方法,把 IPv6 各配置也写入进去。