跳至内容

Jixun's Blog 填坑还是开坑,这是个好问题。

奇怪的 VPS 网络问题

因为打折入手了个相对廉价的储存 VPS 机器,遇到了一系列的奇怪问题,因此做个记录。

一切的一切从我发现后台有 VNC 访问权限开始…

起始 - 后台 VNC

管理虚拟机的 Virtualizor 后台可能未正确配置 WebSocket 反代,因此基于 HTML5 的网页端其实是不正常工作的。

观察网页接口可以发现实际上是有提供的,只是未导出:

使用浏览器的开发者工具可以看到 VNC 密码

然后就可以使用 VNC 客户端连接进去了。

※ 密码保护的 VNC 协议并不安全。使用数次后应当在「设定」→「VNC Password」重新生成 VNC 密码。

话说我现在才发现可以重置该值… 那看来网页端不显示该密码是期待行为,用户应当手动指定它。

重装系统

购买后发现自带的 Debian 模板最新也是 11 的。

担心手动升级会遇到奇怪问题(加上提供商相对比较“灵”),重装可以稍微稳一点。

因为没有 UEFI 且使用了 GRUB,因此参考 netboot.xyz 的说明重启并引导它,根据说明一路安装即可。

安装后稍微配置下即可(如 SSH 公钥、防火墙等)。

重启后无网络

因为“灵车”服务商帮忙升级了下内存,因此需要手动关机并从 Virtualizor 后台启动来生效。

这一启动就遇到问题了 —— 虚拟机无法连接网络。

使用 ip a 指令查看,可以发现设备未能成功初始化或获取到 IP 地址:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    ...
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:16:3e:11:22:33 brd ff:ff:ff:ff:ff:ff

(类似如上输出,缺少显示 IP 的那几行信息)

第一反应就是查看 /etc/network/interfaces 网络配置文件:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 100.110.120.200
netmask 100.110.120.0
 
broadcast 100.110.120.200
post-up route add 100.110.120.1 dev eth0
post-up route add default gw 100.110.120.1 dev eth0

对比设备名称一看,可以发现设备名称不一致,因此需要调整 grub 参数,告知内核禁止使用可预测的网络接口名称(Predictable Network Interface Names)。即,添加 net.ifnames=0 biosdevname=0/etc/default/grub 的 Linux 引导参数中。

更改前后可以参考下方的 diff

-GRUB_CMDLINE_LINUX_DEFAULT="quiet"
+GRUB_CMDLINE_LINUX_DEFAULT="quiet net.ifnames=0 biosdevname=0"
-GRUB_CMDLINE_LINUX=""
+GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

※ 因为怀疑该文件是通过虚拟机后台启动时自动生成的文件,直接改回旧的命名方案在未来会更方便。

保存后执行 update-grub 更新配置文件,然后执行 reboot 进行重启。

还是无网络

本次重启发现还是无网络,但是在引导时注意到 systmed 提示无法拉起网络服务 networking.service

查看日志可以发现之前网络错误的信息也在此:

$ journalctl -au networking.service

-- Boot 11111111111111111111111111111111 --
.. systemd[1]: Starting networking.service - Raise network interfaces...
.. ifup[481]: Cannot find device "eth0"
.. ifup[460]: ifup: failed to bring up eth0
.. systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
.. systemd[1]: networking.service: Failed with result 'exit-code'.
.. systemd[1]: Failed to start networking.service - Raise network interfaces.
#  因为找不到对应的网络设备失败

-- Boot 22222222222222222222222222222222 --
.. systemd[1]: Starting networking.service - Raise network interfaces...
.. ifup[485]: /bin/sh: 1: route: not found
.. ifup[460]: ifup: failed to bring up eth0
.. systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
.. systemd[1]: networking.service: Failed with result 'exit-code'.
.. systemd[1]: Failed to start networking.service - Raise network interfaces.
# 因为找不到 `route` 命令失败

既然是 route 命令不存在,那就安装一个?可惜没有网络,无法安装… 唯一有用的就是 ip 指令了。

但这就足够了,参考配置文件的设置配置一下路由即可:

# 假设网关 IP 为 100.110.120.1。第一条指令或许不是必须的?
ip route add 100.110.120.1 dev eth0
ip route add default via 100.110.120.1 dev eth0

试了下能联网了,赶紧安装网络相关的命令行工具包:

apt update -y
apt install -y net-tools

然后重启验证,发现 systemd 能正常拉起网络服务了。

结语

这个自动写出配置文件也太坑了。

若是我在安装前提前备份网络配置文件可能会注意到这些坑,提前调整系统需要的配置和工具。

不管怎么说,不需要再去重装一次真是太好了。

知识共享许可协议 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

评论区