拨云见日,Linux一键重装处理Debian系不规则IPv4已彻底性解决 __2023年8月3日 __3条评论 __313次阅读 __0人点赞 __Tao_Qi 论坛主贴: 史上最强,支持Debian 12 raid 0 Ubuntu 22.04 AlmaLinux/RockyLinux/CentOS 9 Fedora 38 AlpineLinux Kali Linux和Windows一键重装脚本功能更新,bug反馈贴(长期更新) 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
[code]
# [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
[/code]
显然,大神也遭遇了 OVH 机器上不规则 IPv4 配置的问题,并且在安装早期,即“d-i preseed/early_command”阶段,给了一套可行方案,其代码完成度之高,完全可以移植过来使用。 需要注意的点仅仅为把“{{ hostvarsitem }}”等部分,改为我脚本获取到的机器中的 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,也完全大丈夫:
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议
yqhd说道: 2023年8月3日 下午9:12
hostlocmjj说道: 2023年8月3日 下午9:14
Likaliang说道: 2023年8月3日 下午9:14
发表回复 取消回复电子邮件地址不会被公开。必填项已用 标注 __ __