我尝试在 Hetzner Cloud 上设置具有全盘加密的 Ubuntu。除了 initramfs 中的网络连接外,一切都正常工作。多亏了 UI 控制台,它才得以解锁,但我需要在 init 中使用 SSH(dropbear)。我成功地在其根服务器上使用了相同的配置,没有任何问题。
如果我设置 dropbear 通过 dhcp 获取 IP,结果总是NETWORK IS UNREACHABLE
。但它从 dhcp 服务器获取正确的参数。我询问了 Hetzner 支持。他们告诉我,他们认为 dhcp 客户端不支持 RFC 3442 无类静态路由选项,并建议添加带有 的静态路由ip r a 172.31.1.1 dev ens3
。就像这样问题我添加了路由,但总是出现相同的错误:NETWORK IS UNREACHABLE
。我尝试在不同的脚本中设置路由,但没有任何变化。我测试了 Ubuntu 16.04 和 18.04。
我很高兴听到关于此的任何建议。谢谢!
答案1
对于那些看到这个帖子的人来说:
至少在 Debian Stretch 中,一些更通用的配置(不会因软件包更新而中断)是可行的。我们只需使用 init-premount 中的脚本静态配置网络:
vi /etc/initramfs-tools/scripts/init-premount/静态路由
#!/bin/sh
# /etc/initramfs-tools/scripts/init-premount/static-routes
# to avoid race condition
# we have to wait until the automatic network configuration via dhcp
# is finished
sleep 15
ip a add 192.168.0.18/32 dev eth0
ip route add 192.168.178.1 dev eth0
ip route add default via 192.168.178.1 dev eth0
exit 0
chmod 755 /etc/initramfs-tools/scripts/init-premount/static-routes
答案2
遇到了同样的问题/与技术支持进行了小讨论,发现 initramfs 不可能仅在 Hetzner 云实例中失败。
但 Hetzner 支持人员反复声明他们的 DHCP 服务器仅符合RFC3442 它会向内部云网关宣布默认主机路由。因此,这肯定是 initramfs dhcp 客户端的问题,他们无法(不会?)尝试设置可能的 BootP 响应,例如使用正确的 IP=... 参数。
我建议更新他们的文档,但似乎“随意使用我们的 wiki 获取文档”...(营销;)...)答案这里则不正确:
Hetzner_OL 6个月前 [-]
感谢您对 Docker/dbaas 的建议。我已将其转交给我们的开发团队。我们通常不会在新产品和新功能准备就绪之前发布它们,但我们会在升级开发过程中继续发布有关升级的信息。
关于 DSGVO:您是否支持文件系统加密?->
Hetzner Cloud 服务器完全虚拟化。因此客户甚至可以 完全加密整个服务器。——Katie,Hetzner Online 市场营销
我尝试寻找该问题的问题/解决方案,但今天我找到的唯一匹配项就是你的问题;)
您引用的关于设置接口的答案部分正确。但从问题来看,并不清楚他是否还需要到网关的静态主机路由,因此答案中没有提到这一点。
我对该问题的快速解决方案是“动态地”手动修补所需的函数 - 您可以检查以下所有变量/run/net-ens3.conf
:
root@image-debian-jessie-94 ~ # diff -p /usr/share/initramfs-tools/scripts/functions{.orig,}
*** /usr/share/initramfs-tools/scripts/functions.orig 2018-07-31 12:46:40.911167456 +0200
--- /usr/share/initramfs-tools/scripts/functions 2018-07-31 12:50:30.736742035 +0200
*************** configure_networking()
*** 274,279 ****
--- 274,284 ----
# ipconfig should have quit after first response
. /run/net-*.conf
fi
+
+ # Hack for Hetzner vServer static route enhanced like shown partly in this answer:
+ # https://serverfault.com/questions/909040/static-route-in-initramfs
+ ip route add ${IPV4GATEWAY}/${IPV4NETMASK} dev ${DEVICE}
+ ip route add default via ${IPV4GATEWAY} dev ${DEVICE}
}
# Wait for queued kernel/udev events
经过测试,对我来说效果很好。我可以设置/快照最小的图像。
加密快照约为 18 GB,而未加密快照仅为 0.5 GB,但与改进的安全性相比,快照价格仍然不错(通常基于 Openstack 的系统可以/应该有一个可以透明地实现这一点的密钥管理器服务。;)
答案3
jajo 的回答一开始就很正确,但忽略了一些关键点。下面是我如何在 Ubuntu Bionic 上无需修补任何文件的情况下让它工作(这意味着,这种方法不容易被更新破坏):
initramfs-tools
脚本需要以一些挂接到其系统的样板文件开始;否则,脚本将在 initramfs 生成时运行,这不是我们想要的:#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /scripts/functions # Begin real processing below this line
在添加路由之前立即调用该
configure_networking
函数。这会导致默认网络配置首先发生,否则如果稍后运行该脚本,则会破坏该脚本创建的任何设置。该函数在中创建了一些文件/run/
,这使得第二次调用(来自 busybox-initramfs 钩子)不执行任何操作。configure_networking
添加静态路由,如 jajo 的回答中所述。如果您没有使用内核命令行参数等配置 IP 地址,那么也请在此处添加。
ip route add 1.2.3.4 dev ens3 ip route add default via 1.2.3.4 dev ens3 exit 0
正如 jojo 的回答一样,上述文件应该放在 中/etc/initramfs-tools/scripts/init-premount/static-routes
,并使其可执行。
还有一件值得注意的事情是 klibc 有最近实施支持 RFC3442(DHCP 中的无类静态路由);因此,如果您的服务提供商宣布其 DHCP 配置中需要这些路由,则您可能不需要最新的 Debian/Ubuntu 版本中的此脚本。
答案4
这是一个无需硬编码睡眠或接口名称的解决方案,只需要网关地址:
/etc/initramfs-tools/scripts/init-premount/defaultgw
:
#!/bin/sh
gw="10.255.255.255"
timeout=20
_ifname() {
ip -f inet -o a s scope global | while read _ ifname _; do
echo "$ifname"
break
done
}
i=0
while [ "$i" -lt "$timeout" ]; do
ifname=$(_ifname)
[ -n "${ifname}" ] && break
sleep 1
i=$(( i + 1 ))
done
ip route add "${gw}/32" dev "$ifname"
ip route add default via "$gw"
exit 0
假设 IP 地址是通过ip=
内核参数设置的,例如ip=dhcp
或ip=12.34.56.78:::0.0.0.0:hostname
。