logo NodeSeekbeta

拨云见日,Linux一键重装处理Debian系不规则IPv4已彻底性解决

论坛主贴:

史上最强,支持Debian 12 raid 0 Ubuntu 22.04 AlmaLinux/RockyLinux/CentOS 9 Fedora 38 AlpineLinux Kali Linux和Windows一键重装脚本功能更新,bug反馈贴(长期更新)

github:

https://github.com/leitbogioro/Tools

图库为 sm.ms,国内用户需挂梯子全局才能查看。

这两天被隔壁论坛屡次秽土转生的大明星、本论坛英灵殿英雄 20 x 250 哥好一顿埋汰,整得我实在是有点里外不是人,哥们儿在好几个帖子里对我那是旁侧敲击,轻拢慢捻抹复挑。

不过 I don't care. 关于撕逼的事我现在一概不参与。我只专心于把我的脚本做好,在丰富自己知识和技能的同时,让更多的人从中受益。

这个世界总是不缺批评的、阴阳怪气的、诋毁别人的人,但真正有志于直面问题,解决问题,分享成果的人却很少,建设罗马百年之功,毁灭罗马一日而溃。

有道是逃避可耻但无用,知耻而后勇,我承认自己之前的处理手段不够高明,笨 B 一个,让诸位见笑了,但笨鸟先飞,承认自己技不如人,努力改进就是,这并不丢人。

Talking is cheap, show me the codes. 不讨论哪个脚本好,哪个脚本不好,一切以代码和实测说话。公道自在人心。

在此特别感谢隔壁论坛好哥们儿 radiogaga,调整代码和测试的圆满成功,离不开一直以来麻烦他给提供的实验环境、以及我们 debug 时共同付出的等待和耐心。

同样也感谢给我提供灵感的外国友人 https://lab.civicrm.org/bgm ,开源精神总是在不经意间,就能给别人带来莫大的帮助。

此次更新是 Debian 系专属的 moments,由于我对红帽系预安装环境 anaconda,AlpineLinux 预安装环境 busybox 中的内部的运行机制不甚了解,只能停留在按照红帽的官方文档,给 kickstart 参数的程度,深入底层的 hack 不甚理解,所以向网络环境为不规则 IPv4,想要重装 CentOS 7、AlpineLinux、Ubuntu(在 AlpineLinux 中通过 dd 实现)的兄弟们说一声抱歉,红帽 8+,Fedora 37+ 可顺利以不规则 IPv4 配置。

基本上所有的欧洲商家,包括且不限于 Hetzner Spaceberg OVH tk-hosting 等等,以及我见到过的 Godaddy arkecx 等,异常的纯 IPv4 配置、IPv4 + IPv6 双栈机,重装 Debian 全系 / Kali 都能丝滑成功。

好的,小作文环节结束,下面直奔主题。

前情提要:

重大突破,解决Hetzner Spaceberg等一众欧洲商家重装难问题

谜题拼图逐渐完整,Linux 一键重装处理不规则 IPv4 + 多盘 raid 0 大 BOSS 终极挑战

Debian installer 强制校验 IPv4 网关是否在 IPv4/掩码其中,若否,则报死亡红框“unreachable gateway”的问题,可谓是从萌咖创造这个脚本,以及直到我今天更新完代码前,令无数人困惑的梦魇。

我曾经尝试过好几种方法来解决这个问题,包括但不限于:1. 给大掩码;2. 猜测实际网关地址;3. 在安装前尽可能早的阶段,植入 ip route add 命令,绕过 preseed 自带格式填写网关以及网关有效性检测;4. 双栈机用 IPv6 配置网络,系统安装到快要重启前,再把 IPv4 配置写回去,确保重启后 IPv6 IPv4 都正常运作。

1 和 2 两种方法现在回过头来看看,无疑有点“幼稚”,它们应该被优先舍弃。方法 4 仅限于双栈机且安装 Debian 12 / Kali,在 Debian 11 及更早版本并不行得通,而且咱也不能指望所有有不规则 IPv4 网络的机器,都有 IPv6 访问。

所以核心思路还是要聚焦到方法 3,即寻找到一种有效方式,在 preseed early 阶段,尽可能早地把网关添加到 Debian installer 中,让不规则的 IPv4 网络能正常运作。

令人欣慰的是,我找到了一个真正的大神级人物,写得神迹代码,这种软 hack 方式可完全解决安装早期刷入 ip route,以让 Debian installer 联网的方法,项目地址和代码如下:

https://lab.civicrm.org/infra/ops/blob/master/ansible/roles/kvm-server/templates/etc/preseeds/host/preseed.cfg

# [ML] Notes
# - Yes, this is horrible, but only way found to set our OVH static route
# - ethdetect calls firmware-detect, which does if down/up just for fun. This overwrites the script because we don't need it anyway.
# - and then the DNS were getting reset, so I despaired and added it to /usr/share/debconf/confmodule
# - nb: need to check if executable, because otherwise the installer won't finish once in the chroot.
# - it is slightly more readable once generated.

d-i preseed/early_command string ip link set ens3 up && \
  ip a add {{ hostvars[item]['preseed_ipv4_address'] }}/32 dev {{ hostvars[item]['preseed_network_interface'] }} && \
  echo "(ip route add {{ hostvars[item]['preseed_ipv4_gateway'] }} dev {{ hostvars[item]['preseed_network_interface'] }} || true) && (ip route add default via {{ hostvars[item]['preseed_ipv4_gateway'] }} dev {{ hostvars[item]['preseed_network_interface'] }} || true) && echo 'nameserver 8.8.8.8' > /etc/resolv.conf" > /bin/ethdetect && \
  echo "(test -x /bin/ethdetect && /bin/ethdetect) || true" >> /usr/share/debconf/confmodule

显然,大神也遭遇了 OVH 机器上不规则 IPv4 配置的问题,并且在安装早期,即“d-i preseed/early_command”阶段,给了一套可行方案,其代码完成度之高,完全可以移植过来使用。

需要注意的点仅仅为把“{{ hostvars[item]['preseed_ipv4_address'] }}”等部分,改为我脚本获取到的机器中的 IPv4 地址、掩码后缀、网关、网卡名、DNS 参数,别忘了 preseed.cfg 的“d-i netcfg/get_gateway string”值一定要给“none”,以跳过 Debian installer 的网关合法性检测。

我的调整和策略主要有以下几个方面:

  • 双栈机 IPv4 部分不规则的,且如果要安装的是 Debian 12 / Kali,还是维持以 IPv6 优先配置网络不变;
  • 对于单栈 IPv4、Debian 11 及更早版本、指定“-dd”参数 dd Windows 等镜像,调整为 hack IPv4 优先连接网络;
  • 对于公网主 IPv4 地址、公网 IPv4 网关,且二者从 A 类起就不在同一段的情况,也会根据情况,从上面两条策略之中选取一条配置;
  • 检查到只要有不规则 IPv4 配置,不管 IPv4 或 IPv6 部分是 dhcp 或 static,双栈都会强制采用静态配置,避免出现 Hetzner 那种明明原系统是 IPv4 dhcp,但重启时连接 dhcp 服务器失败的情况;
  • 如果使用 hack 方式进行不规则 IPv4 配置,“d-i preseed/late_command”阶段必须要把 IPv4 网关给刷回去,否则重装后系统会由于缺少网关,网络配置不正确而导致 IPv4 栈不工作。

以下是一些其他有的没的的细节:

先拿 Virmach 的机器做个实验,原机器中主 IPv4/掩码为:78.142.231.165/24,网关为 78.142.231.1,作为一名合格的开发者、产品经理、测试,原本的策略还是会计算主 IPv4 和网关 IP 的 A 类,B 类,C 类,正常情况下临时掩码会给 24,然后到 late command 阶段把 24 改回 30,我们先在这里进行一个小小的 hack,让脚本强制硬刷 IPv4 网关:

这样通过模拟不规则 IPv4 执行的结果,脚本给出的硬刷 IPv4 策略符合预期,然后再进行后续的测试 OVH,Hetzner 机型。late_command 阶段再将 IPv4 网关写回网络配置文件中。

诶嘿,成了!现在就差最后阶段看看网关 IPv4 有没有被刷进去,否则网络服务无法启动,ssh 登录不了。

网关刷进去了,而且看顺序是靠后的,因为如果网关在 d-i netcfg/get_gateway 阶段就指定了的话,它应当夹在 address 和 dns-nameservers 之间。

旁边挂着的 OVH 不规则 IPv4 测试机也能放心重启了。

诶嘿,找到网了:

不到 3 分钟就装好了,这速度,不敢相信!OVH 的机器确实强。

这个困扰了我好几个月的心病终于完全得以解决。

因为很多 Windows dd 包服务器只有 IPv4 没有 IPv6,不规则 IPv4 配置双栈机如果强制用 IPv6 配置中介 Debian 12 安装程序环境,会导致无法顺利连接可用的 IPv4 Windows dd 服务器,所以带“-dd”参数从 Debian 12 启动也是优先 IPv4 配置,当然包含支持不规则 IPv4。

刚才做了一个小测试,dns这边还是要保证添加两个,避免只给 1.0.0.1 出现单点故障。

以不规则纯 IPv4 栈优先,中国大陆以外机器,给 CloudFlare 和 Google IPv4 DNS,双栈机给 CloudFlare 和 Google IPv4 和 IPv6 DNS,同理国内机型也会被配置适合的国内 DNS。

对于 IPv4 不规则的情况,安装 Debian 11 及更早版本,以配置 + hack IPv4 栈优先:

双栈机处理 IPv4 不规则的情况,安装 Debian 12+ / Kali 以配置 IPv6 栈优先:

双栈机安装 Kali,单栈机不规则 IPv4 安装 Kali,也完全大丈夫:

123
  • 好,Mark

  • 支持大佬

  • xhj006

  • 配点图就好了 xhj002 xhj003 xhj006

  • 嚴重過來支持一下!

  • Mark xhj006

  • 技术贴 xhj003 xhj003 xhj003

  • @leitbogioro #0
    依旧是来自Dev界的专业和精彩, 尤其过程中破题的细枝末节和历程, IPv4/IPv6的单双栈还有iptable的配置和适配调整很折磨人 xhj003
    必须加精+鸡腿儿 xhj008
    BTW, 开了全局也没看到任何图片, 楼主你确定有加图床链?

  • 帮顶!干货

  • @Kdkdk #8 图库全放在 imgur.com,是梯子屏蔽了访问?可以切换节点试试

123

你好啊,陌生人!

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

📈用户数目📈

目前论坛共有15788位seeker

🎉欢迎新用户🎉