我有一个基于 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
文件中的无效配置?加号是否表示有错误?这是什么意思?解决这个问题的最佳方法是什么?
答案1
简短回答:ifup --no-act
使用网络配置进行调用以测试并检查返回码。
长答案:我一直在为嵌入式设备做一些非常类似的事情;这是我为此目的创建的初始化脚本的相关部分,该部分在networking
启动之前执行,因此可以确保系统具有有效的以太网设置。
ETH0_CUSTOM=/var/myproject/etc/interfaces.eth0
result=1
if [ -f "${ETH0_CUSTOM}" ]; then
ifup -n -i "${ETH0_CUSTOM}" eth0
if [ $? -eq 0 ]; then
ln -sf "${ETH0_CUSTOM}" /etc/network/interfaces.eth0
result=0
else
echo "Validating ${ETH0_CUSTOM} failed"
fi
fi
if [ ${result} -ne 0 ]; then
ln -sf /etc/network/interfaces.eth0.default /etc/network/interfaces.eth0
fi
在原始版本中,/etc/network/interfaces
有效设置包含在
source /etc/network/interfaces.eth0
答案2
我想我在这里看到两个问题/方法:
- 保护用户不犯错误;和
- 有办法在将修改后的配置永久化之前对其进行测试
对于第一个,通过一些智能工具进行所有配置,该工具比$EDITOR /etc/foobar
.在这种情况下,它可以检查 IP 地址是否有效,以及默认路由是否在同一网络中等。该工具可以是一些脚本,或基于图形/基于 Web 的管理界面(如 OpenWRT 等) .)
另一件事是让用户在网络配置生效后验证网络配置,就像许多系统让用户验证显示设置(分辨率等)并在用户什么都不做时回退到最后的工作配置。
所以,像这样:
- 将启动配置与新配置分开,允许用户更改新的仅配置(不是启动配置!)。
当用户想要应用新配置时,安排在 5 分钟左右进行重新启动 (
shutdown -r +5
),然后加载新配置。现在,让用户检查他们是否仍然可以访问系统(包括打开新的 SSH 会话)。
如果可以,他们可以确认更改,取消重启并将新配置复制到启动配置中。
如果修改生效后他们无法访问系统,则他们无法验证更改,并且重新启动将使他们重新开始(假设启动配置没问题,这应该是,因为系统之前开始使用它。)
这个想法应该适用于网络接口配置、防火墙配置等的更改。但它确实要求配置是独立的,这样你就不会因为之前有效的启动配置而导致新配置仅起作用的情况包含一些重要的规则)
(当然,并不是绝对需要实际重新启动系统,只需重置配置即可。)
当然,这些都不能阻止 root 用户向自己的腿开枪,但至少你可以提供一些带有安全开关的工具。
通过控制台/串行端口等进行备份访问仍然是最好的。
在这种特殊情况下,如果您的用户习惯于编辑/etc/network/interfaces
和运行ifup
,您就必须教他们摆脱它,这可能很困难。或者您可以更改系统,以便实际配置实际上在其他地方,这样就不会让旧习惯导致问题。