论坛主贴:
https://91ai.net/thread-1159839-1-1.html
github:
https://github.com/leitbogioro/Tools
图库为 sm.ms,国内用户需挂梯子全局才能查看。
众所周知,号称“欧洲阿里云”的 Hetzner ,由于其虚拟机(Cloud)产品网络部分,不论任何地域, 公网 IPv4 + 172.31.1.1 内网 IPv4 网关 这种组合,使众多重装脚本折戟沉沙竞折腰,因为:
按 dhcp 去配置 IPv4,偶尔会出现连接 Hetzner dhcp 服务器出错而造成的 IPv4 配置失败;从系统中原样读取 IPv4 等参数静态配置,直接将其写入各 Linux 发行版网络安装程序配置中,重启后网络配置失败,其中最知名的就是 Debian installer 的死亡红框 —— “unreachable gateway”。
Hetzner 是一座峰入云霄的大山,但并非难以逾越。甚至毫不夸张地说,谁的脚本如果能通过在 Hetzner 严苛环境中的测试中摘得桂冠,应付自如,谁的脚本就能自带解决其他同类复杂环境 +70% 绰绰有余 buff。
之前 Hetzner 的环境都是坛友提供的,最近我自己搞了个 Hetzner 免税号,其随用随删,IPv4 配置怪异,支持 IPv6 栈,还有 arm64 架构,是一个非常优质的测试平台,以下测试,仅付账单 0.02 欧,就解答了我对其的各种猜想。
接下来简单汇总一下脚本最近几项重要更新:
支持双网卡单 IPv4 多 IPv6 配置,如 eth0 负责 IPv4 连接,eth1 负责 IPv6 连接,且 eth1 有多条 IPv6 配置,仅适用于 Debian 系;支持双网卡单 IPv4 多 IPv6 配置,如 eth0 负责 IPv4 连接,eth1 负责 IPv6 连接,且 eth1 有多条 IPv6 配置,仅适用于 Debian 系;对于不规则 IPv4 配置,配置网关时增加“onlink”参数,以强制本机与网关直接通信,使之能适应所有不规则 IPv4 配置状况;部分机器中,使用 Cloudflare 1.0.0.1 DNS 服务器可能出现和本地内网“1.0.x.x”等通信冲突,造成 DNS 无法工作的状况,所以对于中国大陆境外机器,IPv4 DNS 顺位改为 8.8.8.8 1.1.1.1;修复了使用 Debian 12 做中介系统 dd Windows 时,由于出现 2 个条目“d-i preseed/early_command”造成的软 hack 失效,VNC 内没网,死亡红框“bad archive mirror”;输入 --network "dhcp 或 static" 时,强制跳过系统内网络配置文件和 IPv4 IPv6 双栈动静态检测,节省等待时间;修复了因找不到系统内规范的网络配置,脚本陷入检查 IPv4 IPv6 动静态配置卡死的问题,对于每个栈,检查时间最多等待 4s ,超时后自动按静态配置,这也是个老 bug 了;在商家 LightNode 环境中,发现第二张网卡 eth1 才负责与外联通信,第一张网卡 eth0 作用未知,脚本修复了当系统中与外联通信的网卡,非按物理顺序连接到系统中第一个时,由于重启后指定安装程序配置的,仍然是物理顺序第一张网卡,而造成的网络配置失败;通过劫持网络启动内核中 /boot/init 初始化脚本“configure_ip()”函数中的“# manual configuration”注释,向后添加强制配置网关命令,解决了 AlpineLinux 在不规则 IPv4 环境中的网络配置问题;中国大陆境外机器安装 AlpineLinux IPv4 DNS 也顺位改为 8.8.8.8 1.1.1.1;修复了向临时 AlpineLinux 环境中写入参数配置集合“alpine.config”出现的单条目写入多次的 bug;由于底层 AlpineLinux 可以在不规则 IPv4 环境中正常运作,所以无论是安装 AlpineLinux,还是通过 dd 安装 Ubuntu,或是通过指定“-windows”参数来让 AlpineLinux 做中介系统 dd Windows,安装都能顺利继续;通过修改 cloud-init 自动应答文件,修复了 dd 后的 Ubuntu 系统,在不规则 IPv4 环境中启动后,netplan 配置文件 /etc/network/20-netcfg.yaml 中由于 -routes 条目缺少“on-link: true”造成的网关配置失败,系统内没有网络的问题;修复了双栈机 IPv4 不规则配置下,配置 AlpineLinux 网络启动时,强刷 IPv4 网关不工作的 bug;修复了重装日语 Windows,执行 bash InstallNET.sh -windows 10 -lang "ja" ,从秋水逸冰 Windows 源 dd Windows 时,由于 dd 包名称匹配错误造成的找不到有效 dd 包的 bug ,同样支持 -lang "jp" 或 -lang "zh" 时,匹配到正确的日语、简中 Windows dd 包。
经过论坛里发过的不少帖子,许多细心的坛友应该也意识到了,网络重装最容易翻车的地方,就是应对不规则的 IPv4 配置,包括以下几种情形:
公网 IPv4 + 内网网关;公网 IPv4 + 公网网关,且公网 IPv4 和公网 IPv4 网关从 A 类起不在同一段;网关不在由公网 IPv4/掩码后缀计算出的范围内。
几乎所有主流 Linux 发行版的网络启动内核,接受填写的各种 IPv4 时,都会对主 IPv4/掩码后缀生成一个 IPv4 地址范围,这个范围内的机器,都当做内联通信处理,反之则当外联通信处理。
按照标准的网络环境配置而言,网关应当包含在内联通信范围以内,否则安装程序就会报错。
在许多主流大厂网络环境环境中,网关都遵守“在主 IPv4/掩码后缀内网中”的定律,但 Hetzner Spaceberg Godaddy waf.group 等一系列商家中的网络环境,都打破了这一定律,如果机器原生支持 dhcp 配置还好,但一旦采用了静态配置,按系统原样写入相关网络配置,必然会出现触犯 Linux 安装程序的“天条”,从而造成安装失败。
萌咖、debi、bin4-9(暂时仅支持 IPv4 dhcp 配置)等各种自己重写的、基于萌咖原版魔改的脚本,都会被这一闷棍治得服服帖帖,动弹不得。面对这种困局,在我之前,没人能在自动化脚本中,给出一套完善的解决方案。
而我和我的脚本,专门为破解这种难题而来,而且获得了丰硕的成果。破解谜题的乐趣,不止在于获得成果的满足感,把其中的过程和机理分享给大众,也是乐趣之一。
在这个帖子:拨云见日,Linux一键重装处理Debian系不规则IPv4已彻底性解决 中,我提出了一套破解不规则 IPv4 配置网关失效的终极方案,核心思路如下:
[ol]ip link set IPv4 网卡 up;
ip addr add IPv4/掩码后缀 dev IPv4 网卡;
ip route add IPv4 网关 dev IPv4 网卡;
ip route add default via IPv4 网关 dev IPv4 网卡[/ol]复制代码
以上代码执行的效果和注意点如下:
设置并激活 IPv4 网卡;为 IPv4 网卡添加 IPv4/掩码后缀,以设定主 IPv4 地址和掩码;为 IPv4 网卡添加对应的 IPv4 网关;强制为 IPv4 网卡设置 IPv4 网关;给临时环境配置可用的 DNS;Linux 安装内核接受 IPv4 相关参数的时候,不包含 IPv4 网关;通过执行以上命令,在运行在内存中的临时 Linux 环境中,成功配置 IPv4 网络、安装完系统后,在正式系统中的网络配置文件中,把 IPv4 网关写回去。
以上伪代码存在一个不完善的地方,就是“ip route add default via IPv4 网关 dev IPv4 网卡”部分,最后应当添加一个“onlink”,规定主机直接与网关进行通信,当做公联通信处理的那种,因为在某些环境中,不添加“onlink”,本机仍然会试图以内网主机的方式和网关通信,从而造成网络配置失败,所以改动的地方仅涉及添加“onlink”即可:
[ol]ip link set IPv4 网卡 up;
ip addr add IPv4/掩码后缀 dev IPv4 网卡;
ip route add IPv4 网关 dev IPv4 网卡;
ip route add default via IPv4 网关 dev IPv4 网卡 onlink[/ol]复制代码
这串伪代码极其重要,因为它就是一套绝杀天下的《独孤九剑》,只要将其放在适合的环境中,灵活运用,配合以上几条注意点,理论上能解决所有 Linux 发行版网络安装程序应对不规则 IPv4 配置时,网关配置失败的问题 。
除了知道要插,还得知道往哪儿插,怎么插,这套剑法才能发挥其无敌的效用。
首先把插法解决的,自然是我脚本中的 Debian,不过不规则 IPv4 虽然仅安装 Debian 是没问题了,但用 Debian dd Windows 的时候还是会存在一些问题。
[ol]bash InstallNET.sh -dd 'dd 包'[/ol]复制代码
在代码没更新前,preseed.cfg 中,有两条 d-i preseed/early_command :
显然,一条负责软 hack 不规则 IPv4 网关,另一条负责用 anna-install 安装一些 Debian dd 时需要用的临时组件。
经过实测,这种情况下,Debian installer 仅会选取 preseed 中靠最后的那个 early_command 执行,因为软 hack 不规则 IPv4 网关命令并未执行,所以系统内并无网关,死亡红框“bad archive mirror”如约而至。
解决方法很简单,如果发现用户要用 Debian dd 时,把 anna-install 部分,追加到软 hack IPv4 网关后即可,还有别忘了,把下方固定写死的 early_command anna 给删掉,确保任何情景下,preseed 内有且仅有一条“d-i preseed/early_command”,代码更改如下: