我有一个基于 Debian 的无头盒子。它旨在通过其网络接口进行访问。网络是通过/etc/network/interfaces
. 我正在尝试验证文件是否真的有效。我的想法是检查文件是否有任何错误,在这种情况下,回退到默认文件。
我的问题是关于问题的第一部分:检测interfaces
文件中的错误。
我发现了很多关于使用ifup --no-act
命令的问题,但我在实践中看到的是这种方法对于我的情况来说不够健壮。举个例子:
root@arm:~# ifup --no-act --interfaces=/etc/network/interfaces eth0
run-parts /etc/network/if-pre-up.d
ip addr add 1s23.123.123.123/255.255.255.192 broadcast + dev eth0 label eth0
ip link set dev eth0 up
ip route add default via 123.123.123.122 dev eth0
run-parts /etc/network/if-up.d
请注意无效的 IP 地址集(第一个八位字节中的额外“s”)。该命令没有给出错误(无论如何我都可以看到),如果我以这种状态的文件重新启动机器,我将失去网络功能。一个有效的interfaces
给我一个非常相似的结果(除了broadcast +
部分):
root@arm:~# ifup --no-act --interfaces=/etc/network/interfaces eth0
run-parts /etc/network/if-pre-up.d
ip addr add 123.123.123.123/255.255.255.192 broadcast 123.123.123.127 dev eth0 label eth0
ip link set dev eth0 up
ip route add default via 123.123.123.122 dev eth0
run-parts /etc/network/if-up.d
这主要是我试图避免的问题。我的问题是如何检测/etc/network/interfaces
文件中的无效配置?加号是否表示有错误?这是什么意思?解决这个问题的最佳方法是什么?
简短回答:
ifup --no-act
使用网络配置调用以测试并检查返回码。长答案:我一直在为嵌入式设备做一些非常相似的事情;这是我为此目的创建的 init 脚本的相关部分,它在
networking
启动之前执行,因此可以确保系统具有有效的以太网设置。在原始
/etc/network/interfaces
版本中,有效设置包含在我想我在这里看到两个问题/方法:
对于第一个,通过一些智能工具进行所有配置,该工具比
$EDITOR /etc/foobar
. 在这种情况下,它可以检查 IP 地址是否有效,以及默认路由是否在同一个网络中等。该工具可以是一些脚本,或基于图形/Web 的管理界面(就像您在 OpenWRT 等上使用的那样) .)另一件事是让用户在网络配置生效后验证网络配置,就像许多系统让用户验证显示设置(分辨率等)并在用户什么都不做时回退到最后的工作配置一样。
所以,像这样:
当用户想要应用新配置时,安排在 5 分钟左右 (
shutdown -r +5
) 后重新启动,然后加载新配置。现在,让用户检查他们是否仍然可以访问系统(包括打开新的 SSH 会话)。
如果可以,他们可以确认更改,取消重新启动并将新配置复制到启动配置。
如果他们在修改生效后无法访问系统,他们无法验证更改,并且重新启动将让他们重新开始(前提是启动配置很好,应该是这样,因为系统之前开始使用它。)
这个想法应该适用于网络接口配置、防火墙配置等的变化。但它确实要求配置是自包含的,这样你就不能在新配置只工作的情况下结束,因为以前有效的启动配置包含一些重要的规则)
(当然,实际重新启动系统并不是绝对必要的,只需重置配置即可。)
当然,这些都不能阻止 root 用户在腿上开枪,但至少你可以提供一些带有安全开关的工具。
通过控制台/串行端口等进行备份访问仍然是最好的。
在这种特殊情况下,如果您的用户习惯于编辑
/etc/network/interfaces
和运行ifup
,则您必须教他们摆脱它,这可能很难。或者您可以更改系统,以便实际配置确实位于其他位置,这样他们就不会让旧习惯引起问题。